00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef __MMX_WRAP_HPP
00014 #define __MMX_WRAP_HPP
00015
00017
00018 namespace mmx {
00019
00020
00021
00022
00023
00024 #define WRAP_INDIRECT_IMPL(TMPL,C) \
00025 TMPL nat hash (const C& c) { return hash (*c); } \
00026 TMPL nat exact_hash (const C& c) { return exact_hash (*c); } \
00027 TMPL bool operator == (const C& c1, const C& c2) { return (*c1) == (*c2); } \
00028 TMPL bool operator != (const C& c1, const C& c2) { return (*c1) != (*c2); } \
00029 TMPL bool exact_eq (const C& c1, const C& c2) { return exact_eq (*c1, *c2); } \
00030 TMPL bool exact_neq (const C& c1, const C& c2) { return exact_neq (*c1, *c2); }
00031
00032 #define WRAP_WRAPPED_IMPL(TMPL,C) \
00033 TMPL nat hash (const C& c) { return hash (*c); } \
00034 TMPL nat exact_hash (const C& c) { return exact_hash (*c); } \
00035 TMPL nat hard_hash (const C& c) { return hard_hash (*c); } \
00036 TMPL bool operator == (const C& c1, const C& c2) { return (*c1) == (*c2); } \
00037 TMPL bool operator != (const C& c1, const C& c2) { return (*c1) != (*c2); } \
00038 TMPL bool exact_eq (const C& c1, const C& c2) { return exact_eq (*c1, *c2); } \
00039 TMPL bool exact_neq (const C& c1, const C& c2) { return exact_neq(*c1,*c2); } \
00040 TMPL bool hard_eq (const C& c1, const C& c2) { return hard_eq (*c1, *c2); } \
00041 TMPL bool hard_neq (const C& c1, const C& c2) { return hard_neq (*c1, *c2); }
00042
00043
00044
00045
00046
00047 #define WRAP_PRINT_IMPL(TMPL,C) \
00048 TMPL syntactic flatten (const C& c) { return flatten (*c); }
00049
00050 #define WRAP_BINARY_IMPL(TMPL,C,R,Name,Full) \
00051 TMPL struct binary_helper<C >: public void_binary_helper<C > { \
00052 static inline string short_type_name () { return Name; } \
00053 static inline generic full_type_name () { return Full; } \
00054 static inline generic disassemble (const C& x) { \
00055 return as<generic> (*x); } \
00056 static inline C assemble (const generic& x) { \
00057 return C (as<R > (x)); } \
00058 static inline void write (const port& out, const C& c) { \
00059 binary_write<R > (out, *c); } \
00060 static inline C read (const port& in) { \
00061 return C (binary_read<R > (in)); } \
00062 };
00063
00064 #define WRAP_BINARY_IMPL_1(TMPL,C,R,Name,Full,A) \
00065 TMPL struct binary_helper<C >: public void_binary_helper<C > { \
00066 static inline string short_type_name () { \
00067 return Name * Short_type_name (A); } \
00068 static inline generic full_type_name () { \
00069 return gen (Full, Full_type_name (A)); } \
00070 static inline generic disassemble (const C& x) { \
00071 return as<generic> (*x); } \
00072 static inline C assemble (const generic& x) { \
00073 return C (as<R > (x)); } \
00074 static inline void write (const port& out, const C& c) { \
00075 binary_write<R > (out, *c); } \
00076 static inline C read (const port& in) { \
00077 return C (binary_read<R > (in)); } \
00078 };
00079
00080
00081
00082
00083
00084 #define WRAP_FIELD_IMPL(TMPL,C) \
00085 TMPL C operator - (const C& c) { return C(-*c); } \
00086 TMPL C operator + (const C& c1, const C& c2) { return C ((*c1) + (*c2)); } \
00087 TMPL C operator - (const C& c1, const C& c2) { return C ((*c1) - (*c2)); } \
00088 TMPL C operator * (const C& c1, const C& c2) { return C ((*c1) * (*c2)); } \
00089 TMPL C operator / (const C& c1, const C& c2) { return C ((*c1) / (*c2)); } \
00090 TMPL C& operator += (C& c1, const C& c2) { (*c1) += (*c2); return c1; } \
00091 TMPL C& operator -= (C& c1, const C& c2) { (*c1) -= (*c2); return c1; } \
00092 TMPL C& operator *= (C& c1, const C& c2) { (*c1) *= (*c2); return c1; } \
00093 TMPL C& operator /= (C& c1, const C& c2) { (*c1) /= (*c2); return c1; }
00094
00095 #define WRAP_SHIFT_IMPL(TMPL,C) \
00096 TMPL C operator << (const C& c, const xint& sh) { return C (*c << sh); } \
00097 TMPL C operator >> (const C& c, const xint& sh) { return C (*c >> sh); } \
00098 TMPL C& operator <<= (C& c, const xint& sh) { *c << sh; return c; } \
00099 TMPL C& operator >>= (C& c, const xint& sh) { *c >> sh; return c; }
00100
00101
00102
00103
00104
00105 #define WRAP_COMPARE_IMPL(TMPL,C) \
00106 TMPL bool operator <= (const C& c1, const C& c2) { return (*c1) <= (*c2); } \
00107 TMPL bool operator < (const C& c1, const C& c2) { return (*c1) < (*c2); } \
00108 TMPL bool operator >= (const C& c1, const C& c2) { return (*c1) >= (*c2); } \
00109 TMPL bool operator > (const C& c1, const C& c2) { return (*c1) > (*c2); }
00110
00111 #define WRAP_RING_EQUAL_IMPL(TMPL,C) \
00112 TMPL bool is_zero (const C& c) { return is_zero (*c); } \
00113 TMPL bool is_non_zero (const C& c) { return is_non_zero (*c); }
00114
00115 #define WRAP_RING_COMPARE_IMPL(TMPL,C) \
00116 TMPL bool is_zero (const C& c) { return is_zero (*c); } \
00117 TMPL bool is_non_zero (const C& c) { return is_non_zero (*c); } \
00118 TMPL int sign (const C& c) { return sign (*c); } \
00119 TMPL C abs (const C& c) { return C (abs (*c)); } \
00120 TMPL C min (const C& c1, const C& c2) { return C (min (*c1, *c2)); } \
00121 TMPL C max (const C& c1, const C& c2) { return C (max (*c1, *c2)); }
00122
00123
00124
00125
00126
00127 #define WRAP_NUMBER_CHECK_IMPL(TMPL,C) \
00128 TMPL bool is_finite (const C& c) { return is_finite (*c); } \
00129 TMPL bool is_infinite (const C& c) { return is_infinite (*c); } \
00130 TMPL bool is_fuzz (const C& c) { return is_nan (*c); } \
00131 TMPL bool is_nan (const C& c) { return is_nan (*c); } \
00132 TMPL bool is_reliable (const C& c) { return is_reliable (*c); }
00133
00134
00135
00136
00137
00138 #define WRAP_ELEMENTARY_IMPL(TMPL,C) \
00139 TMPL C sqrt (const C& c) { return C (sqrt (*c)); } \
00140 TMPL C exp (const C& c) { return C (exp (*c)); } \
00141 TMPL C log (const C& c) { return C (log (*c)); } \
00142 TMPL C pow (const C& c1, const C& c2) { return C (pow (*c1, *c2)); } \
00143 TMPL C cos (const C& c) { return C (cos (*c)); } \
00144 TMPL C sin (const C& c) { return C (sin (*c)); } \
00145 TMPL C tan (const C& c) { return C (tan (*c)); } \
00146 TMPL C acos (const C& c) { return C (acos (*c)); } \
00147 TMPL C asin (const C& c) { return C (asin (*c)); } \
00148 TMPL C atan (const C& c) { return C (atan (*c)); } \
00149 TMPL C cosh (const C& c) { return C (cosh (*c)); } \
00150 TMPL C sinh (const C& c) { return C (sinh (*c)); } \
00151 TMPL C tanh (const C& c) { return C (tanh (*c)); } \
00152 TMPL C acosh (const C& c) { return C (acosh (*c)); } \
00153 TMPL C asinh (const C& c) { return C (asinh (*c)); } \
00154 TMPL C atanh (const C& c) { return C (atanh (*c)); }
00155
00156
00157
00158
00159
00160 #define WRAP_REAL_IMPL(TMPL,C) \
00161 TMPL C hypot (const C& c1, const C& c2) { return C (hypot (*c1, *c2)); } \
00162 TMPL C atan2 (const C& c1, const C& c2) { return C (atan2 (*c1, *c2)); }
00163
00164 #define WRAP_COMPLEX_IMPL(TMPL,C,R) \
00165 TMPL C gaussian (const R& c1, const R& c2) { \
00166 return C (gaussian (*c1, *c2)); } \
00167 TMPL C polar (const R& c1, const R& c2) { \
00168 return C (polar (*c1, *c2)); } \
00169 TMPL R Re (const C& c) { return R (Re (*c)); } \
00170 TMPL R Im (const C& c) { return R (Im (*c)); } \
00171 TMPL R abs (const C& c) { return R (abs (*c)); } \
00172 TMPL R arg (const C& c) { return R (arg (*c)); } \
00173 TMPL C conj (const C& c) { return C (conj (*c)); }
00174
00175 }
00176 #endif // __MMX_WRAP_HPP