00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #include <string.h>
00014 #include <numerix/rational.hpp>
00015 #include <basix/evaluator.hpp>
00016 #include <basix/literal.hpp>
00017 namespace mmx {
00018
00019 string
00020 as_string (const integer& i) {
00021 char* s= mpz_get_str (NULL, 10, *i);
00022 string r= s;
00023 mmx_free (s, strlen (s) + 1);
00024
00025
00026
00027
00028
00029 return r;
00030 }
00031
00032 generic
00033 construct (const integer& i) {
00034 return construct (as<generic> (i));
00035 }
00036
00037 generic
00038 construct (const rational& x) {
00039 return construct (as<generic> (x));
00040 }
00041
00042 syntactic
00043 flatten (const integer& i) {
00044 return syntactic (as_string (i));
00045 }
00046
00047 syntactic
00048 flatten (const rational& x) {
00049 if (denominator (x) == 1) return flatten (numerator (x));
00050 return flatten (numerator (x)) / flatten (denominator (x));
00051 }
00052
00053 void
00054 mpz_binary_write (const port& p, const mpz_t arg) {
00055 int n= arg->_mp_size;
00056 nat a= (nat) (n<0? -n: n);
00057 binary_write<int> (p, n);
00058 for (nat i=0; i<a; i++)
00059 binary_write<mp_limb_t> (p, arg->_mp_d[i]);
00060 }
00061
00062 void
00063 mpz_binary_read (const port& p, mpz_t dest) {
00064 int n= binary_read<int> (p);
00065 nat a= (nat) (n<0? -n: n);
00066 (void) _mpz_realloc (dest, a);
00067 for (nat i=0; i<a; i++)
00068 dest->_mp_d[i]= binary_read<mp_limb_t> (p);
00069 dest->_mp_size= n;
00070 }
00071
00072 void
00073 numeric_to_string (const integer& x, string& s) {
00074 s= as_string (x);
00075 }
00076
00077 bool
00078 string_to_numeric (const string& s, integer& val) {
00079 val= integer (s);
00080 return is_integer_string (s);
00081 }
00082
00083 bool
00084 is_literal_integer (const literal& l) {
00085 return is_integer_string (*l);
00086 }
00087
00088 integer
00089 as_literal_integer (const literal& l) {
00090 return integer (*l);
00091 }
00092
00093 }