00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #ifndef MORE_GEN_LAMBDA_MATH_H
00032 #define MORE_GEN_LAMBDA_MATH_H
00033
00034 #include <cmath>
00035 #include <cstdlib>
00036 #include <more/math/math.h>
00037
00038 namespace more {
00039 namespace gen {
00040
00041
00042 namespace lambda_kns {
00043 #define MORE_DEF(Name, Result)\
00044 using more::Name;\
00045 template<typename Expr> struct Name##_expr {};\
00046 template<typename Expr>\
00047 struct expr< Name##_expr<Expr> > {\
00048 typedef typename Expr::result_type argument_type;\
00049 typedef Result result_type;\
00050 template<typename Assign>\
00051 result_type operator()(const Assign& a) {\
00052 return Name(x(a));\
00053 }\
00054 template<typename Assign>\
00055 result_type operator()(const Assign& a) const {\
00056 return Name(x(a));\
00057 }\
00058 explicit expr(const Expr& x_) : x(x_) {}\
00059 private:\
00060 Expr x;\
00061 };\
00062 template<typename Expr>\
00063 expr< Name##_expr< expr<Expr> > >\
00064 Name(const expr<Expr>& x) {\
00065 return expr< Name##_expr< expr<Expr> > >(x);\
00066 }
00067
00068
00069 MORE_DEF(ceil, argument_type) MORE_DEF(floor, argument_type)
00070 MORE_DEF(sin, argument_type) MORE_DEF(cos, argument_type)
00071 MORE_DEF(tan, argument_type)
00072 MORE_DEF(asin, argument_type) MORE_DEF(acos, argument_type)
00073 MORE_DEF(atan, argument_type)
00074 MORE_DEF(sinh, argument_type) MORE_DEF(cosh, argument_type)
00075 MORE_DEF(tanh, argument_type) MORE_DEF(exp, argument_type)
00076 MORE_DEF(log, argument_type) MORE_DEF(log10, argument_type)
00077 MORE_DEF(sqrt, argument_type)
00078 MORE_DEF(pow2, argument_type) MORE_DEF(pow3, argument_type)
00079 MORE_DEF(fabs, typename norm_type_<argument_type>::eval)
00080 MORE_DEF(abs, typename norm_type_<argument_type>::eval)
00081
00082 MORE_DEF(norm, double)
00083 #undef MORE_DEF
00084
00085 #define MORE_DEF(Name)\
00086 using more::Name;\
00087 template<typename Expr1, typename Expr2> struct Name##_expr {};\
00088 template<typename Expr1, typename Expr2>\
00089 struct expr< Name##_expr<Expr1, Expr2> > {\
00090 typedef typename Expr1::result_type result_type;\
00091 template<typename Assign>\
00092 result_type operator()(const Assign& a) {\
00093 return Name(x(a), y(a));\
00094 }\
00095 template<typename Assign>\
00096 result_type operator()(const Assign& a) const {\
00097 return Name(x(a), y(a));\
00098 }\
00099 expr(const Expr1& x_, const Expr2& y_) : x(x_), y(y_) {}\
00100 private:\
00101 Expr1 x;\
00102 Expr2 y;\
00103 };\
00104 template<typename T1, typename T2>\
00105 expr<Name##_expr< typename which_expr<T1>::eval,\
00106 typename which_expr<T2>::eval > >\
00107 Name(const T1& x, const T2& y) {\
00108 return expr< Name##_expr< typename which_expr<T1>::eval,\
00109 typename which_expr<T2>::eval > >(x, y);\
00110 }
00111
00112
00113 MORE_DEF(atan2) MORE_DEF(fmod)
00114 MORE_DEF(ldexp)
00115 MORE_DEF(pow)
00116 #undef MORE_DEF
00117 }
00118
00119
00120 }}
00121
00122 #endif