diff options
author | Ben Longbons <b.r.longbons@gmail.com> | 2014-07-23 23:55:41 -0700 |
---|---|---|
committer | Ben Longbons <b.r.longbons@gmail.com> | 2014-08-05 17:41:35 -0700 |
commit | a7f64f0b39cb7141f16608c171b20bee452fd024 (patch) | |
tree | 6ceb293db3488161d4d5a620536560506e63134f /src/sexpr | |
parent | 7abac74323e2566173ea586e9acadac1ebf59098 (diff) | |
download | tmwa-a7f64f0b39cb7141f16608c171b20bee452fd024.tar.gz tmwa-a7f64f0b39cb7141f16608c171b20bee452fd024.tar.bz2 tmwa-a7f64f0b39cb7141f16608c171b20bee452fd024.tar.xz tmwa-a7f64f0b39cb7141f16608c171b20bee452fd024.zip |
In magic, use Variant for all the old anonymous nested unions
Diffstat (limited to 'src/sexpr')
-rw-r--r-- | src/sexpr/variant.hpp | 9 | ||||
-rw-r--r-- | src/sexpr/variant.tcc | 18 |
2 files changed, 19 insertions, 8 deletions
diff --git a/src/sexpr/variant.hpp b/src/sexpr/variant.hpp index 50ee77f..fbf9345 100644 --- a/src/sexpr/variant.hpp +++ b/src/sexpr/variant.hpp @@ -41,10 +41,11 @@ namespace sexpr #define MATCH(expr) \ WITH_VAR(auto&&, _match_var, expr) \ switch (tmwa::sexpr::VariantFriend::get_state(_match_var)) -#define CASE(ty, var) \ - break; \ - case tmwa::sexpr::VariantFriend::get_state_for<ty, decltype(_match_var)>(): \ - WITH_VAR(ty, var, tmwa::sexpr::VariantFriend::unchecked_get<ty>(_match_var)) +#define TYPED_CASE(ty, var, look) \ + break; \ + case tmwa::sexpr::VariantFriend::get_state_for<look, decltype(_match_var)>(): \ + WITH_VAR(ty, var, tmwa::sexpr::VariantFriend::unchecked_get<look>(_match_var)) +#define CASE(ty, var) TYPED_CASE(ty, var, std::remove_const<std::remove_reference<ty>::type>::type) template<class... T> class Variant diff --git a/src/sexpr/variant.tcc b/src/sexpr/variant.tcc index 424a8f1..ce820bf 100644 --- a/src/sexpr/variant.tcc +++ b/src/sexpr/variant.tcc @@ -24,6 +24,16 @@ namespace tmwa { namespace sexpr { + template<size_t v> + constexpr + size_t not_negative_one() + { + return v; + } + template<> + constexpr + size_t not_negative_one<-1>() = delete; + class VariantFriend { public: @@ -77,7 +87,7 @@ namespace sexpr template<class W, class V> constexpr static size_t get_state_for() { - return std::remove_reference<V>::type::DataType::template index<W>(); + return not_negative_one<std::remove_reference<V>::type::DataType::template index<W>()>(); } }; @@ -104,7 +114,7 @@ namespace sexpr try { data.template construct<C, A...>(std::forward<A>(a)...); - state = Union<D, T...>::template index<C>(); + state = not_negative_one<Union<D, T...>::template index<C>()>(); } catch(...) { @@ -244,7 +254,7 @@ namespace sexpr template<class E> E *Variant<D, T...>::get_if() { - if (state == Union<D, T...>::template index<E>()) + if (state == not_negative_one<Union<D, T...>::template index<E>()>()) return data.template get<E>(); return nullptr; } @@ -253,7 +263,7 @@ namespace sexpr template<class E> const E *Variant<D, T...>::get_if() const { - if (state == Union<D, T...>::template index<E>()) + if (state == not_negative_one<Union<D, T...>::template index<E>()>()) return data.template get<E>(); return nullptr; } |