27 #ifndef MLN_FUN_SPE_UNARY_HH
28 # define MLN_FUN_SPE_UNARY_HH
30 # include <mln/core/concept/function.hh>
31 # include <mln/trait/next/solve.hh>
32 # include <mln/trait/functions.hh>
44 template <
typename Fun,
typename T>
47 typedef typename Fun::result result;
48 typedef typename Fun::argument argument;
49 typedef typename Fun::lvalue lvalue;
50 typedef lwrapper lresult;
52 lwrapper(
const Fun& f, T& x)
57 result to_result()
const
59 return (*f_)(*
const_cast<const T*
>(x_));
62 operator result()
const
67 const result& operator = (
const result& r)
const
81 template <
typename Fun>
82 struct lwrapper<Fun, typename Fun::argument>
84 typedef typename Fun::result result;
85 typedef typename Fun::argument argument;
86 typedef typename Fun::lvalue lvalue;
87 typedef lwrapper lresult;
89 lwrapper(
const Fun& f, argument& x)
94 result to_result()
const
96 return (*f_)(*
const_cast<const argument*
>(x_));
99 operator result()
const
104 const result& operator = (
const result& r)
const
116 template <
typename Fun,
typename Any,
typename T>
117 struct lwrapper<Fun, lwrapper<Any, T> >
119 typedef typename Fun::result result;
120 typedef typename Fun::argument argument;
121 typedef typename Fun::lvalue lvalue;
122 typedef lwrapper lresult;
124 lwrapper(
const Fun& f,
const lwrapper<Any, T>& m)
129 result to_result()
const
131 return (*f_)(m_.to_result());
134 operator result()
const
139 const result& operator = (
const result& r)
const
149 const lwrapper<Any, T> m_;
153 template <
typename Fun,
typename T>
159 template <
bool param,
bool set,
typename Fun,
typename T>
162 template <
typename Fun,
typename T>
163 struct unary_impl<false, false, Fun, T> : Function_v2v< unary<Fun, T> >
166 typedef mln_trait_nunary(Fun, T) def;
168 typedef typename def::argument argument;
169 typedef typename def::result result;
171 result operator () (const argument& value)
const
173 return def::read(value);
176 template <
typename U>
177 void init(
const U& value)
184 template <
typename Fun,
typename T>
185 struct unary_impl<false, true, Fun, T> : unary_impl<false, false, Fun, T>
187 typedef unary_impl<false, false, Fun, T> super;
188 typedef typename super::def::lvalue lvalue;
190 template <
typename U>
193 typedef mln::fun::spe::lwrapper< unary<Fun, T>, U> ret;
196 typedef typename lresult_with<typename super::argument>::ret lresult;
198 void set(lvalue l,
const typename super::result& r)
const
200 super::def::write(l, r);
203 using super::operator ();
205 lresult apply_rw(
typename super::argument& value)
const
207 return lresult(exact(*
this), value);
210 template <
typename U>
211 typename lresult_with<U>::ret apply_rw(U& value)
const
213 return typename lresult_with<U>::ret(exact(*
this), value);
216 lresult operator () (
typename super::argument& value)
const
218 return apply_rw(value);
222 template <
typename Fun,
typename T>
223 struct unary_impl<true, false, Fun, T> : Function_v2v< unary<Fun, T> >
226 typedef mln_trait_nunary(Fun, T) def;
228 typedef typename def::argument argument;
229 typedef typename def::result result;
231 typedef mln_trait_fun_param(unary_impl) param;
232 typedef mln_trait_fun_storage(unary_impl) storage;
234 result operator () (const argument& value)
const
236 return def::read(this->state_, value);
239 template <
typename U>
240 void init(
const U& value)
242 state_ = mln::trait::function::internal::introspect::has_storage_t<def, void>::compute(value);
245 stored<storage>& state()
250 const stored<storage>& state()
const
256 stored<storage> state_;
259 template <
typename Fun,
typename T>
260 struct unary_impl<true, true, Fun, T> : unary_impl<true, false, Fun, T>
262 typedef unary_impl<true, false, Fun, T> super;
263 typedef typename super::def::lvalue lvalue;
265 template <
typename U>
268 typedef mln::fun::spe::lwrapper< unary<Fun, T>, U> ret;
271 typedef typename lresult_with<typename super::argument>::ret lresult;
273 void set(lvalue l,
const typename super::result& r)
const
275 super::def::write(this->state(), l, r);
278 using super::operator ();
280 lresult apply_rw(
typename super::argument& value)
const
282 return lresult(exact(*
this), value);
285 template <
typename U>
286 typename lresult_with<U>::ret apply_rw(U& value)
const
288 return typename lresult_with<U>::ret(exact(*
this), value);
291 lresult operator () (
typename super::argument& value)
const
293 return apply_rw(value);
299 template <
typename Fun,
typename T>
301 : impl::unary_impl<mlc_or(mln_trait_fun_is_parametrable(mln_trait_nunary(Fun, T)), mln_trait_fun_is_parametrable(Fun))::value,
302 mln_trait_fun_is_assignable_(mln_trait_nunary(Fun, T))::value, Fun, T>
304 typedef mln_trait_nunary(Fun, T) def;
305 typedef impl::unary_impl<mlc_or(mln_trait_fun_is_parametrable(def), mln_trait_fun_is_parametrable(Fun))::value,
306 mln_trait_fun_is_assignable_(def)::value,
313 template <
typename U>
314 unary(
const U& param)
319 using super::operator();
328 template <
typename F,
typename T>
329 std::ostream& operator << (std::ostream& o, const mln::fun::spe::lwrapper<F, T>& m)
331 return o << m.to_result();
334 #endif // ! MLN_FUN_SPE_UNARY_HH