27 #ifndef MLN_VALUE_OPS_HH
28 # define MLN_VALUE_OPS_HH
34 # include <mln/trait/op/all.hh>
35 # include <mln/value/builtin/all.hh>
36 # include <mln/value/concept/all.hh>
37 # include <mln/value/equiv.hh>
38 # include <mln/trait/value_.hh>
39 # include <mln/literal/zero.hh>
40 # include <mln/literal/one.hh>
41 # include <mln/literal/ops.hh>
42 # include <mln/metal/ret.hh>
46 # define mln_trait_value_sum_product(T, U) \
47 typename mln::trait::value_< mln_trait_op_times(T,U) >::sum
48 # define mln_trait_value_sum_product_(T, U) \
49 mln::trait::value_< mln_trait_op_times_(T,U) >::sum
53 # define mln_sum_product(T, U) mln_trait_value_sum_product(T, U)
54 # define mln_sum_product_(T, U) mln_trait_value_sum_product_(T, U)
69 template <
template <
class>
class Name,
71 struct set_unary_< Name, mln::value::Scalar, V >
73 typedef mln_trait_unary(Name, mln_value_equiv(V))
ret;
79 template < template <class, class> class Name,
80 typename Vl, typename Vr >
81 struct set_binary_< Name, mln::
value::Scalar, Vl, mln::
value::Scalar, Vr >
83 typedef mln_trait_binary(Name, mln_value_equiv(Vl), mln_value_equiv(Vr)) ret;
88 template < template <class, class> class Name,
89 typename Sl, typename Sr >
90 struct set_binary_< Name,
94 typedef mln_trait_binary(Name, mln_value_equiv(Sl), mln_value_equiv(Sr)) ret;
98 template < template <class, class> class Name,
99 typename S, typename L >
100 struct set_binary_< Name,
101 mln::
value::Scalar, S,
104 typedef mln_value_equiv(S) S_;
105 typedef mln_trait_binary(Name, S_, S_) ret;
108 template < template <class, class> class Name,
109 typename L, typename S >
110 struct set_binary_< Name,
112 mln::
value::Scalar, S >
114 typedef mln_value_equiv(S) S_;
115 typedef mln_trait_binary(Name, S_, S_) ret;
121 template < typename S, typename O >
122 struct set_binary_< op::
plus,
129 template < typename S, typename O >
130 struct set_binary_< op::times,
142 template <typename Vl, typename Vr>
143 mln_trait_op_plus(Vl, Vr)
144 operator + (const
value::Scalar<Vl>& lhs, const
value::Scalar<Vr>&
rhs);
146 template <typename Vl, typename Vr>
147 mln_trait_op_minus(Vl, Vr)
148 operator - (const
value::Scalar<Vl>& lhs, const
value::Scalar<Vr>& rhs);
150 template <typename Vl, typename Vr>
151 mln_trait_op_times(Vl, Vr)
152 operator * (const
value::Scalar<Vl>& lhs, const
value::Scalar<Vr>& rhs);
154 template <typename Vl, typename Vr>
155 mln_trait_op_div(Vl, Vr)
156 operator / (const
value::Scalar<Vl>& lhs, const
value::Scalar<Vr>& rhs);
158 template <typename Vl, typename Vr>
159 mln_trait_op_mod(Vl, Vr)
160 operator % (const
value::Scalar<Vl>& lhs, const
value::Scalar<Vr>& rhs);
167 template <typename S, typename O>
168 mln_trait_op_plus(O,
value::scalar_<S>)
169 operator + (const
value::scalar_<S>& lhs, const Object<O>& rhs);
171 template <typename S, typename O>
172 mln_trait_op_times(O,
value::scalar_<S>)
173 operator * (const
value::scalar_<S>& lhs, const Object<O>& rhs);
178 template <typename S>
179 mln_trait_op_uminus(S)
180 operator - (const
value::scalar_<S>& rhs);
193 template <typename Sl, typename Sr>
194 mln_trait_op_plus(Sl, Sr)
195 operator + (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs);
197 template <typename Sl, typename Sr>
198 mln_trait_op_minus(Sl, Sr)
199 operator - (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs);
201 template <typename Sl, typename Sr>
202 mln_trait_op_times(Sl, Sr)
203 operator * (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs);
205 template <typename Sl, typename Sr>
206 mln_trait_op_div(Sl, Sr)
207 operator / (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs);
209 template <typename Sl, typename Sr>
210 mln_trait_op_mod(Sl, Sr)
211 operator % (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs);
216 template <typename Sl, typename Sr>
218 operator == (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs);
221 operator == (const
value::scalar_<
int>& lhs, const
value::scalar_<
unsigned>& rhs);
224 operator == (const
value::scalar_<
unsigned>& lhs, const
value::scalar_<
int>& rhs);
226 template <typename O, typename L>
228 operator==(const
value::scalar_<O>& lhs, const Literal<L>& rhs);
230 template <typename L, typename O>
232 operator==(const Literal<L>& lhs, const
value::scalar_<O>& rhs);
237 template <typename Sl, typename Sr>
238 mln_trait_op_less(Sl, Sr)
239 operator < (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs);
241 template <typename O, typename L>
242 mln_trait_op_less(O, O)
243 operator < (const
value::scalar_<O>& lhs, const Literal<L>& rhs);
245 template <typename L, typename O>
246 mln_trait_op_less(O, O)
247 operator < (const Literal<L>& lhs, const
value::scalar_<O>& rhs);
251 # ifndef MLN_INCLUDE_ONLY
253 template <
typename Vl,
typename Vr>
255 mln_trait_op_plus(Vl, Vr)
256 operator + (const
value::Scalar<Vl>& lhs, const
value::Scalar<Vr>& rhs)
258 typedef mln_trait_op_plus(Vl, Vr) R;
259 return static_cast<R>(
value::equiv(lhs)) + static_cast<R>(
value::equiv(rhs));
262 template <typename Vl, typename Vr>
264 mln_trait_op_minus(Vl, Vr)
265 operator - (const
value::Scalar<Vl>& lhs, const
value::Scalar<Vr>& rhs)
267 typedef mln_trait_op_minus(Vl, Vr) R;
268 return static_cast<R>(
value::equiv(lhs)) - static_cast<R>(
value::equiv(rhs));
271 template <typename Vl, typename Vr>
273 mln_trait_op_times(Vl, Vr)
274 operator * (const
value::Scalar<Vl>& lhs, const
value::Scalar<Vr>& rhs)
276 typedef mln_trait_op_times(Vl, Vr) R;
277 return static_cast<R>(
value::equiv(lhs)) * static_cast<R>(
value::equiv(rhs));
280 template <typename Vl, typename Vr>
282 mln_trait_op_div(Vl, Vr)
283 operator / (const
value::Scalar<Vl>& lhs, const
value::Scalar<Vr>& rhs)
285 typedef mln_trait_op_div(Vl, Vr) R;
286 return static_cast<R>(
value::equiv(lhs)) / static_cast<R>(
value::equiv(rhs));
289 template <typename Vl, typename Vr>
291 mln_trait_op_mod(Vl, Vr)
292 operator % (const
value::Scalar<Vl>& lhs, const
value::Scalar<Vr>& rhs)
297 template <
typename S>
299 mln_trait_op_uminus(S)
300 operator - (const
value::scalar_<S>& rhs)
302 typedef mln_trait_op_uminus(S) R;
303 return static_cast<R>(- rhs.to_equiv());
306 template <typename S, typename O>
308 mln_trait_op_plus(O,
value::scalar_<S>)
309 operator + (const
value::scalar_<S>& lhs, const Object<O>& rhs)
311 return exact(rhs) + lhs;
314 template <
typename S,
typename O>
316 mln_trait_op_times(O, value::scalar_<S>)
317 operator * (const
value::scalar_<S>& lhs, const Object<O>& rhs)
319 return exact(rhs) * lhs;
327 template <
typename Sl,
typename Sr>
329 mln_trait_op_plus(Sl, Sr)
330 operator + (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs)
335 template <
typename Sl,
typename Sr>
337 mln_trait_op_minus(Sl, Sr)
338 operator - (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs)
343 template <
typename Sl,
typename Sr>
345 mln_trait_op_times(Sl, Sr)
346 operator * (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs)
351 template <
typename Sl,
typename Sr>
353 mln_trait_op_div(Sl, Sr)
354 operator / (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs)
359 template <
typename Sl,
typename Sr>
361 mln_trait_op_mod(Sl, Sr)
362 operator % (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs)
370 template <
typename Sl,
typename Sr>
373 operator == (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs)
380 operator == (
const value::scalar_<int>& lhs,
const value::scalar_<unsigned>& rhs)
382 return lhs.to_equiv() ==
int(rhs.to_equiv());
387 operator == (
const value::scalar_<unsigned>& lhs,
const value::scalar_<int>& rhs)
389 return int(lhs.to_equiv()) == rhs.to_equiv();
392 template <
typename O,
typename L>
395 operator==(const
value::scalar_<O>& lhs, const Literal<L>& rhs)
397 return exact(lhs) == mln_value_equiv(O)(
exact(rhs));
400 template <
typename L,
typename O>
403 operator==(const Literal<L>& lhs, const
value::scalar_<O>& rhs)
405 return mln_value_equiv(O)(
exact(lhs)) ==
exact(rhs);
411 template <
typename Sl,
typename Sr>
413 mln_trait_op_less(Sl, Sr)
414 operator < (const
value::scalar_<Sl>& lhs, const
value::scalar_<Sr>& rhs)
419 template <
typename O,
typename L>
421 mln_trait_op_less(O, O)
422 operator < (const
value::scalar_<O>& lhs, const Literal<L>& rhs)
424 return exact(lhs) < mln_value_equiv(O)(
exact(rhs));
427 template <
typename L,
typename O>
429 mln_trait_op_less(O, O)
430 operator < (const Literal<L>& lhs, const
value::scalar_<O>& rhs)
432 return mln_value_equiv(O)(
exact(lhs)) <
exact(rhs);
435 # endif // ! MLN_INCLUDE_ONLY
440 #endif // ! MLN_VALUE_OPS_HH