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 <numerix/modular.hpp>
00008 #include <numerix/modular_integer.hpp>
00009 #include <basix/alias.hpp>
00010 #include <basix/tuple.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 bool
00020 GLUE_1 (const generic &arg_1) {
00021 return is_vector (arg_1);
00022 }
00023
00024 static bool
00025 GLUE_2 (const generic &arg_1) {
00026 return generic_is_string (arg_1);
00027 }
00028
00029 static int
00030 GLUE_3 (const string &arg_1) {
00031 return N (arg_1);
00032 }
00033
00034 static string
00035 GLUE_4 (const string &arg_1, const int &arg_2, const int &arg_3) {
00036 return arg_1 (arg_2, arg_3);
00037 }
00038
00039 static string
00040 GLUE_5 (const string &arg_1, const string &arg_2) {
00041 return arg_1 * arg_2;
00042 }
00043
00044 static string
00045 GLUE_6 (const string &arg_1, const string &arg_2) {
00046 return arg_1 * arg_2;
00047 }
00048
00049 static alias<string>
00050 GLUE_7 (const alias<string> &arg_1, const string &arg_2) {
00051 return alias_write (arg_1, arg_2);
00052 }
00053
00054 static bool
00055 GLUE_8 (const string &arg_1, const string &arg_2) {
00056 return arg_1 < arg_2;
00057 }
00058
00059 static bool
00060 GLUE_9 (const string &arg_1, const string &arg_2) {
00061 return arg_1 <= arg_2;
00062 }
00063
00064 static bool
00065 GLUE_10 (const string &arg_1, const string &arg_2) {
00066 return arg_1 > arg_2;
00067 }
00068
00069 static bool
00070 GLUE_11 (const string &arg_1, const string &arg_2) {
00071 return arg_1 >= arg_2;
00072 }
00073
00074 static bool
00075 GLUE_12 (const string &arg_1, const string &arg_2) {
00076 return starts (arg_1, arg_2);
00077 }
00078
00079 static bool
00080 GLUE_13 (const string &arg_1, const string &arg_2) {
00081 return ends (arg_1, arg_2);
00082 }
00083
00084 static string
00085 GLUE_14 (const string &arg_1, const string &arg_2, const string &arg_3) {
00086 return replace (arg_1, arg_2, arg_3);
00087 }
00088
00089 static int
00090 GLUE_15 (const string &arg_1, const string &arg_2, const int &arg_3) {
00091 return search_forwards (arg_1, arg_2, arg_3);
00092 }
00093
00094 static int
00095 GLUE_16 (const string &arg_1, const string &arg_2, const int &arg_3) {
00096 return search_backwards (arg_1, arg_2, arg_3);
00097 }
00098
00099 static string
00100 GLUE_17 (const string &arg_1) {
00101 return upcase (arg_1);
00102 }
00103
00104 static string
00105 GLUE_18 (const string &arg_1) {
00106 return locase (arg_1);
00107 }
00108
00109 static string
00110 GLUE_19 (const string &arg_1) {
00111 return upcase_first (arg_1);
00112 }
00113
00114 static string
00115 GLUE_20 (const string &arg_1) {
00116 return locase_first (arg_1);
00117 }
00118
00119 static string
00120 GLUE_21 (const string &arg_1) {
00121 return quote (arg_1);
00122 }
00123
00124 static string
00125 GLUE_22 (const string &arg_1) {
00126 return unquote (arg_1);
00127 }
00128
00129 static string
00130 GLUE_23 (const int &arg_1) {
00131 return charcode_as_string (arg_1);
00132 }
00133
00134 static int
00135 GLUE_24 (const string &arg_1) {
00136 return string_as_charcode (arg_1);
00137 }
00138
00139 static bool
00140 GLUE_25 (const generic &arg_1) {
00141 return is_generic_literal (arg_1);
00142 }
00143
00144 static generic
00145 GLUE_26 (const literal &arg_1, const tuple<generic> &arg_2) {
00146 return gen_literal_apply (arg_1, as_vector (arg_2));
00147 }
00148
00149 static generic
00150 GLUE_27 (const literal &arg_1, const tuple<generic> &arg_2) {
00151 return gen_literal_access (arg_1, as_vector (arg_2));
00152 }
00153
00154 static literal
00155 GLUE_28 (const string &arg_1) {
00156 return literal (arg_1);
00157 }
00158
00159 static string
00160 GLUE_29 (const literal &arg_1) {
00161 return *arg_1;
00162 }
00163
00164 static generic
00165 GLUE_30 (const int &arg_1) {
00166 return integer_construct (arg_1);
00167 }
00168
00169 static modulus<int>
00170 GLUE_31 (const int &arg_1) {
00171 return modulus<int > (arg_1);
00172 }
00173
00174 static modulus<int>
00175 GLUE_32 (const int &arg_1) {
00176 return modulus<int > (arg_1);
00177 }
00178
00179 static int
00180 GLUE_33 (const modulus<int> &arg_1) {
00181 return *arg_1;
00182 }
00183
00184 static mmx_modular(int)
00185 GLUE_34 (const int &arg_1, const int &arg_2) {
00186 return (mmx_modular(int ) (arg_1, arg_2));
00187 }
00188
00189 static mmx_modular(int)
00190 GLUE_35 (const int &arg_1, const modulus<int> &arg_2) {
00191 return (mmx_modular(int ) (arg_1, arg_2));
00192 }
00193
00194 static mmx_modular(int)
00195 GLUE_36 (const int &arg_1, const modulus<int> &arg_2) {
00196 return (mmx_modular(int ) (arg_1, arg_2));
00197 }
00198
00199 static modulus<int>
00200 GLUE_37 (const mmx_modular(int) &arg_1) {
00201 return get_modulus (arg_1);
00202 }
00203
00204 static int
00205 GLUE_38 (const mmx_modular(int) &arg_1) {
00206 return *arg_1;
00207 }
00208
00209 static mmx_modular(int)
00210 GLUE_39 (const mmx_modular(int) &arg_1) {
00211 return -arg_1;
00212 }
00213
00214 static mmx_modular(int)
00215 GLUE_40 (const mmx_modular(int) &arg_1) {
00216 return square (arg_1);
00217 }
00218
00219 static mmx_modular(int)
00220 GLUE_41 (const mmx_modular(int) &arg_1, const mmx_modular(int) &arg_2) {
00221 return arg_1 + arg_2;
00222 }
00223
00224 static mmx_modular(int)
00225 GLUE_42 (const mmx_modular(int) &arg_1, const mmx_modular(int) &arg_2) {
00226 return arg_1 - arg_2;
00227 }
00228
00229 static mmx_modular(int)
00230 GLUE_43 (const mmx_modular(int) &arg_1, const mmx_modular(int) &arg_2) {
00231 return arg_1 * arg_2;
00232 }
00233
00234 static mmx_modular(int)
00235 GLUE_44 (const int &arg_1, const mmx_modular(int) &arg_2) {
00236 return arg_1 + arg_2;
00237 }
00238
00239 static mmx_modular(int)
00240 GLUE_45 (const mmx_modular(int) &arg_1, const int &arg_2) {
00241 return arg_1 + arg_2;
00242 }
00243
00244 static mmx_modular(int)
00245 GLUE_46 (const int &arg_1, const mmx_modular(int) &arg_2) {
00246 return arg_1 - arg_2;
00247 }
00248
00249 static mmx_modular(int)
00250 GLUE_47 (const mmx_modular(int) &arg_1, const int &arg_2) {
00251 return arg_1 - arg_2;
00252 }
00253
00254 static mmx_modular(int)
00255 GLUE_48 (const int &arg_1, const mmx_modular(int) &arg_2) {
00256 return arg_1 * arg_2;
00257 }
00258
00259 static mmx_modular(int)
00260 GLUE_49 (const mmx_modular(int) &arg_1, const int &arg_2) {
00261 return arg_1 * arg_2;
00262 }
00263
00264 static mmx_modular(int)
00265 GLUE_50 (const mmx_modular(int) &arg_1, const mmx_modular(int) &arg_2) {
00266 return arg_1 / arg_2;
00267 }
00268
00269 static mmx_modular(int)
00270 GLUE_51 (const int &arg_1, const mmx_modular(int) &arg_2) {
00271 return arg_1 / arg_2;
00272 }
00273
00274 static mmx_modular(int)
00275 GLUE_52 (const mmx_modular(int) &arg_1, const int &arg_2) {
00276 return arg_1 / arg_2;
00277 }
00278
00279 static mmx_modular(int)
00280 GLUE_53 (const mmx_modular(int) &arg_1, const int &arg_2) {
00281 return binpow (arg_1, arg_2);
00282 }
00283
00284 static bool
00285 GLUE_54 (const mmx_modular(int) &arg_1, const mmx_modular(int) &arg_2) {
00286 return arg_1 == arg_2;
00287 }
00288
00289 static bool
00290 GLUE_55 (const mmx_modular(int) &arg_1, const mmx_modular(int) &arg_2) {
00291 return arg_1 != arg_2;
00292 }
00293
00294 static bool
00295 GLUE_56 (const mmx_modular(int) &arg_1, const int &arg_2) {
00296 return arg_1 == arg_2;
00297 }
00298
00299 static bool
00300 GLUE_57 (const mmx_modular(int) &arg_1, const int &arg_2) {
00301 return arg_1 != arg_2;
00302 }
00303
00304 static bool
00305 GLUE_58 (const int &arg_1, const mmx_modular(int) &arg_2) {
00306 return arg_1 == arg_2;
00307 }
00308
00309 static bool
00310 GLUE_59 (const int &arg_1, const mmx_modular(int) &arg_2) {
00311 return arg_1 != arg_2;
00312 }
00313
00314 void
00315 glue_modular_int () {
00316 static bool done = false;
00317 if (done) return;
00318 done = true;
00319 call_glue (string ("glue_int"));
00320 define ("vector?", GLUE_1);
00321 define ("string?", GLUE_2);
00322 define ("#", GLUE_3);
00323 define (".[]", GLUE_4);
00324 define ("*", GLUE_5);
00325 define ("><", GLUE_6);
00326 define ("<<", GLUE_7);
00327 define ("<", GLUE_8);
00328 define ("<=", GLUE_9);
00329 define (">", GLUE_10);
00330 define (">=", GLUE_11);
00331 define ("starts?", GLUE_12);
00332 define ("ends?", GLUE_13);
00333 define ("replace", GLUE_14);
00334 define ("search_forwards", GLUE_15);
00335 define ("search_backwards", GLUE_16);
00336 define ("upcase", GLUE_17);
00337 define ("locase", GLUE_18);
00338 define ("upcase_first", GLUE_19);
00339 define ("locase_first", GLUE_20);
00340 define ("quote", GLUE_21);
00341 define ("unquote", GLUE_22);
00342 define ("ascii", GLUE_23);
00343 define ("ascii_code", GLUE_24);
00344 define ("literal?", GLUE_25);
00345 define (".()", GLUE_26);
00346 define (".[]", GLUE_27);
00347 define ("as_literal", GLUE_28);
00348 define ("as_string", GLUE_29);
00349 define_constructor<int > (GLUE_30);
00350 define_type<modulus<int> > (gen (lit ("Modulus"), lit ("Int")));
00351 define_type<mmx_modular(int) > (gen (lit ("Modular"), lit ("Int")));
00352 define ("modulus", GLUE_31);
00353 define_converter ("upgrade", GLUE_32, PENALTY_HOMOMORPHISM);
00354 define_converter (":>", GLUE_33, PENALTY_CAST);
00355 define ("modular", GLUE_34);
00356 define ("modular", GLUE_35);
00357 define ("mod", GLUE_36);
00358 define ("get_modulus", GLUE_37);
00359 define ("preimage", GLUE_38);
00360 define ("-", GLUE_39);
00361 define ("square", GLUE_40);
00362 define ("+", GLUE_41);
00363 define ("-", GLUE_42);
00364 define ("*", GLUE_43);
00365 define ("+", GLUE_44);
00366 define ("+", GLUE_45);
00367 define ("-", GLUE_46);
00368 define ("-", GLUE_47);
00369 define ("*", GLUE_48);
00370 define ("*", GLUE_49);
00371 define ("/", GLUE_50);
00372 define ("/", GLUE_51);
00373 define ("/", GLUE_52);
00374 define ("^", GLUE_53);
00375 define ("=", GLUE_54);
00376 define ("!=", GLUE_55);
00377 define ("=", GLUE_56);
00378 define ("!=", GLUE_57);
00379 define ("=", GLUE_58);
00380 define ("!=", GLUE_59);
00381 }
00382 }