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 <algebramix/vector_unrolled.hpp>
00008 #include <algebramix/vector_simd.hpp>
00009 #include <basix/tuple.hpp>
00010 #include <basix/alias.hpp>
00011 #include <basix/glue.hpp>
00012 
00013 #define int_literal(x) as_int (as_string (x))
00014 #define is_generic_literal is<literal>
00015 #define gen_literal_apply(f,v) gen (as<generic> (f), v)
00016 #define gen_literal_access(f,v) access (as<generic> (f), v)
00017 
00018 namespace mmx {
00019   static vector<integer>
00020   GLUE_1 (const tuple<integer> &arg_1) {
00021     return vector<integer > (as_vector (arg_1));
00022   }
00023   
00024   static vector<integer>
00025   GLUE_2 (const tuple<integer> &arg_1) {
00026     return vector<integer > (as_vector (arg_1));
00027   }
00028   
00029   static iterator<generic>
00030   GLUE_3 (const vector<integer> &arg_1) {
00031     return as<iterator<generic> > (iterate (arg_1));
00032   }
00033   
00034   static int
00035   GLUE_4 (const vector<integer> &arg_1) {
00036     return N (arg_1);
00037   }
00038   
00039   static integer
00040   GLUE_5 (const vector<integer> &arg_1, const int &arg_2) {
00041     return arg_1[arg_2];
00042   }
00043   
00044   static alias<integer>
00045   GLUE_6 (const alias<vector<integer> > &arg_1, const int &arg_2) {
00046     return alias_access<integer > (arg_1, arg_2);
00047   }
00048   
00049   static vector<integer>
00050   GLUE_7 (const vector<integer> &arg_1, const int &arg_2, const int &arg_3) {
00051     return range (arg_1, arg_2, arg_3);
00052   }
00053   
00054   static vector<integer>
00055   GLUE_8 (const vector<integer> &arg_1) {
00056     return reverse (arg_1);
00057   }
00058   
00059   static vector<integer>
00060   GLUE_9 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00061     return append (arg_1, arg_2);
00062   }
00063   
00064   static alias<vector<integer> >
00065   GLUE_10 (const alias<vector<integer> > &arg_1, const vector<integer> &arg_2) {
00066     return alias_write (arg_1, arg_2);
00067   }
00068   
00069   static vector<integer>
00070   GLUE_11 (const integer &arg_1, const vector<integer> &arg_2) {
00071     return cons (arg_1, arg_2);
00072   }
00073   
00074   static integer
00075   GLUE_12 (const vector<integer> &arg_1) {
00076     return car (arg_1);
00077   }
00078   
00079   static vector<integer>
00080   GLUE_13 (const vector<integer> &arg_1) {
00081     return cdr (arg_1);
00082   }
00083   
00084   static bool
00085   GLUE_14 (const vector<integer> &arg_1) {
00086     return is_nil (arg_1);
00087   }
00088   
00089   static bool
00090   GLUE_15 (const vector<integer> &arg_1) {
00091     return is_atom (arg_1);
00092   }
00093   
00094   static vector<integer>
00095   GLUE_16 (const vector<integer> &arg_1, const integer &arg_2) {
00096     return insert (arg_1, arg_2);
00097   }
00098   
00099   static int
00100   GLUE_17 (const vector<integer> &arg_1, const integer &arg_2) {
00101     return find (arg_1, arg_2);
00102   }
00103   
00104   static bool
00105   GLUE_18 (const vector<integer> &arg_1, const integer &arg_2) {
00106     return contains (arg_1, arg_2);
00107   }
00108   
00109   static vector<generic>
00110   GLUE_19 (const vector<integer> &arg_1) {
00111     return as<vector<generic> > (arg_1);
00112   }
00113   
00114   static vector<integer>
00115   GLUE_20 (const vector<integer> &arg_1) {
00116     return -arg_1;
00117   }
00118   
00119   static vector<integer>
00120   GLUE_21 (const vector<integer> &arg_1) {
00121     return square (arg_1);
00122   }
00123   
00124   static vector<integer>
00125   GLUE_22 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00126     return arg_1 + arg_2;
00127   }
00128   
00129   static vector<integer>
00130   GLUE_23 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00131     return arg_1 - arg_2;
00132   }
00133   
00134   static vector<integer>
00135   GLUE_24 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00136     return arg_1 * arg_2;
00137   }
00138   
00139   static vector<integer>
00140   GLUE_25 (const integer &arg_1, const vector<integer> &arg_2) {
00141     return arg_1 + arg_2;
00142   }
00143   
00144   static vector<integer>
00145   GLUE_26 (const vector<integer> &arg_1, const integer &arg_2) {
00146     return arg_1 + arg_2;
00147   }
00148   
00149   static vector<integer>
00150   GLUE_27 (const integer &arg_1, const vector<integer> &arg_2) {
00151     return arg_1 - arg_2;
00152   }
00153   
00154   static vector<integer>
00155   GLUE_28 (const vector<integer> &arg_1, const integer &arg_2) {
00156     return arg_1 - arg_2;
00157   }
00158   
00159   static vector<integer>
00160   GLUE_29 (const integer &arg_1, const vector<integer> &arg_2) {
00161     return arg_1 * arg_2;
00162   }
00163   
00164   static vector<integer>
00165   GLUE_30 (const vector<integer> &arg_1, const integer &arg_2) {
00166     return arg_1 * arg_2;
00167   }
00168   
00169   static integer
00170   GLUE_31 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00171     return dot (arg_1, arg_2);
00172   }
00173   
00174   static integer
00175   GLUE_32 (const vector<integer> &arg_1) {
00176     return big_mul (arg_1);
00177   }
00178   
00179   static integer
00180   GLUE_33 (const vector<integer> &arg_1) {
00181     return big_add (arg_1);
00182   }
00183   
00184   static bool
00185   GLUE_34 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00186     return arg_1 == arg_2;
00187   }
00188   
00189   static bool
00190   GLUE_35 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00191     return arg_1 != arg_2;
00192   }
00193   
00194   static bool
00195   GLUE_36 (const vector<integer> &arg_1, const integer &arg_2) {
00196     return arg_1 == arg_2;
00197   }
00198   
00199   static bool
00200   GLUE_37 (const vector<integer> &arg_1, const integer &arg_2) {
00201     return arg_1 != arg_2;
00202   }
00203   
00204   static bool
00205   GLUE_38 (const integer &arg_1, const vector<integer> &arg_2) {
00206     return arg_1 == arg_2;
00207   }
00208   
00209   static bool
00210   GLUE_39 (const integer &arg_1, const vector<integer> &arg_2) {
00211     return arg_1 != arg_2;
00212   }
00213   
00214   static bool
00215   GLUE_40 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00216     return arg_1 <= arg_2;
00217   }
00218   
00219   static bool
00220   GLUE_41 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00221     return arg_1 >= arg_2;
00222   }
00223   
00224   static bool
00225   GLUE_42 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00226     return arg_1 < arg_2;
00227   }
00228   
00229   static bool
00230   GLUE_43 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00231     return arg_1 > arg_2;
00232   }
00233   
00234   static bool
00235   GLUE_44 (const vector<integer> &arg_1, const integer &arg_2) {
00236     return arg_1 <= arg_2;
00237   }
00238   
00239   static bool
00240   GLUE_45 (const vector<integer> &arg_1, const integer &arg_2) {
00241     return arg_1 >= arg_2;
00242   }
00243   
00244   static bool
00245   GLUE_46 (const vector<integer> &arg_1, const integer &arg_2) {
00246     return arg_1 < arg_2;
00247   }
00248   
00249   static bool
00250   GLUE_47 (const vector<integer> &arg_1, const integer &arg_2) {
00251     return arg_1 > arg_2;
00252   }
00253   
00254   static bool
00255   GLUE_48 (const integer &arg_1, const vector<integer> &arg_2) {
00256     return arg_1 <= arg_2;
00257   }
00258   
00259   static bool
00260   GLUE_49 (const integer &arg_1, const vector<integer> &arg_2) {
00261     return arg_1 >= arg_2;
00262   }
00263   
00264   static bool
00265   GLUE_50 (const integer &arg_1, const vector<integer> &arg_2) {
00266     return arg_1 < arg_2;
00267   }
00268   
00269   static bool
00270   GLUE_51 (const integer &arg_1, const vector<integer> &arg_2) {
00271     return arg_1 > arg_2;
00272   }
00273   
00274   static vector<integer>
00275   GLUE_52 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00276     return inf (arg_1, arg_2);
00277   }
00278   
00279   static vector<integer>
00280   GLUE_53 (const vector<integer> &arg_1, const vector<integer> &arg_2) {
00281     return sup (arg_1, arg_2);
00282   }
00283   
00284   void
00285   glue_vector_integer () {
00286     static bool done = false;
00287     if (done) return;
00288     done = true;
00289     call_glue (string ("glue_integer"));
00290     call_glue (string ("glue_vector_generic"));
00291     define_type<vector<integer> > (gen (lit ("Vector"), lit ("Integer")));
00292     define ("vector", GLUE_1);
00293     define ("[]", GLUE_2);
00294     define_converter (":>", GLUE_3, PENALTY_CAST);
00295     define ("#", GLUE_4);
00296     define (".[]", GLUE_5);
00297     define (".[]", GLUE_6);
00298     define (".[]", GLUE_7);
00299     define ("reverse", GLUE_8);
00300     define ("><", GLUE_9);
00301     define ("<<", GLUE_10);
00302     define ("cons", GLUE_11);
00303     define ("car", GLUE_12);
00304     define ("cdr", GLUE_13);
00305     define ("nil?", GLUE_14);
00306     define ("atom?", GLUE_15);
00307     define ("insert", GLUE_16);
00308     define ("find", GLUE_17);
00309     define ("contains?", GLUE_18);
00310     define_converter (":>", GLUE_19, PENALTY_PROMOTE_GENERIC);
00311     define ("-", GLUE_20);
00312     define ("square", GLUE_21);
00313     define ("+", GLUE_22);
00314     define ("-", GLUE_23);
00315     define ("*", GLUE_24);
00316     define ("+", GLUE_25);
00317     define ("+", GLUE_26);
00318     define ("-", GLUE_27);
00319     define ("-", GLUE_28);
00320     define ("*", GLUE_29);
00321     define ("*", GLUE_30);
00322     define ("dot", GLUE_31);
00323     define ("big_mul", GLUE_32);
00324     define ("big_add", GLUE_33);
00325     define ("=", GLUE_34);
00326     define ("!=", GLUE_35);
00327     define ("=", GLUE_36);
00328     define ("!=", GLUE_37);
00329     define ("=", GLUE_38);
00330     define ("!=", GLUE_39);
00331     define ("<=", GLUE_40);
00332     define (">=", GLUE_41);
00333     define ("<", GLUE_42);
00334     define (">", GLUE_43);
00335     define ("<=", GLUE_44);
00336     define (">=", GLUE_45);
00337     define ("<", GLUE_46);
00338     define (">", GLUE_47);
00339     define ("<=", GLUE_48);
00340     define (">=", GLUE_49);
00341     define ("<", GLUE_50);
00342     define (">", GLUE_51);
00343     define ("inf", GLUE_52);
00344     define ("sup", GLUE_53);
00345   }
00346 }