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