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 }