26 #ifndef MLN_TRAIT_FUNCTIONS_HH
27 # define MLN_TRAIT_FUNCTIONS_HH
29 # include <mln/metal/bexpr.hh>
30 # include <mln/metal/if.hh>
31 # include <mln/fun/param.hh>
32 # include <mln/trait/next/solve.hh>
34 # define mln_trait_fun_is_assignable(Fun) typename mln::trait::function::is_assignable< Fun >::ret
35 # define mln_trait_fun_is_assignable_(Fun) mln::trait::function::is_assignable< Fun >::ret
36 # define mln_trait_fun_is_assignable__1comma(A, B) typename mln::trait::function::is_assignable< A, B >::ret
37 # define mln_trait_fun_is_assignable__1comma_(A, B) mln::trait::function::is_assignable< A, B >::ret
39 # define mln_trait_fun_is_parametrable(Fun) typename mln::trait::function::is_parametrable< Fun >::ret
40 # define mln_trait_fun_is_parametrable_(Fun) mln::trait::function::is_parametrable< Fun >::ret
42 # define mln_trait_fun_lvalue(Fun) typename mln::trait::function::get_lvalue< Fun >::ret
43 # define mln_trait_fun_param(Fun) typename mln::trait::function::get_param< Fun >::ret
44 # define mln_trait_fun_storage(Fun) typename mln::trait::function::get_storage< Fun >::ret
68 struct except_void_t<void>;
72 template <
typename T,
typename V>
75 typedef metal::false_ ret;
80 struct has_lvalue_t<T, typename except_void_t<typename T::lvalue>::ret>
82 typedef metal::true_ ret;
83 typedef typename T::lvalue type;
87 template <
typename T,
typename V>
90 template <
typename T,
typename V>
91 struct param_flag_solver
93 typedef typename mln::fun::parameter<T> ret;
97 struct param_flag_solver<T, typename except_void_t<typename mln::fun::parameter<typename T::flag>::param>::ret>
99 typedef mln::fun::parameter<typename T::flag> ret;
102 template <
typename T,
typename V>
103 struct param_def_solver
105 typedef typename param_flag_solver<T, V>::ret ret;
108 template <
typename T>
109 struct param_def_solver<T, typename except_void_t<typename mln::fun::parameter<typename T::def>::param>::ret>
111 typedef mln::fun::parameter<typename T::def> ret;
114 template <
typename T,
typename V>
115 struct param_solver : param_def_solver<T, V>
119 template <
typename T>
120 struct param_solver<T, typename except_void_t<typename T::param>::ret>
125 template <
typename T,
typename V>
128 typedef metal::false_ ret;
132 template <
typename T>
133 struct has_param_t<T, typename except_void_t<typename param_solver<T,void>::ret::param>::ret>
135 typedef metal::true_ ret;
136 typedef typename param_solver<T,void>::ret::param type;
139 template <
typename T,
typename V>
140 struct storage_solver;
142 template <
typename T,
typename V>
143 struct storage_flag_solver
145 typedef typename mln::fun::parameter<T> ret;
148 template <
typename T>
149 struct storage_flag_solver<T, typename except_void_t<typename mln::fun::parameter<typename T::flag>::storage>::ret>
151 typedef mln::fun::parameter<typename T::flag> ret;
154 template <
typename T,
typename V>
155 struct storage_def_solver
157 typedef typename storage_flag_solver<T, V>::ret ret;
160 template <
typename T>
161 struct storage_def_solver<T, typename except_void_t<typename mln::fun::parameter<typename T::def>::storage>::ret>
163 typedef mln::fun::parameter<typename T::def> ret;
166 template <
typename T,
typename V>
167 struct storage_solver : storage_def_solver<T, V>
171 template <
typename T>
172 struct storage_solver<T, typename except_void_t<typename T::storage>::ret>
177 template <
typename T,
typename V>
180 typedef has_param_t<T, V> has_param;
182 typedef metal::false_ ret;
183 typedef typename has_param::type type;
185 template <
typename U>
194 template <
typename T>
195 struct has_storage_t<T, typename except_void_t<typename param_solver<T,void>::ret::storage>::ret>
197 typedef metal::true_ ret;
198 typedef typename param_solver<T,void>::ret def;
200 typedef typename def::storage type;
202 template <
typename U>
206 return def::compute(p);
215 template <
typename F>
218 typedef typename internal::introspect::has_lvalue_t<F, void>::ret ret;
221 template <
typename F>
222 struct is_parametrable
224 typedef typename internal::introspect::has_param_t<F, void>::ret ret;
227 template <
typename F>
230 typedef typename internal::introspect::has_lvalue_t<F, void>::type ret;
233 template <
typename F>
236 typedef typename internal::introspect::has_param_t<F, void>::type ret;
239 template <
typename F>
242 typedef typename internal::introspect::has_storage_t<F, void>::type ret;
251 #endif // ! MLN_TRAIT_FUNCTIONS_HH