00001 
00002 #include <basix/int.hpp>
00003 #include <basix/vector.hpp>
00004 #include <basix/port.hpp>
00005 #include <basix/literal.hpp>
00006 #include <numerix/integer.hpp>
00007 #include <basix/glue.hpp>
00008 
00009 #define int_literal(x) as_int (as_string (x))
00010 #define is_generic_literal is<literal>
00011 #define gen_literal_apply(f,v) gen (as<generic> (f), v)
00012 #define gen_literal_access(f,v) access (as<generic> (f), v)
00013 
00014 namespace mmx {
00015   static integer
00016   GLUE_1 (const literal &arg_1) {
00017     return make_literal_integer (arg_1);
00018   }
00019   
00020   static integer
00021   GLUE_2 (const int &arg_1) {
00022     return integer (arg_1);
00023   }
00024   
00025   static integer
00026   GLUE_3 (const int &arg_1) {
00027     return integer (arg_1);
00028   }
00029   
00030   static bool
00031   GLUE_4 (const integer &arg_1) {
00032     return is_int (arg_1);
00033   }
00034   
00035   static int
00036   GLUE_5 (const integer &arg_1) {
00037     return as_int (arg_1);
00038   }
00039   
00040   static integer
00041   GLUE_6 (const string &arg_1) {
00042     return integer (arg_1);
00043   }
00044   
00045   static string
00046   GLUE_7 (const integer &arg_1) {
00047     return as_string (arg_1);
00048   }
00049   
00050   static generic
00051   GLUE_8 (const int &arg_1) {
00052     return integer_construct (arg_1);
00053   }
00054   
00055   static int
00056   GLUE_9 (const integer &arg_1) {
00057     return as_int (arg_1);
00058   }
00059   
00060   static integer
00061   GLUE_10 (const integer &arg_1) {
00062     return -arg_1;
00063   }
00064   
00065   static integer
00066   GLUE_11 (const integer &arg_1) {
00067     return square (arg_1);
00068   }
00069   
00070   static integer
00071   GLUE_12 (const integer &arg_1, const integer &arg_2) {
00072     return arg_1 + arg_2;
00073   }
00074   
00075   static integer
00076   GLUE_13 (const integer &arg_1, const integer &arg_2) {
00077     return arg_1 - arg_2;
00078   }
00079   
00080   static integer
00081   GLUE_14 (const integer &arg_1, const integer &arg_2) {
00082     return arg_1 * arg_2;
00083   }
00084   
00085   static integer
00086   GLUE_15 (const integer &arg_1, const integer &arg_2) {
00087     return arg_1 / arg_2;
00088   }
00089   
00090   static integer
00091   GLUE_16 (const integer &arg_1, const integer &arg_2) {
00092     return quo (arg_1, arg_2);
00093   }
00094   
00095   static integer
00096   GLUE_17 (const integer &arg_1, const integer &arg_2) {
00097     return rem (arg_1, arg_2);
00098   }
00099   
00100   static bool
00101   GLUE_18 (const integer &arg_1, const integer &arg_2) {
00102     return divides (arg_1, arg_2);
00103   }
00104   
00105   static integer
00106   GLUE_19 (const integer &arg_1, const integer &arg_2) {
00107     return gcd (arg_1, arg_2);
00108   }
00109   
00110   static integer
00111   GLUE_20 (const integer &arg_1, const integer &arg_2) {
00112     return lcm (arg_1, arg_2);
00113   }
00114   
00115   static integer
00116   GLUE_21 (const integer &arg_1, const integer &arg_2) {
00117     return invert_modulo (arg_1, arg_2);
00118   }
00119   
00120   static bool
00121   GLUE_22 (const integer &arg_1, const integer &arg_2) {
00122     return arg_1 == arg_2;
00123   }
00124   
00125   static bool
00126   GLUE_23 (const integer &arg_1, const integer &arg_2) {
00127     return arg_1 != arg_2;
00128   }
00129   
00130   static bool
00131   GLUE_24 (const integer &arg_1, const integer &arg_2) {
00132     return arg_1 < arg_2;
00133   }
00134   
00135   static bool
00136   GLUE_25 (const integer &arg_1, const integer &arg_2) {
00137     return arg_1 <= arg_2;
00138   }
00139   
00140   static bool
00141   GLUE_26 (const integer &arg_1, const integer &arg_2) {
00142     return arg_1 > arg_2;
00143   }
00144   
00145   static bool
00146   GLUE_27 (const integer &arg_1, const integer &arg_2) {
00147     return arg_1 >= arg_2;
00148   }
00149   
00150   static int
00151   GLUE_28 (const integer &arg_1) {
00152     return sign (arg_1);
00153   }
00154   
00155   static integer
00156   GLUE_29 (const integer &arg_1) {
00157     return abs (arg_1);
00158   }
00159   
00160   static integer
00161   GLUE_30 (const integer &arg_1, const integer &arg_2) {
00162     return min (arg_1, arg_2);
00163   }
00164   
00165   static integer
00166   GLUE_31 (const integer &arg_1, const integer &arg_2) {
00167     return max (arg_1, arg_2);
00168   }
00169   
00170   static integer
00171   GLUE_32 (const integer &arg_1, const integer &arg_2) {
00172     return min (arg_1, arg_2);
00173   }
00174   
00175   static integer
00176   GLUE_33 (const integer &arg_1, const integer &arg_2) {
00177     return max (arg_1, arg_2);
00178   }
00179   
00180   static integer
00181   GLUE_34 (const integer &arg_1) {
00182     return factorial (arg_1);
00183   }
00184   
00185   static integer
00186   GLUE_35 (const integer &arg_1, const integer &arg_2) {
00187     return binomial (arg_1, arg_2);
00188   }
00189   
00190   static bool
00191   GLUE_36 (const integer &arg_1) {
00192     return is_probable_prime (arg_1);
00193   }
00194   
00195   static integer
00196   GLUE_37 (const integer &arg_1) {
00197     return probable_next_prime (arg_1);
00198   }
00199   
00200   static integer
00201   GLUE_38 (const integer &arg_1, const integer &arg_2) {
00202     return arg_1 & arg_2;
00203   }
00204   
00205   static integer
00206   GLUE_39 (const integer &arg_1, const integer &arg_2) {
00207     return arg_1 | arg_2;
00208   }
00209   
00210   static integer
00211   GLUE_40 (const integer &arg_1, const integer &arg_2) {
00212     return arg_1 ^ arg_2;
00213   }
00214   
00215   static integer
00216   GLUE_41 (const integer &arg_1) {
00217     return ~arg_1;
00218   }
00219   
00220   static int
00221   GLUE_42 (const integer &arg_1) {
00222     return bit_size (arg_1);
00223   }
00224   
00225   static bool
00226   GLUE_43 (const integer &arg_1, const int &arg_2) {
00227     return arg_1[arg_2];
00228   }
00229   
00230   static int
00231   GLUE_44 (const integer &arg_1) {
00232     return hamming_norm (arg_1);
00233   }
00234   
00235   static int
00236   GLUE_45 (const integer &arg_1, const integer &arg_2) {
00237     return hamming_distance (arg_1, arg_2);
00238   }
00239   
00240   static integer
00241   GLUE_46 (const integer &arg_1, const int &arg_2) {
00242     return arg_1 + arg_2;
00243   }
00244   
00245   static integer
00246   GLUE_47 (const integer &arg_1, const int &arg_2) {
00247     return arg_1 - arg_2;
00248   }
00249   
00250   static integer
00251   GLUE_48 (const integer &arg_1, const int &arg_2) {
00252     return arg_1 * arg_2;
00253   }
00254   
00255   static integer
00256   GLUE_49 (const int &arg_1, const integer &arg_2) {
00257     return arg_1 + arg_2;
00258   }
00259   
00260   static integer
00261   GLUE_50 (const int &arg_1, const integer &arg_2) {
00262     return arg_1 - arg_2;
00263   }
00264   
00265   static integer
00266   GLUE_51 (const int &arg_1, const integer &arg_2) {
00267     return arg_1 * arg_2;
00268   }
00269   
00270   static integer
00271   GLUE_52 (const integer &arg_1, const int &arg_2) {
00272     return arg_1 / arg_2;
00273   }
00274   
00275   static integer
00276   GLUE_53 (const integer &arg_1, const int &arg_2) {
00277     return quo (arg_1, arg_2);
00278   }
00279   
00280   static integer
00281   GLUE_54 (const integer &arg_1, const int &arg_2) {
00282     return rem (arg_1, arg_2);
00283   }
00284   
00285   static bool
00286   GLUE_55 (const integer &arg_1, const int &arg_2) {
00287     return divides (arg_1, arg_2);
00288   }
00289   
00290   static integer
00291   GLUE_56 (const int &arg_1, const integer &arg_2) {
00292     return arg_1 / arg_2;
00293   }
00294   
00295   static integer
00296   GLUE_57 (const int &arg_1, const integer &arg_2) {
00297     return quo (arg_1, arg_2);
00298   }
00299   
00300   static integer
00301   GLUE_58 (const int &arg_1, const integer &arg_2) {
00302     return rem (arg_1, arg_2);
00303   }
00304   
00305   static bool
00306   GLUE_59 (const int &arg_1, const integer &arg_2) {
00307     return divides (arg_1, arg_2);
00308   }
00309   
00310   static bool
00311   GLUE_60 (const integer &arg_1, const int &arg_2) {
00312     return arg_1 == arg_2;
00313   }
00314   
00315   static bool
00316   GLUE_61 (const integer &arg_1, const int &arg_2) {
00317     return arg_1 != arg_2;
00318   }
00319   
00320   static bool
00321   GLUE_62 (const integer &arg_1, const int &arg_2) {
00322     return arg_1 < arg_2;
00323   }
00324   
00325   static bool
00326   GLUE_63 (const integer &arg_1, const int &arg_2) {
00327     return arg_1 <= arg_2;
00328   }
00329   
00330   static bool
00331   GLUE_64 (const integer &arg_1, const int &arg_2) {
00332     return arg_1 > arg_2;
00333   }
00334   
00335   static bool
00336   GLUE_65 (const integer &arg_1, const int &arg_2) {
00337     return arg_1 >= arg_2;
00338   }
00339   
00340   static bool
00341   GLUE_66 (const int &arg_1, const integer &arg_2) {
00342     return arg_1 == arg_2;
00343   }
00344   
00345   static bool
00346   GLUE_67 (const int &arg_1, const integer &arg_2) {
00347     return arg_1 != arg_2;
00348   }
00349   
00350   static bool
00351   GLUE_68 (const int &arg_1, const integer &arg_2) {
00352     return arg_1 < arg_2;
00353   }
00354   
00355   static bool
00356   GLUE_69 (const int &arg_1, const integer &arg_2) {
00357     return arg_1 <= arg_2;
00358   }
00359   
00360   static bool
00361   GLUE_70 (const int &arg_1, const integer &arg_2) {
00362     return arg_1 > arg_2;
00363   }
00364   
00365   static bool
00366   GLUE_71 (const int &arg_1, const integer &arg_2) {
00367     return arg_1 >= arg_2;
00368   }
00369   
00370   static integer
00371   GLUE_72 (const integer &arg_1, const int &arg_2) {
00372     return min (arg_1, arg_2);
00373   }
00374   
00375   static integer
00376   GLUE_73 (const integer &arg_1, const int &arg_2) {
00377     return max (arg_1, arg_2);
00378   }
00379   
00380   static integer
00381   GLUE_74 (const int &arg_1, const integer &arg_2) {
00382     return min (arg_1, arg_2);
00383   }
00384   
00385   static integer
00386   GLUE_75 (const int &arg_1, const integer &arg_2) {
00387     return max (arg_1, arg_2);
00388   }
00389   
00390   static integer
00391   GLUE_76 (const integer &arg_1, const int &arg_2) {
00392     return arg_1 & arg_2;
00393   }
00394   
00395   static integer
00396   GLUE_77 (const integer &arg_1, const int &arg_2) {
00397     return arg_1 | arg_2;
00398   }
00399   
00400   static integer
00401   GLUE_78 (const integer &arg_1, const int &arg_2) {
00402     return arg_1 ^ arg_2;
00403   }
00404   
00405   static integer
00406   GLUE_79 (const int &arg_1, const integer &arg_2) {
00407     return arg_1 & arg_2;
00408   }
00409   
00410   static integer
00411   GLUE_80 (const int &arg_1, const integer &arg_2) {
00412     return arg_1 | arg_2;
00413   }
00414   
00415   static integer
00416   GLUE_81 (const int &arg_1, const integer &arg_2) {
00417     return arg_1 ^ arg_2;
00418   }
00419   
00420   void
00421   glue_integer () {
00422     static bool done = false;
00423     if (done) return;
00424     done = true;
00425     call_glue (string ("glue_int"));
00426     call_glue (string ("glue_literal"));
00427     call_glue (string ("glue_string"));
00428     define_type<integer > (lit ("Integer"));
00429     define ("literal_integer", GLUE_1);
00430     define ("integer", GLUE_2);
00431     define_converter ("upgrade", GLUE_3, PENALTY_INCLUSION);
00432     define ("int?", GLUE_4);
00433     define ("as_int", GLUE_5);
00434     define ("as_integer", GLUE_6);
00435     define ("as_string", GLUE_7);
00436     define_constructor<int > (GLUE_8);
00437     define_converter (":>", GLUE_9, PENALTY_INCLUSION);
00438     define ("-", GLUE_10);
00439     define ("square", GLUE_11);
00440     define ("+", GLUE_12);
00441     define ("-", GLUE_13);
00442     define ("*", GLUE_14);
00443     define ("div", GLUE_15);
00444     define ("quo", GLUE_16);
00445     define ("rem", GLUE_17);
00446     define ("divides?", GLUE_18);
00447     define ("gcd", GLUE_19);
00448     define ("lcm", GLUE_20);
00449     define ("invert_modulo", GLUE_21);
00450     define ("=", GLUE_22);
00451     define ("!=", GLUE_23);
00452     define ("<", GLUE_24);
00453     define ("<=", GLUE_25);
00454     define (">", GLUE_26);
00455     define (">=", GLUE_27);
00456     define ("sign", GLUE_28);
00457     define ("abs", GLUE_29);
00458     define ("min", GLUE_30);
00459     define ("max", GLUE_31);
00460     define ("inf", GLUE_32);
00461     define ("sup", GLUE_33);
00462     define (".!", GLUE_34);
00463     define ("binomial", GLUE_35);
00464     define ("probable_prime?", GLUE_36);
00465     define ("probable_next_prime", GLUE_37);
00466     define ("/\\", GLUE_38);
00467     define ("\\/", GLUE_39);
00468     define ("xor", GLUE_40);
00469     define ("!", GLUE_41);
00470     define ("#", GLUE_42);
00471     define (".[]", GLUE_43);
00472     define ("hamming_norm", GLUE_44);
00473     define ("hamming_distance", GLUE_45);
00474     define ("+", GLUE_46);
00475     define ("-", GLUE_47);
00476     define ("*", GLUE_48);
00477     define ("+", GLUE_49);
00478     define ("-", GLUE_50);
00479     define ("*", GLUE_51);
00480     define ("div", GLUE_52);
00481     define ("quo", GLUE_53);
00482     define ("rem", GLUE_54);
00483     define ("divides?", GLUE_55);
00484     define ("div", GLUE_56);
00485     define ("quo", GLUE_57);
00486     define ("rem", GLUE_58);
00487     define ("divides?", GLUE_59);
00488     define ("=", GLUE_60);
00489     define ("!=", GLUE_61);
00490     define ("<", GLUE_62);
00491     define ("<=", GLUE_63);
00492     define (">", GLUE_64);
00493     define (">=", GLUE_65);
00494     define ("=", GLUE_66);
00495     define ("!=", GLUE_67);
00496     define ("<", GLUE_68);
00497     define ("<=", GLUE_69);
00498     define (">", GLUE_70);
00499     define (">=", GLUE_71);
00500     define ("min", GLUE_72);
00501     define ("max", GLUE_73);
00502     define ("min", GLUE_74);
00503     define ("max", GLUE_75);
00504     define ("/\\", GLUE_76);
00505     define ("\\/", GLUE_77);
00506     define ("xor", GLUE_78);
00507     define ("/\\", GLUE_79);
00508     define ("\\/", GLUE_80);
00509     define ("xor", GLUE_81);
00510   }
00511 }