felipealmeida pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=dbed78ad3ba9f247e64966a8dda6491a781bd240
commit dbed78ad3ba9f247e64966a8dda6491a781bd240 Author: Felipe Magno de Almeida <[email protected]> Date: Mon Aug 15 14:47:00 2016 -0300 eina-cxx: Moved variant to eina C++ --- src/bin/eolian_cxx/eolian_cxx.cc | 4 +- src/bindings/cxx/eina_cxx/Eina.hh | 1 + .../cxx/eina_cxx/eina_variant.hh} | 52 +++++++++++++++------- src/lib/eolian_cxx/grammar/alternative.hpp | 3 +- src/lib/eolian_cxx/grammar/klass_def.hpp | 3 +- src/lib/eolian_cxx/grammar/type_impl.hpp | 2 +- 6 files changed, 42 insertions(+), 23 deletions(-) diff --git a/src/bin/eolian_cxx/eolian_cxx.cc b/src/bin/eolian_cxx/eolian_cxx.cc index 8530df2..37d24bc 100644 --- a/src/bin/eolian_cxx/eolian_cxx.cc +++ b/src/bin/eolian_cxx/eolian_cxx.cc @@ -94,11 +94,11 @@ generate(const Eolian_Class* klass, eolian_cxx::options_type const& opts) variant_function = [&] (efl::eolian::grammar::attributes::type_def const& type) { if(efl::eolian::grammar::attributes::klass_name const* - name = efl::eolian::grammar::attributes::get<efl::eolian::grammar::attributes::klass_name> + name = efl::eina::get<efl::eolian::grammar::attributes::klass_name> (&type.original_type)) klass_name_function(*name); else if(efl::eolian::grammar::attributes::complex_type_def const* - complex = efl::eolian::grammar::attributes::get<efl::eolian::grammar::attributes::complex_type_def> + complex = efl::eina::get<efl::eolian::grammar::attributes::complex_type_def> (&type.original_type)) complex_function(*complex); }; diff --git a/src/bindings/cxx/eina_cxx/Eina.hh b/src/bindings/cxx/eina_cxx/Eina.hh index f613415..de2f374 100644 --- a/src/bindings/cxx/eina_cxx/Eina.hh +++ b/src/bindings/cxx/eina_cxx/Eina.hh @@ -27,6 +27,7 @@ #include <eina_future.hh> #include <eina_deleter.hh> #include <eina_copy_traits.hh> +#include <eina_variant.hh> /** * @page eina_cxx_main Eina C++ (BETA) diff --git a/src/lib/eolian_cxx/grammar/variant.hpp b/src/bindings/cxx/eina_cxx/eina_variant.hh similarity index 83% rename from src/lib/eolian_cxx/grammar/variant.hpp rename to src/bindings/cxx/eina_cxx/eina_variant.hh index 195c0a4..6bdd1a9 100644 --- a/src/lib/eolian_cxx/grammar/variant.hpp +++ b/src/bindings/cxx/eina_cxx/eina_variant.hh @@ -1,5 +1,5 @@ -#ifndef EOLIAN_CXX_VARIANT_HH_ -#define EOLIAN_CXX_VARIANT_HH_ +#ifndef EINA_VARIANT_HH_ +#define EINA_VARIANT_HH_ #include <cstddef> #include <algorithm> @@ -7,10 +7,34 @@ #include <type_traits> #include <tuple> -#include "grammar/meta.hpp" +namespace efl { namespace eina { -namespace efl { namespace eolian { namespace grammar { namespace attributes { +namespace _impl { +template <typename T, typename U, typename...Others> +struct is_one_of : std::conditional<std::is_same<T, U>::value + , std::is_same<T, U> + , is_one_of<T, Others...> >::type::type +{}; + +template <typename T, typename U> +struct is_one_of<T, U> : std::is_same<T, U> +{}; + + +template <std::size_t size, typename T, typename U, typename...Args> +struct find_impl : find_impl<size+1, T, Args...> +{}; + +template <std::size_t size, typename T, typename...Args> +struct find_impl<size, T, T, Args...> : std::integral_constant<std::size_t, size> {}; + +template <typename T, typename U, typename...Args> +struct find : find_impl<0u, T, U, Args...> +{}; + +} + template <std::size_t N, std::size_t L, typename Tuple> struct call_visitor { @@ -133,9 +157,9 @@ struct variant template <typename T> variant(T object, - typename std::enable_if<meta::is_one_of + typename std::enable_if<_impl::is_one_of <typename std::remove_cv<typename std::remove_reference<T>::type>::type, Args...>::value>::type* = 0) - : type(meta::find<typename std::remove_cv<typename std::remove_reference<T>::type>::type, Args...>::value) + : type(_impl::find<typename std::remove_cv<typename std::remove_reference<T>::type>::type, Args...>::value) { construct(object); } @@ -212,11 +236,7 @@ private: new (&buffer) T(std::move(object)); } - typedef typename std::aligned_storage - < - meta::max<sizeof(Args)...>::value - , meta::max<std::alignment_of<Args>::value...>::value - >::type buffer_type; + typedef typename std::aligned_union<1, Args...>::type buffer_type; friend bool operator==(variant<Args...> const& lhs, variant<Args...> const& rhs) { @@ -239,19 +259,19 @@ inline bool operator!=(variant<Args...>const& lhs, variant<Args...> const& rhs) } template <typename T, typename...Args> -T* get(variant<Args...>* variant, typename std::enable_if<meta::is_one_of +T* get(variant<Args...>* variant, typename std::enable_if<_impl::is_one_of <typename std::remove_cv<typename std::remove_reference<T>::type>::type, Args...>::value>::type* = 0) { return variant->visit(get_visitor<T>{}); } template <typename T, typename...Args> -T const* get(variant<Args...>const* variant, typename std::enable_if<meta::is_one_of +T const* get(variant<Args...>const* variant, typename std::enable_if<_impl::is_one_of <typename std::remove_cv<typename std::remove_reference<T>::type>::type, Args...>::value>::type* = 0) { return variant->visit(get_visitor<T const>{}); } template <typename T, typename...Args> -T& get(variant<Args...>& variant, typename std::enable_if<meta::is_one_of +T& get(variant<Args...>& variant, typename std::enable_if<_impl::is_one_of <typename std::remove_cv<typename std::remove_reference<T>::type>::type, Args...>::value>::type* = 0) { T* p = variant.visit(get_visitor<T>{}); @@ -261,7 +281,7 @@ T& get(variant<Args...>& variant, typename std::enable_if<meta::is_one_of throw std::logic_error(""); } template <typename T, typename...Args> -T const& get(variant<Args...>const& variant, typename std::enable_if<meta::is_one_of +T const& get(variant<Args...>const& variant, typename std::enable_if<_impl::is_one_of <typename std::remove_cv<typename std::remove_reference<T>::type>::type, Args...>::value>::type* = 0) { T const* p = variant.visit(get_visitor<T const>{}); @@ -271,6 +291,6 @@ T const& get(variant<Args...>const& variant, typename std::enable_if<meta::is_on throw std::logic_error(""); } -} } } } +} } #endif diff --git a/src/lib/eolian_cxx/grammar/alternative.hpp b/src/lib/eolian_cxx/grammar/alternative.hpp index 2d70052..3ad3e6a 100644 --- a/src/lib/eolian_cxx/grammar/alternative.hpp +++ b/src/lib/eolian_cxx/grammar/alternative.hpp @@ -3,7 +3,6 @@ #include "grammar/generator.hpp" #include "grammar/meta.hpp" -#include "grammar/variant.hpp" namespace efl { namespace eolian { namespace grammar { @@ -11,7 +10,7 @@ template <typename L, typename R> struct alternative_generator { template <typename OutputIterator, typename...Args, typename Context> - bool generate(OutputIterator /*sink*/, attributes::variant<Args...> const& /*attribute*/, Context const& /*context*/) const + bool generate(OutputIterator /*sink*/, eina::variant<Args...> const& /*attribute*/, Context const& /*context*/) const { // return grammar::alternative_sequence(left, right, sink, attribute); return false; diff --git a/src/lib/eolian_cxx/grammar/klass_def.hpp b/src/lib/eolian_cxx/grammar/klass_def.hpp index cafb56d..d2f39d3 100644 --- a/src/lib/eolian_cxx/grammar/klass_def.hpp +++ b/src/lib/eolian_cxx/grammar/klass_def.hpp @@ -2,7 +2,6 @@ #define EOLIAN_CXX_KLASS_DEF_HH #include "grammar/type_traits.hpp" -#include "grammar/variant.hpp" #include "grammar/attributes.hpp" #include "grammar/qualifier_def.hpp" #include "grammar/string.hpp" @@ -201,7 +200,7 @@ inline bool operator!=(complex_type_def const& lhs, complex_type_def const& rhs) struct type_def { - typedef attributes::variant<klass_name, regular_type_def, complex_type_def> variant_type; + typedef eina::variant<klass_name, regular_type_def, complex_type_def> variant_type; variant_type original_type; std::string c_type; diff --git a/src/lib/eolian_cxx/grammar/type_impl.hpp b/src/lib/eolian_cxx/grammar/type_impl.hpp index ac1118f..5a5049c 100644 --- a/src/lib/eolian_cxx/grammar/type_impl.hpp +++ b/src/lib/eolian_cxx/grammar/type_impl.hpp @@ -305,7 +305,7 @@ struct visitor_generate if(v.empty()) return true; else if(attributes::complex_type_def const* complex - = attributes::get<attributes::complex_type_def>(&v)) + = eina::get<attributes::complex_type_def>(&v)) return default_match(*complex); else return v.visit(*this); --
