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 }