Go to the documentation of this file. 1 #ifndef realroot_ARITHM_TEXP_OPERATORS_H
2 #define realroot_ARITHM_TEXP_OPERATORS_H
9 #define define_binary_operator_structure(opname,function,call) \
13 inline static const char * name() { return #call; }; \
14 template < class A, class B, class C > inline \
15 void operator()( A & a, const B & b, const C & c) const \
19 template < class A, class B > inline \
20 void operator()( A & a, const B & b ) const \
26 #define define_binary_operator(opname,function,call)\
27 define_binary_operator_structure(opname,function,call)\
28 template<class X, class Y> inline \
29 texp::template_expression< \
30 texp::binary_operator<opname, \
31 texp::template_expression<X>, \
32 texp::template_expression<Y> > > \
33 function( const texp::template_expression<X>& x, \
34 const texp::template_expression<Y>& y ) \
36 return texp::template_expression< texp::binary_operator< opname, \
37 texp::template_expression<X>, \
38 texp::template_expression<Y> > > ( x, y ); \
41 template<class X, class Y> inline \
42 texp::template_expression< \
43 texp::binary_operator<opname, \
44 texp::template_expression<X>, \
45 texp::template_expression<Y> > > \
46 function( const texp::template_expression<X>& x, const Y& y ) \
48 return texp::template_expression< texp::binary_operator< opname, \
49 texp::template_expression<X>, \
50 texp::template_expression<Y> > > \
51 ( x, texp::template_expression<Y>(y)); \
54 template<class X, class Y> inline \
55 texp::template_expression< \
56 texp::binary_operator<opname, \
57 texp::template_expression<X>, \
58 texp::template_expression<Y> > > \
59 function( const X& x, const texp::template_expression<Y>& y ) \
62 texp::template_expression< texp::binary_operator<opname \
63 , texp::template_expression<X> \
64 , texp::template_expression<Y> > > \
65 (texp::template_expression<X>(x),y); \
68 template<class X,class Y> \
69 X & call( X & r, const texp::template_expression<Y> & exp ) \
71 typename template_expression<Y>::E tmp; \
77 #define define_unary_operator(opname,function,call)\
81 inline static const char * name() \
86 template < class A, class B > inline \
87 void operator()(A & a, const B & b) const \
91 template < class A> inline \
92 void operator()(A & a) const \
98 template<class X> inline \
99 texp::template_expression< \
100 unary_operator< opname, \
101 texp::template_expression<X> > > \
102 function( const texp::template_expression<X>& x ) \
105 texp::template_expression< \
106 unary_operator<opname, texp::template_expression<X> > >( x ); \
109 template<class X> inline \
110 texp::template_expression< \
111 unary_operator< opname, \
112 texp::template_expression<X> > > \
113 function( const X& x ) \
116 texp::template_expression< \
117 unary_operator<opname, texp::template_expression<X> > > \
118 ( texp::template_expression<X>(x) ); \
121 #define declare_binary_operator(tp_arg_list,parm0,parm1,opname,function)\
123 texp::template_expression< texp::binary_operator< opname,\
124 texp::template_expression< parm0 >, \
125 texp::template_expression< parm1 > > > \
126 function( const parm0 & x, const parm1 & y )\
128 texp::template_expression< \
129 texp::binary_operator< \
130 opname, texp::template_expression< parm0 >, texp::template_expression< parm1 > > >\
131 (texp::template_expression< parm0 >(x),texp::template_expression< parm1 >(y));\
134 texp::template_expression< texp::binary_operator< opname , \
135 texp::template_expression< parm0 >,\
136 texp::template_expression< parm1 > > >\
137 function( const texp::template_expression<parm0> & x, const parm1 & y )\
138 { return texp::template_expression< texp::binary_operator< opname, texp::template_expression< parm0 >, texp::template_expression< parm1 > > >\
139 (x,texp::template_expression<parm1>(y)); };\
141 texp::template_expression< texp::binary_operator< opname , \
142 texp::template_expression< parm0 >, \
143 texp::template_expression< parm1 > > >\
144 function( const parm0 & x, const texp::template_expression<parm1> & y )\
145 { return texp::template_expression< texp::binary_operator< opname, texp::template_expression< parm0 >, texp::template_expression< parm1 > > >\
146 (texp::template_expression< parm0 >(x),y); }
148 #define declare_unary_operator(tp_arg_list,parm,opname,function)\
150 texp::template_expression< texp::unary_operator< opname, \
151 texp::template_expression<parm> > >\
152 function( const parm& x ) \
154 return texp::template_expression<\
155 texp::unary_operator< opname, \
156 texp::template_expression<parm> > >( texp::template_expression<parm>(x) ); \