basix_doc 0.1
|
00001 00002 /****************************************************************************** 00003 * MODULE : wrap.hpp 00004 * DESCRIPTION: Macros for the construction of wrapper classes 00005 * COPYRIGHT : (C) 2006 Joris van der Hoeven 00006 ******************************************************************************* 00007 * This software falls under the GNU general public license and comes WITHOUT 00008 * ANY WARRANTY WHATSOEVER. See the file $TEXMACS_PATH/LICENSE for more details. 00009 * If you don't have this file, write to the Free Software Foundation, Inc., 00010 * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00011 ******************************************************************************/ 00012 00013 #ifndef __MMX_WRAP_HPP 00014 #define __MMX_WRAP_HPP 00015 00017 00018 namespace mmx { 00019 00020 /****************************************************************************** 00021 * Hash functions and equality 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 * Flattening and output 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 * Field operations 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 * Ordering 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 * Checks for numbers 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 * Elementary functions 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 * Extra routines for real-like and complex-like types 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 } // namespace mmx 00176 #endif // __MMX_WRAP_HPP