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 }