00001 00002 #include <basix/int.hpp> 00003 #include <numerix/complex.hpp> 00004 #include <basix/glue.hpp> 00005 00006 #define int_literal(x) as_int (as_string (x)) 00007 00008 namespace mmx { 00009 static complex<generic> 00010 GLUE_1 (const generic &arg_1) { 00011 return complex<generic > (arg_1); 00012 } 00013 00014 static complex<generic> 00015 GLUE_2 (const generic &arg_1, const generic &arg_2) { 00016 return complex<generic > (arg_1, arg_2); 00017 } 00018 00019 static generic 00020 GLUE_3 (const complex<generic> &arg_1) { 00021 return Re (arg_1); 00022 } 00023 00024 static generic 00025 GLUE_4 (const complex<generic> &arg_1) { 00026 return Im (arg_1); 00027 } 00028 00029 static complex<generic> 00030 GLUE_5 (const complex<generic> &arg_1) { 00031 return conj (arg_1); 00032 } 00033 00034 static complex<generic> 00035 GLUE_6 (const complex<generic> &arg_1) { 00036 return times_i (arg_1); 00037 } 00038 00039 static complex<generic> 00040 GLUE_7 (const complex<generic> &arg_1) { 00041 return over_i (arg_1); 00042 } 00043 00044 static complex<generic> 00045 GLUE_8 (const complex<generic> &arg_1) { 00046 return -arg_1; 00047 } 00048 00049 static complex<generic> 00050 GLUE_9 (const complex<generic> &arg_1) { 00051 return square (arg_1); 00052 } 00053 00054 static complex<generic> 00055 GLUE_10 (const complex<generic> &arg_1, const complex<generic> &arg_2) { 00056 return arg_1 + arg_2; 00057 } 00058 00059 static complex<generic> 00060 GLUE_11 (const complex<generic> &arg_1, const complex<generic> &arg_2) { 00061 return arg_1 - arg_2; 00062 } 00063 00064 static complex<generic> 00065 GLUE_12 (const complex<generic> &arg_1, const complex<generic> &arg_2) { 00066 return arg_1 * arg_2; 00067 } 00068 00069 static bool 00070 GLUE_13 (const complex<generic> &arg_1, const complex<generic> &arg_2) { 00071 return arg_1 == arg_2; 00072 } 00073 00074 static bool 00075 GLUE_14 (const complex<generic> &arg_1, const complex<generic> &arg_2) { 00076 return arg_1 != arg_2; 00077 } 00078 00079 static complex<generic> 00080 GLUE_15 (const complex<generic> &arg_1) { 00081 return invert (arg_1); 00082 } 00083 00084 static complex<generic> 00085 GLUE_16 (const complex<generic> &arg_1, const complex<generic> &arg_2) { 00086 return arg_1 / arg_2; 00087 } 00088 00089 static generic 00090 GLUE_17 (const complex<generic> &arg_1) { 00091 return abs (arg_1); 00092 } 00093 00094 static generic 00095 GLUE_18 (const complex<generic> &arg_1) { 00096 return arg (arg_1); 00097 } 00098 00099 static complex<generic> 00100 GLUE_19 (const complex<generic> &arg_1) { 00101 return sqrt (arg_1); 00102 } 00103 00104 static complex<generic> 00105 GLUE_20 (const complex<generic> &arg_1) { 00106 return exp (arg_1); 00107 } 00108 00109 static complex<generic> 00110 GLUE_21 (const complex<generic> &arg_1) { 00111 return log (arg_1); 00112 } 00113 00114 static complex<generic> 00115 GLUE_22 (const complex<generic> &arg_1) { 00116 return cos (arg_1); 00117 } 00118 00119 static complex<generic> 00120 GLUE_23 (const complex<generic> &arg_1) { 00121 return sin (arg_1); 00122 } 00123 00124 static complex<generic> 00125 GLUE_24 (const complex<generic> &arg_1) { 00126 return tan (arg_1); 00127 } 00128 00129 static complex<generic> 00130 GLUE_25 (const complex<generic> &arg_1) { 00131 return acos (arg_1); 00132 } 00133 00134 static complex<generic> 00135 GLUE_26 (const complex<generic> &arg_1) { 00136 return asin (arg_1); 00137 } 00138 00139 static complex<generic> 00140 GLUE_27 (const complex<generic> &arg_1) { 00141 return atan (arg_1); 00142 } 00143 00144 static complex<generic> 00145 GLUE_28 (const complex<generic> &arg_1, const complex<generic> &arg_2) { 00146 return pow (arg_1, arg_2); 00147 } 00148 00149 static complex<generic> 00150 GLUE_29 (const complex<generic> &arg_1, const int &arg_2) { 00151 return sympow (arg_1, arg_2); 00152 } 00153 00154 void 00155 glue_complex_generic () { 00156 static bool done = false; 00157 if (done) return; 00158 done = true; 00159 call_glue (string ("glue_int")); 00160 call_glue (string ("glue_generic")); 00161 define_type<complex<generic> > (gen (lit ("Complex"), lit ("Generic"))); 00162 define ("complex", GLUE_1); 00163 define ("complex", GLUE_2); 00164 define ("Re", GLUE_3); 00165 define ("Im", GLUE_4); 00166 define ("conj", GLUE_5); 00167 define ("times_i", GLUE_6); 00168 define ("over_i", GLUE_7); 00169 define ("-", GLUE_8); 00170 define ("square", GLUE_9); 00171 define ("+", GLUE_10); 00172 define ("-", GLUE_11); 00173 define ("*", GLUE_12); 00174 define ("=", GLUE_13); 00175 define ("!=", GLUE_14); 00176 define ("invert", GLUE_15); 00177 define ("/", GLUE_16); 00178 define ("abs", GLUE_17); 00179 define ("arg", GLUE_18); 00180 define ("sqrt", GLUE_19); 00181 define ("exp", GLUE_20); 00182 define ("log", GLUE_21); 00183 define ("cos", GLUE_22); 00184 define ("sin", GLUE_23); 00185 define ("tan", GLUE_24); 00186 define ("arccos", GLUE_25); 00187 define ("arcsin", GLUE_26); 00188 define ("arctan", GLUE_27); 00189 define ("^", GLUE_28); 00190 define ("sym_pow", GLUE_29); 00191 } 00192 }