26 #ifndef MLN_VALUE_BUILTIN_OPS_HH
27 # define MLN_VALUE_BUILTIN_OPS_HH
34 # include <mln/value/scalar.hh>
35 # include <mln/trait/op/all.hh>
36 # include <mln/value/builtin/promotions.hh>
57 # define mln_internal_decl_op_obj_bi_(Symb, Name, Builtin) \
59 template <typename O> \
60 mln_trait_op_##Name (O, value::scalar_< Builtin >) \
61 operator Symb (const Object<O>& lhs, const Builtin & rhs); \
63 template <typename O> \
65 operator Symb##= (Object<O>& lhs, const Builtin & rhs); \
67 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
70 # define mln_internal_def_op_obj_bi_(Symb, Name, Builtin) \
72 template <typename O> \
73 mln_trait_op_##Name (O, value::scalar_< Builtin >) \
74 operator Symb (const Object<O>& lhs, const Builtin & rhs) \
76 return exact(lhs) Symb value::scalar(rhs); \
79 template <typename O> \
81 operator Symb##= (Object<O>& lhs, const Builtin & rhs) \
83 return exact(lhs) Symb##= value::scalar(rhs); \
86 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
91 # define mln_internal_decl_bi_op_obj_(Symb, Name, Builtin) \
93 template <typename O> \
94 mln_trait_op_##Name (O, value::scalar_< Builtin >) \
95 operator Symb (const Builtin & lhs, const Object<O>& rhs); \
97 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
99 # define mln_internal_def_bi_op_obj_(Symb, Name, Builtin) \
101 template <typename O> \
102 mln_trait_op_##Name (O, value::scalar_< Builtin >) \
103 operator Symb (const Builtin & lhs, const Object<O>& rhs) \
105 return exact(rhs) Symb value::scalar(lhs); \
108 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
114 # define mln_internal_decl_op_cmp_(Symb, Name, Builtin) \
116 template <typename O> \
117 mln_trait_op_##Name (O, value::scalar_< Builtin >) \
118 operator Symb (const Object<O>& lhs, const Builtin & rhs); \
120 template <typename O> \
121 mln_trait_op_##Name (O, value::scalar_< Builtin >) \
122 operator Symb (const Builtin & lhs, const Object<O>& rhs); \
124 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
126 # define mln_internal_def_op_cmp_(Symb, Name, Builtin) \
128 template <typename O> \
129 mln_trait_op_##Name (O, value::scalar_< Builtin >) \
130 operator Symb (const Object<O>& lhs, const Builtin & rhs) \
132 return exact(lhs) Symb value::scalar(rhs); \
135 template <typename O> \
136 mln_trait_op_##Name (O, value::scalar_< Builtin >) \
137 operator Symb (const Builtin & lhs, const Object<O>& rhs) \
139 return exact(rhs) Symb value::scalar(lhs); \
142 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
150 # define mln_internal_op_obj_builtins_(De, Symb, Name) \
152 mln_internal_##De##_op_obj_bi_(Symb, Name, signed char); \
153 mln_internal_##De##_op_obj_bi_(Symb, Name, unsigned char); \
154 mln_internal_##De##_op_obj_bi_(Symb, Name, signed short); \
155 mln_internal_##De##_op_obj_bi_(Symb, Name, unsigned short); \
156 mln_internal_##De##_op_obj_bi_(Symb, Name, signed int); \
157 mln_internal_##De##_op_obj_bi_(Symb, Name, unsigned int); \
158 mln_internal_##De##_op_obj_bi_(Symb, Name, signed long); \
159 mln_internal_##De##_op_obj_bi_(Symb, Name, unsigned long); \
160 mln_internal_##De##_op_obj_bi_(Symb, Name, float); \
161 mln_internal_##De##_op_obj_bi_(Symb, Name, double); \
163 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
166 # define mln_internal_builtins_op_obj_(De, Symb, Name) \
168 mln_internal_##De##_bi_op_obj_(Symb, Name, signed char); \
169 mln_internal_##De##_bi_op_obj_(Symb, Name, unsigned char); \
170 mln_internal_##De##_bi_op_obj_(Symb, Name, signed short); \
171 mln_internal_##De##_bi_op_obj_(Symb, Name, unsigned short); \
172 mln_internal_##De##_bi_op_obj_(Symb, Name, signed int); \
173 mln_internal_##De##_bi_op_obj_(Symb, Name, unsigned int); \
174 mln_internal_##De##_bi_op_obj_(Symb, Name, signed long); \
175 mln_internal_##De##_bi_op_obj_(Symb, Name, unsigned long); \
176 mln_internal_##De##_bi_op_obj_(Symb, Name, float); \
177 mln_internal_##De##_bi_op_obj_(Symb, Name, double); \
179 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
186 # define mln_internal_decl_bi_minus_obj_(Builtin) \
188 template <typename O> \
189 mln_trait_op_minus(Builtin, O) \
190 operator - (const Builtin & lhs, const Object<O>& rhs); \
192 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
194 # define mln_internal_def_bi_minus_obj_(Builtin) \
196 template <typename O> \
197 mln_trait_op_minus(Builtin, O) \
198 operator - (const Builtin & lhs, const Object<O>& rhs) \
200 return (- exact(rhs)) + value::scalar(lhs); \
203 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
206 # define mln_internal_builtins_minus_obj_(De) \
208 mln_internal_##De##_bi_minus_obj_( signed char); \
209 mln_internal_##De##_bi_minus_obj_(unsigned char); \
210 mln_internal_##De##_bi_minus_obj_( signed short); \
211 mln_internal_##De##_bi_minus_obj_(unsigned short); \
212 mln_internal_##De##_bi_minus_obj_( signed int); \
213 mln_internal_##De##_bi_minus_obj_(unsigned int); \
214 mln_internal_##De##_bi_minus_obj_( signed long); \
215 mln_internal_##De##_bi_minus_obj_(unsigned long); \
216 mln_internal_##De##_bi_minus_obj_(float); \
217 mln_internal_##De##_bi_minus_obj_(double); \
219 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
226 # define mln_internal_decl_bi_dvmd_obj_(Symb, Name, Builtin) \
228 template <typename O> \
229 mln_trait_op_##Name (value::scalar_< Builtin >, O) \
230 operator Symb (const Builtin & lhs, const Object<O>& rhs); \
232 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
234 # define mln_internal_def_bi_dvmd_obj_(Symb, Name, Builtin) \
236 template <typename O> \
237 mln_trait_op_##Name (value::scalar_< Builtin >, O) \
238 operator Symb (const Builtin & lhs, const Object<O>& rhs) \
240 return value::scalar(lhs) Symb exact(rhs); \
243 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
246 # define mln_internal_builtins_dvmd_obj_(De, Symb, Name) \
248 mln_internal_##De##_bi_dvmd_obj_(Symb, Name, signed char); \
249 mln_internal_##De##_bi_dvmd_obj_(Symb, Name, unsigned char); \
250 mln_internal_##De##_bi_dvmd_obj_(Symb, Name, signed short); \
251 mln_internal_##De##_bi_dvmd_obj_(Symb, Name, unsigned short); \
252 mln_internal_##De##_bi_dvmd_obj_(Symb, Name, signed int); \
253 mln_internal_##De##_bi_dvmd_obj_(Symb, Name, unsigned int); \
254 mln_internal_##De##_bi_dvmd_obj_(Symb, Name, signed long); \
255 mln_internal_##De##_bi_dvmd_obj_(Symb, Name, unsigned long); \
256 mln_internal_##De##_bi_dvmd_obj_(Symb, Name, float); \
257 mln_internal_##De##_bi_dvmd_obj_(Symb, Name, double); \
259 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
261 # define mln_internal_op_builtins_cmp_(De, Symb, Name) \
263 mln_internal_##De##_op_cmp_(Symb, Name, signed char); \
264 mln_internal_##De##_op_cmp_(Symb, Name, unsigned char); \
265 mln_internal_##De##_op_cmp_(Symb, Name, signed short); \
266 mln_internal_##De##_op_cmp_(Symb, Name, unsigned short); \
267 mln_internal_##De##_op_cmp_(Symb, Name, signed int); \
268 mln_internal_##De##_op_cmp_(Symb, Name, unsigned int); \
269 mln_internal_##De##_op_cmp_(Symb, Name, signed long); \
270 mln_internal_##De##_op_cmp_(Symb, Name, unsigned long); \
271 mln_internal_##De##_op_cmp_(Symb, Name, float); \
272 mln_internal_##De##_op_cmp_(Symb, Name, double); \
274 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
281 # define mln_internal_decl_bi_opeq_obj_(Symb, Builtin) \
283 template <typename O> \
285 operator Symb##= (Builtin & lhs, const Object<O>& rhs); \
287 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
289 # define mln_internal_def_bi_opeq_obj_(Symb, Builtin) \
291 template <typename O> \
293 operator Symb##= (Builtin & lhs, const Object<O>& rhs) \
295 lhs Symb##= exact(rhs).to_equiv(); \
299 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
301 # define mln_internal_builtins_opeq_obj_(De, Symb) \
303 mln_internal_##De##_bi_opeq_obj_(Symb, signed char); \
304 mln_internal_##De##_bi_opeq_obj_(Symb, unsigned char); \
305 mln_internal_##De##_bi_opeq_obj_(Symb, signed short); \
306 mln_internal_##De##_bi_opeq_obj_(Symb, unsigned short); \
307 mln_internal_##De##_bi_opeq_obj_(Symb, signed int); \
308 mln_internal_##De##_bi_opeq_obj_(Symb, unsigned int); \
309 mln_internal_##De##_bi_opeq_obj_(Symb, signed long); \
310 mln_internal_##De##_bi_opeq_obj_(Symb, unsigned long); \
311 mln_internal_##De##_bi_opeq_obj_(Symb, float); \
312 mln_internal_##De##_bi_opeq_obj_(Symb, double); \
314 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
321 # define mln_internal_decl_op_less_(Symb, Name, Builtin) \
323 template <typename O> \
324 mln_trait_op_##Name (O, value::scalar_< Builtin >) \
325 operator Symb (const Object<O>& lhs, const Builtin & rhs); \
327 template <typename O> \
328 mln_trait_op_##Name (value::scalar_< Builtin >, O) \
329 operator Symb (const Builtin & lhs, const Object<O>& rhs); \
331 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
333 # define mln_internal_def_op_less_(Symb, Name, Builtin) \
335 template <typename O> \
336 mln_trait_op_##Name (O, value::scalar_< Builtin >) \
337 operator Symb (const Object<O>& lhs, const Builtin & rhs) \
339 return exact(lhs) Symb value::scalar(rhs); \
342 template <typename O> \
343 mln_trait_op_##Name (value::scalar_< Builtin >, O) \
344 operator Symb (const Builtin & lhs, const Object<O>& rhs) \
346 return value::scalar(lhs) Symb exact(rhs); \
349 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
351 # define mln_internal_builtins_op_less_(De, Symb, Name) \
353 mln_internal_##De##_op_less_(Symb, Name, signed char); \
354 mln_internal_##De##_op_less_(Symb, Name, unsigned char); \
355 mln_internal_##De##_op_less_(Symb, Name, signed short); \
356 mln_internal_##De##_op_less_(Symb, Name, unsigned short); \
357 mln_internal_##De##_op_less_(Symb, Name, signed int); \
358 mln_internal_##De##_op_less_(Symb, Name, unsigned int); \
359 mln_internal_##De##_op_less_(Symb, Name, signed long); \
360 mln_internal_##De##_op_less_(Symb, Name, unsigned long); \
361 mln_internal_##De##_op_less_(Symb, Name, float); \
362 mln_internal_##De##_op_less_(Symb, Name, double); \
364 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
376 # define mln_internal_set_builtin_trait_is_promotion_(Name) \
378 template <typename Bl, typename Br> \
379 struct set_binary_< Name, mln::value::Built_In, Bl, mln::value::Built_In, Br > \
381 typedef mln_trait_promote(Bl, Br) ret; \
384 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
387 # define mln_internal_set_builtin_trait_is_bool_(Name) \
389 template <typename Bl, typename Br> \
390 struct set_binary_< Name, mln::value::Built_In, Bl, mln::value::Built_In, Br > \
395 struct m_a_c_r_o__e_n_d__w_i_t_h__s_e_m_i_c_o_l_u_m_n
407 template<
typename B >
408 struct set_unary_< op::uplus,
409 mln::value::Built_In, B >
415 struct set_precise_unary_< op::
not_,
bool >
420 template<>
struct set_precise_unary_< op::
uminus, signed char > {
typedef signed char ret; };
421 template<>
struct set_precise_unary_< op::
uminus,
unsigned char > {
typedef int ret; };
422 template<>
struct set_precise_unary_< op::
uminus, signed short > {
typedef signed short ret; };
423 template<>
struct set_precise_unary_< op::
uminus,
unsigned short > {
typedef int ret; };
424 template<>
struct set_precise_unary_< op::
uminus, signed
int > {
typedef signed int ret; };
427 template<>
struct set_precise_unary_< op::
uminus, signed long > {
typedef signed long ret; };
428 template<>
struct set_precise_unary_< op::
uminus,
unsigned long > {
typedef signed long ret; };
430 template<>
struct set_precise_unary_< op::
uminus,
bool > {};
432 template<>
struct set_precise_unary_< op::
uminus,
float > {
typedef float ret; };
433 template<>
struct set_precise_unary_< op::
uminus,
double > {
typedef double ret; };
441 mln_internal_set_builtin_trait_is_promotion_(
op::plus);
442 mln_internal_set_builtin_trait_is_promotion_(op::times);
443 mln_internal_set_builtin_trait_is_promotion_(op::div);
444 mln_internal_set_builtin_trait_is_promotion_(op::mod);
448 template <
typename Bl,
typename Br>
449 struct set_binary_< op::
minus,
450 mln::value::Built_In, Bl, mln::value::Built_In, Br >
452 typedef mln_trait_op_uminus(Br) minus_Br;
453 typedef mln_trait_promote(Bl, minus_Br)
ret;
458 mln_internal_set_builtin_trait_is_bool_(op::eq);
459 mln_internal_set_builtin_trait_is_bool_(op::neq);
461 mln_internal_set_builtin_trait_is_bool_(op::less);
462 mln_internal_set_builtin_trait_is_bool_(op::leq);
463 mln_internal_set_builtin_trait_is_bool_(op::geq);
464 mln_internal_set_builtin_trait_is_bool_(op::greater);
466 mln_internal_set_builtin_trait_is_bool_(op::
and_);
467 mln_internal_set_builtin_trait_is_bool_(op::
or_);
468 mln_internal_set_builtin_trait_is_bool_(op::
xor_);
482 template <typename O, typename B>
483 struct set_binary_< op::
plus, mln::Object, O, mln::
value::Built_In, B >
488 template <typename O, typename B>
489 struct set_binary_< op::
minus, mln::Object, O, mln::
value::Built_In, B >
494 template <typename O, typename B>
495 struct set_binary_< op::times, mln::Object, O, mln::
value::Built_In, B >
500 template <typename O, typename B>
501 struct set_binary_< op::div, mln::Object, O, mln::
value::Built_In, B >
506 template <typename O, typename B>
507 struct set_binary_< op::mod, mln::Object, O, mln::
value::Built_In, B >
512 template <typename O, typename B>
513 struct set_binary_< op::less, mln::Object, O, mln::
value::Built_In, B >
518 template <typename B, typename O>
519 struct set_binary_< op::less, mln::
value::Built_In, B, mln::Object, O >
527 template <typename B, typename O>
528 struct set_binary_< op::plus, mln::
value::Built_In, B, mln::Object, O >
535 template <typename B, typename O>
536 struct set_binary_< op::times, mln::
value::Built_In, B, mln::Object, O >
544 template <typename B, typename O>
545 struct set_binary_< op::minus, mln::
value::Built_In, B, mln::Object, O >
547 typedef mln_trait_op_uminus(O) minus_O;
548 typedef mln_trait_op_plus(minus_O, mln::
value::scalar_<B>) ret;
554 template <typename B, typename O>
555 struct set_binary_< op::div, mln::
value::Built_In, B, mln::Object, O >
562 template <typename B, typename O>
563 struct set_binary_< op::mod, mln::
value::Built_In, B, mln::Object, O >
571 mln_internal_op_obj_builtins_(decl, +, plus);
572 mln_internal_op_obj_builtins_(decl, -, minus);
573 mln_internal_op_obj_builtins_(decl, *, times);
574 mln_internal_op_obj_builtins_(decl, /, div);
575 mln_internal_op_obj_builtins_(decl, %, mod);
578 mln_internal_builtins_op_obj_(decl, +, plus);
579 mln_internal_builtins_op_obj_(decl, *, times);
582 mln_internal_builtins_minus_obj_(decl);
586 mln_internal_builtins_dvmd_obj_(decl, /, div);
587 mln_internal_builtins_dvmd_obj_(decl, %, mod);
591 mln_internal_op_builtins_cmp_(decl, ==, eq);
592 mln_internal_op_builtins_cmp_(decl, !=, neq);
597 mln_internal_builtins_opeq_obj_(decl, +);
598 mln_internal_builtins_opeq_obj_(decl, -);
599 mln_internal_builtins_opeq_obj_(decl, *);
600 mln_internal_builtins_opeq_obj_(decl, /);
601 mln_internal_builtins_opeq_obj_(decl, %);
605 mln_internal_builtins_op_less_(decl, <, less);
609 # ifndef MLN_INCLUDE_ONLY
611 mln_internal_op_obj_builtins_(def, +, plus);
612 mln_internal_op_obj_builtins_(def, -, minus);
613 mln_internal_op_obj_builtins_(def, *, times);
614 mln_internal_op_obj_builtins_(def, /, div);
615 mln_internal_op_obj_builtins_(def, %, mod);
618 mln_internal_builtins_op_obj_(def, +, plus);
619 mln_internal_builtins_op_obj_(def, *, times);
622 mln_internal_builtins_minus_obj_(def);
625 mln_internal_builtins_dvmd_obj_(def, /, div);
626 mln_internal_builtins_dvmd_obj_(def, %, mod);
629 mln_internal_op_builtins_cmp_(def, ==, eq);
630 mln_internal_op_builtins_cmp_(def, !=, neq);
636 mln_internal_builtins_opeq_obj_(def, +);
637 mln_internal_builtins_opeq_obj_(def, -);
638 mln_internal_builtins_opeq_obj_(def, *);
639 mln_internal_builtins_opeq_obj_(def, /);
640 mln_internal_builtins_opeq_obj_(def, %);
644 mln_internal_builtins_op_less_(def, <, less);
647 # endif // ! MLN_INCLUDE_ONLY
652 #endif // ! MLN_VALUE_BUILTIN_OPS_HH