basix_doc 0.1
/Users/mourrain/Devel/mmx/basix/include/basix/wrap.hpp
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines