summaryrefslogtreecommitdiff
path: root/fusion_static_dispatch.hpp
diff options
context:
space:
mode:
authorDennis Brentjes <d.brentjes@gmail.com>2014-05-25 11:16:36 +0200
committerDennis Brentjes <d.brentjes@gmail.com>2014-05-25 11:16:36 +0200
commit84c15aecc7d296d25b7fd5ead6730f8d132d350f (patch)
treee5e435007c97105ad819f0df84da3027d2e82d9d /fusion_static_dispatch.hpp
parentd4ea872acfee5d4bf563334181400a9fef7d5add (diff)
downloadgeneric-gui-84c15aecc7d296d25b7fd5ead6730f8d132d350f.tar.gz
generic-gui-84c15aecc7d296d25b7fd5ead6730f8d132d350f.tar.bz2
generic-gui-84c15aecc7d296d25b7fd5ead6730f8d132d350f.zip
Adds a initial implementation of a Form, as a proof-of-concept.
Diffstat (limited to 'fusion_static_dispatch.hpp')
-rw-r--r--fusion_static_dispatch.hpp23
1 files changed, 8 insertions, 15 deletions
diff --git a/fusion_static_dispatch.hpp b/fusion_static_dispatch.hpp
index 6b3ad42..5db3e16 100644
--- a/fusion_static_dispatch.hpp
+++ b/fusion_static_dispatch.hpp
@@ -19,7 +19,7 @@ typename F<U>::return_type apply_functor_to_member_impl(indices<Indices...>, int
{
typedef std::function<typename F<U>::return_type(Args...)> f_type;
static f_type array[] = {
- (std::function<typename F<U>::return_type(Args...)>) F<U>::template call<Indices>
+ F<U>::template call<Indices>
...
};
@@ -31,7 +31,7 @@ typename F<Arg1>::return_type apply_functor_to_member_impl(indices<Indices...>,
{
typedef std::function<typename F<Arg1>::return_type(Arg1&, Args...)> f_type;
static f_type array[] = {
- (std::function<typename F<Arg1>::return_type(Arg1&, Args...)>) F<Arg1>::template call<Indices>
+ F<Arg1>::template call<Indices>
...
};
@@ -58,12 +58,9 @@ struct is_const_functor
template <int I>
static return_type call()
{
- typedef friendly_fusion::result_of::begin<T> begin;
- typedef friendly_fusion::result_of::advance_c<typename begin::type, I> adv_it;
- typedef friendly_fusion::result_of::deref<typename adv_it::type> deref;
- typedef std::remove_reference<typename deref::type> unreferenced_type;
+ typedef typename friendly_fusion::utils::UnrefTypeOfAtIndex<T, I>::type unref_type;
- return std::is_const<typename unreferenced_type::type>::value;
+ return std::is_const<unref_type>::value;
}
};
@@ -105,7 +102,6 @@ typename std::enable_if<!b, void>::type assign(T& lh, V rh)
lh = rh;
}
-
template <typename T>
struct set_nth_functor
{
@@ -114,13 +110,10 @@ struct set_nth_functor
template <int I>
static return_type call(T& t, boost::any const& value)
{
- typedef friendly_fusion::result_of::begin<T> begin;
- typedef friendly_fusion::result_of::advance_c<typename begin::type, I> adv_it;
- typedef friendly_fusion::result_of::deref<typename adv_it::type> deref;
- typedef typename std::decay<typename deref::type>::type value_type;
- typedef typename std::remove_reference<typename deref::type>::type unreferenced_type;
+ typedef typename friendly_fusion::utils::DecayedTypeOfAtIndex<T, I>::type value_type;
+ typedef typename friendly_fusion::utils::UnrefTypeOfAtIndex<T, I>::type unref_type;
- assign<std::is_const<unreferenced_type>::value>(friendly_fusion::deref(friendly_fusion::advance_c<I>(friendly_fusion::begin(t))), boost::any_cast<value_type>(value));
+ assign<std::is_const<unref_type>::value>(friendly_fusion::deref(friendly_fusion::advance_c<I>(friendly_fusion::begin(t))), boost::any_cast<value_type>(value));
}
};
@@ -154,7 +147,7 @@ struct get_nth_name_functor<boost::fusion::joint_view<T,U>>
if(I < size_of_T){
return apply_functor_to_member<T, get_nth_name_functor>(I);
} else {
- return apply_functor_to_member<U, get_nth_name_functor>(I);
+ return apply_functor_to_member<U, get_nth_name_functor>(I - size_of_T);
}
}
};