|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: I T
Length: 23976 (0x5da8) Types: TextFile Names: »Integer.h«
└─⟦a05ed705a⟧ Bits:30007078 DKUUG GNU 2/12/89 └─⟦cc8755de2⟧ »./libg++-1.36.1.tar.Z« └─⟦23757c458⟧ └─⟦this⟧ »libg++/g++-include/Integer.h«
// This may look like C code, but it is really -*- C++ -*- /* Copyright (C) 1988 Free Software Foundation written by Doug Lea (dl@rocky.oswego.edu) This file is part of GNU CC. GNU CC is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY. No author or distributor accepts responsibility to anyone for the consequences of using it or for whether it serves any particular purpose or works at all, unless he says so in writing. Refer to the GNU CC General Public License for full details. Everyone is granted permission to copy, modify and redistribute GNU CC, but only under the conditions described in the GNU CC General Public License. A copy of this license is supposed to have been given to you along with GNU CC so you can know your rights and responsibilities. It should be in a file named COPYING. Among other things, the copyright notice and this notice must be preserved on all copies. */ #ifndef _Integer_h #pragma once #define _Integer_h 1 #include <stream.h> struct IntRep // internal Integer representations { unsigned short len; // current length unsigned short sz; // allocated space short sgn; // 1 means >= 0; 0 means < 0 unsigned short s[1]; // represented as ushort array starting here friend IntRep* Ialloc(IntRep*, const unsigned short *, int, int, int); friend IntRep* Icopy_long(IntRep*, long); friend IntRep* Icopy(IntRep*, IntRep*); friend IntRep* Iresize(IntRep*, int); friend IntRep* add(IntRep*, int, IntRep*, int, IntRep*); friend IntRep* add(IntRep*, int, long, IntRep*); friend IntRep* multiply(IntRep*, IntRep*, IntRep*); friend IntRep* multiply(IntRep*, long, IntRep*); friend IntRep* lshift(IntRep*, long, IntRep*); friend IntRep* lshift(IntRep*, IntRep*, int, IntRep*); friend IntRep* bitop(IntRep*, IntRep*, IntRep*, char); friend IntRep* bitop(IntRep*, long, IntRep*, char); friend IntRep* power(IntRep*, long, IntRep*); friend IntRep* div(IntRep*, IntRep*, IntRep*); friend IntRep* mod(IntRep*, IntRep*, IntRep*); friend IntRep* div(IntRep*, long, IntRep*); friend IntRep* mod(IntRep*, long, IntRep*); friend IntRep* compl(IntRep*, IntRep*); friend IntRep* sqr(IntRep*); friend IntRep* pow(IntRep*, long); friend IntRep* gcd(IntRep*, IntRep* y); friend int compare(IntRep*, IntRep*); friend int compare(IntRep*, long); friend int ucompare(IntRep*, IntRep*); friend int ucompare(IntRep*, long); friend char* Itoa(IntRep* x, int base = 10, int width = 0); friend IntRep* atoIntRep(const char* s, int base = 10); friend long Itolong(IntRep*); friend double Itodouble(IntRep*); friend int Iislong(IntRep*); friend int Iisdouble(IntRep*); friend long lg(IntRep*); }; class IntTmp; class Integer { friend class IntTmp; protected: IntRep* rep; public: Integer(); Integer(long); Integer(Integer&); ~Integer(); void operator = (Integer&); void operator = (IntTmp&); void operator = (long); friend int operator == (Integer&, Integer&); friend int operator == (Integer&, long); friend int operator != (Integer&, Integer&); friend int operator != (Integer&, long); friend int operator < (Integer&, Integer&); friend int operator < (Integer&, long); friend int operator <= (Integer&, Integer&); friend int operator <= (Integer&, long); friend int operator > (Integer&, Integer&); friend int operator > (Integer&, long); friend int operator >= (Integer&, Integer&); friend int operator >= (Integer&, long); IntTmp operator - (); IntTmp operator ~ (); void operator ++ (); void operator -- (); IntTmp operator + (Integer&); IntTmp operator + (IntTmp&); IntTmp operator + (long); friend IntTmp operator + (long, Integer&); void operator += (Integer&); void operator += (long); IntTmp operator - (Integer&); IntTmp operator - (IntTmp&); IntTmp operator - (long); friend IntTmp operator - (long, Integer&); void operator -= (Integer&); void operator -= (long); IntTmp operator * (Integer&); IntTmp operator * (IntTmp&); IntTmp operator * (long); friend IntTmp operator * (long, Integer&); void operator *= (Integer&); void operator *= (long); IntTmp operator / (Integer&); IntTmp operator / (IntTmp&); IntTmp operator / (long); void operator /= (Integer&); void operator /= (long); IntTmp operator % (Integer&); IntTmp operator % (IntTmp&); IntTmp operator % (long); void operator %= (Integer&); void operator %= (long); IntTmp operator << (Integer&); IntTmp operator << (IntTmp&); IntTmp operator << (long); void operator <<=(Integer&); void operator <<=(long); IntTmp operator >> (Integer&); IntTmp operator >> (IntTmp&); IntTmp operator >> (long); void operator >>=(Integer&); void operator >>=(long); IntTmp operator & (Integer&); IntTmp operator & (IntTmp&); IntTmp operator & (long); friend IntTmp operator & (long, Integer&); void operator &= (Integer&); void operator &= (long); IntTmp operator | (Integer&); IntTmp operator | (IntTmp&); IntTmp operator | (long); friend IntTmp operator | (long, Integer&); void operator |= (Integer&); void operator |= (long); IntTmp operator ^ (Integer&); IntTmp operator ^ (IntTmp&); IntTmp operator ^ (long); friend IntTmp operator ^ (long, Integer&); void operator ^= (Integer&); void operator ^= (long); friend Integer& operator <? (Integer& x, Integer& y); // min friend Integer& operator >? (Integer& x, Integer& y); // max // builtin Integer functions friend int compare(Integer&, Integer&); // signed comparison friend int ucompare(Integer&, Integer&); // unsigned comparison void negate(); // negate in-place void abs(); // absolute-value in-place friend IntTmp abs(Integer&); // absolute value friend long lg (Integer&); // floor log base 2 of abs(x) friend IntTmp sqr(Integer&); // square friend Integer sqrt(Integer&); // floor of square root friend IntTmp gcd(Integer& x, Integer& y); // greatest common divisor friend IntTmp lcm(Integer& x, Integer& y); // least common multiple friend int even(Integer&); // true if even friend int odd(Integer&); // true if odd friend int sign(Integer&); // returns -1, 0, +1 friend IntTmp pow(Integer& x, Integer& y); // x to the y power friend IntTmp pow(Integer& x, long y); friend IntTmp Ipow(long x, long y); // x to the y as Integer friend void setbit(Integer& x, long b); // set b'th bit of x friend void clearbit(Integer& x, long b); // clear b'th bit friend int testbit(Integer& x, long b); // return b'th bit friend double ratio(Integer& x, Integer& y);// return x/y as a double friend void divide(Integer& x, Integer& y, Integer& q, Integer& r); friend void divide(Integer& x, long y, Integer& q, long& r); // coercion & conversion int fits_in_long(); int fits_in_double(); operator long(); operator double(); friend char* Itoa(Integer& x, int base = 10, int width = 0); friend IntTmp atoI(const char* s, int base = 10); friend istream& operator >> (istream& s, Integer& y); friend ostream& operator << (ostream& s, Integer& y); // miscellany void error(char* msg); int OK(); }; class IntTmp: public Integer { friend class Integer; public: IntTmp(IntRep*); IntTmp(Integer&); IntTmp(IntTmp&); ~IntTmp(); IntTmp operator + (IntTmp&); IntTmp operator + (Integer&); IntTmp operator + (long); friend IntTmp operator + (long, IntTmp&); IntTmp operator - (Integer&); IntTmp operator - (IntTmp&); IntTmp operator - (long); friend IntTmp operator - (long, IntTmp&); IntTmp operator * (Integer&); IntTmp operator * (IntTmp&); IntTmp operator * (long); friend IntTmp operator * (long, IntTmp&); IntTmp operator / (Integer&); IntTmp operator / (IntTmp&); IntTmp operator / (long); IntTmp operator % (Integer&); IntTmp operator % (IntTmp&); IntTmp operator % (long); IntTmp operator << (Integer&); IntTmp operator << (IntTmp&); IntTmp operator << (long); IntTmp operator >> (Integer&); IntTmp operator >> (IntTmp&); IntTmp operator >> (long); IntTmp operator & (Integer&); IntTmp operator & (IntTmp&); IntTmp operator & (long); friend IntTmp operator & (long, IntTmp&); IntTmp operator | (Integer&); IntTmp operator | (IntTmp&); IntTmp operator | (long); friend IntTmp operator | (long, IntTmp&); IntTmp operator ^ (Integer&); IntTmp operator ^ (IntTmp&); IntTmp operator ^ (long); friend IntTmp operator ^ (long, IntTmp&); IntTmp operator - (); IntTmp operator ~ (); friend IntTmp abs(IntTmp&); friend IntTmp sqr(IntTmp&); friend IntTmp pow(IntTmp& x, long y); }; char* dec(Integer& x, int width = 0); char* oct(Integer& x, int width = 0); char* hex(Integer& x, int width = 0); //#ifdef __OPTIMIZE__ inline Integer::Integer() { rep = 0; } inline Integer::Integer(long y) { rep = Icopy_long(0, y); } inline Integer::Integer(Integer& y) { rep = Icopy(0, y.rep); } inline Integer::~Integer() { delete rep; } inline void Integer::operator = (Integer& y) { rep = Icopy(rep, y.rep); } inline void Integer::operator = (IntTmp& y) { delete rep; rep = y.rep; y.rep = 0; } inline void Integer::operator = (long y) { rep = Icopy_long(rep, y); } inline Integer::operator long() { return Itolong(rep); } inline int Integer::fits_in_long() { return Iislong(rep); } inline Integer::operator double() { return Itodouble(rep); } inline int Integer::fits_in_double() { return Iisdouble(rep); } inline int compare(Integer& x, Integer& y) { return compare(x.rep, y.rep); } inline int ucompare(Integer& x, Integer& y) { return ucompare(x.rep, y.rep); } inline int operator == (Integer& x, Integer& y) { return compare(x.rep, y.rep) == 0; } inline int operator == (Integer& x, long y) { return compare(x.rep, y) == 0; } inline int operator != (Integer& x, Integer& y) { return compare(x.rep, y.rep) != 0; } inline int operator != (Integer& x, long y) { return compare(x.rep, y) != 0; } inline int operator < (Integer& x, Integer& y) { return compare(x.rep, y.rep) < 0; } inline int operator < (Integer& x, long y) { return compare(x.rep, y) < 0; } inline int operator <= (Integer& x, Integer& y) { return compare(x.rep, y.rep) <= 0; } inline int operator <= (Integer& x, long y) { return compare(x.rep, y) <= 0; } inline int operator > (Integer& x, Integer& y) { return compare(x.rep, y.rep) > 0; } inline int operator > (Integer& x, long y) { return compare(x.rep, y) > 0; } inline int operator >= (Integer& x, Integer& y) { return compare(x.rep, y.rep) >= 0; } inline int operator >= (Integer& x, long y) { return compare(x.rep, y) >= 0; } inline IntTmp::IntTmp(IntRep* y) { rep = y; } inline IntTmp::IntTmp(Integer& x) { rep = x.rep; x.rep = 0; } inline IntTmp::IntTmp(IntTmp& x) { rep = x.rep; x.rep = 0; } inline IntTmp::~IntTmp() {} inline IntTmp Integer::operator + (Integer& y) { return (add(rep, 0, y.rep, 0, 0)); } inline IntTmp Integer::operator + (IntTmp& y) { IntRep* r = add(rep, 0, y.rep, 0, y.rep); y.rep = 0; return r; } inline IntTmp Integer::operator + (long y) { return(add(rep, 0, y, 0)); } inline IntTmp operator + (long x, Integer& y) { return(add(y.rep, 0, x, 0)); } inline IntTmp IntTmp::operator + (Integer& y) { IntRep* r = add(rep, 0, y.rep, 0, rep); rep = 0; return r; } inline IntTmp IntTmp::operator + (IntTmp& y) { IntRep* r = add(rep, 0, y.rep, 0, rep); rep = 0; return r; } inline IntTmp IntTmp::operator + (long y) { IntRep* r = add(rep, 0, y, rep); rep = 0; return r; } inline IntTmp operator + (long y, IntTmp& x) { IntRep* r = add(x.rep, 0, y, x.rep); x.rep = 0; return r; } inline void Integer::operator += (Integer& y) { rep = add(rep, 0, y.rep, 0, rep); } inline void Integer::operator += (long y) { rep = add(rep, 0, y, rep); } inline void Integer::operator ++ () { rep = add(rep, 0, 1, rep); } inline IntTmp Integer::operator - (Integer& y) { return (add(rep, 0, y.rep, 1, 0)); } inline IntTmp Integer::operator - (IntTmp& y) { IntRep* r = add(rep, 0, y.rep, 1, y.rep); y.rep = 0; return r; } inline IntTmp Integer::operator - (long y) { return(add(rep, 0, -y, 0)); } inline IntTmp operator - (long x, Integer& y) { return(add(y.rep, 1, x, 0)); } inline IntTmp IntTmp::operator - (Integer& y) { IntRep* r = add(rep, 0, y.rep, 1, rep); rep = 0; return r; } inline IntTmp IntTmp::operator - (IntTmp& y) { IntRep* r = add(rep, 0, y.rep, 1, rep); rep = 0; return r; } inline IntTmp IntTmp::operator - (long y) { IntRep* r = add(rep, 0, -y, rep); rep = 0; return r; } inline IntTmp operator - (long y, IntTmp& x) { IntRep* r = add(x.rep, 1, y, x.rep); x.rep = 0; return r; } inline void Integer::operator -= (Integer& y) { rep = add(rep, 0, y.rep, 1, rep); } inline void Integer::operator -= (long y) { rep = add(rep, 0, -y, rep); } inline void Integer::operator -- () { rep = add(rep, 0, -1, rep); } inline IntTmp Integer::operator * (Integer& y) { return (multiply(rep, y.rep, 0)); } inline IntTmp Integer::operator * (IntTmp& y) { IntRep* r = multiply(rep, y.rep, y.rep); y.rep = 0; return r; } inline IntTmp Integer::operator * (long y) { return(multiply(rep, y, 0)); } inline IntTmp operator * (long x, Integer& y) { return(multiply(y.rep, x, 0)); } inline IntTmp IntTmp::operator * (Integer& y) { IntRep* r = multiply(rep, y.rep, rep); rep = 0; return r; } inline IntTmp IntTmp::operator * (IntTmp& y) { IntRep* r = multiply(rep, y.rep, rep); rep = 0; return r; } inline IntTmp IntTmp::operator * (long y) { IntRep* r = multiply(rep, y, rep); rep = 0; return r; } inline IntTmp operator * (long y, IntTmp& x) { IntRep* r = multiply(x.rep, y, x.rep); x.rep = 0; return r; } inline void Integer::operator *= (Integer& y) { rep = multiply(rep, y.rep, rep); } inline void Integer::operator *= (long y) { rep = multiply(rep, y, rep); } inline IntTmp sqr(Integer& x) { return(multiply(x.rep, x.rep, 0)); } inline IntTmp sqr(IntTmp& x) { IntRep* r = multiply(x.rep, x.rep, x.rep); x.rep = 0; return r; } inline IntTmp Integer::operator & (Integer& y) { return (bitop(rep, y.rep, 0, '&')); } inline IntTmp Integer::operator & (IntTmp& y) { IntRep* r = bitop(rep, y.rep, y.rep, '&'); y.rep = 0; return r; } inline IntTmp Integer::operator & (long y) { return(bitop(rep, y, 0, '&')); } inline IntTmp operator & (long x, Integer& y) { return(bitop(y.rep, x, 0, '&')); } inline IntTmp IntTmp::operator & (Integer& y) { IntRep* r = bitop(rep, y.rep, rep, '&'); rep = 0; return r; } inline IntTmp IntTmp::operator & (IntTmp& y) { IntRep* r = bitop(rep, y.rep, rep, '&'); rep = 0; return r; } inline IntTmp IntTmp::operator & (long y) { IntRep* r = bitop(rep, y, rep, '&'); rep = 0; return r; } inline IntTmp operator & (long y, IntTmp& x) { IntRep* r = bitop(x.rep, y, x.rep, '&'); x.rep = 0; return r; } inline void Integer::operator &= (Integer& y) { rep = bitop(rep, y.rep, rep, '&'); } inline void Integer::operator &= (long y) { rep = bitop(rep, y, rep, '&'); } inline IntTmp Integer::operator | (Integer& y) { return (bitop(rep, y.rep, 0, '|')); } inline IntTmp Integer::operator | (IntTmp& y) { IntRep* r = bitop(rep, y.rep, y.rep, '|'); y.rep = 0; return r; } inline IntTmp Integer::operator | (long y) { return(bitop(rep, y, 0, '|')); } inline IntTmp operator | (long x, Integer& y) { return(bitop(y.rep, x, 0, '|')); } inline IntTmp IntTmp::operator | (Integer& y) { IntRep* r = bitop(rep, y.rep, rep, '|'); rep = 0; return r; } inline IntTmp IntTmp::operator | (IntTmp& y) { IntRep* r = bitop(rep, y.rep, rep, '|'); rep = 0; return r; } inline IntTmp IntTmp::operator | (long y) { IntRep* r = bitop(rep, y, rep, '|'); rep = 0; return r; } inline IntTmp operator | (long y, IntTmp& x) { IntRep* r = bitop(x.rep, y, x.rep, '|'); x.rep = 0; return r; } inline void Integer::operator |= (Integer& y) { rep = bitop(rep, y.rep, rep, '|'); } inline void Integer::operator |= (long y) { rep = bitop(rep, y, rep, '|'); } inline IntTmp Integer::operator ^ (Integer& y) { return (bitop(rep, y.rep, 0, '^')); } inline IntTmp Integer::operator ^ (IntTmp& y) { IntRep* r = bitop(rep, y.rep, y.rep, '^'); y.rep = 0; return r; } inline IntTmp Integer::operator ^ (long y) { return(bitop(rep, y, 0, '^')); } inline IntTmp operator ^ (long x, Integer& y) { return(bitop(y.rep, x, 0, '^')); } inline IntTmp IntTmp::operator ^ (Integer& y) { IntRep* r = bitop(rep, y.rep, rep, '^'); rep = 0; return r; } inline IntTmp IntTmp::operator ^ (IntTmp& y) { IntRep* r = bitop(rep, y.rep, rep, '^'); rep = 0; return r; } inline IntTmp IntTmp::operator ^ (long y) { IntRep* r = bitop(rep, y, rep, '^'); rep = 0; return r; } inline IntTmp operator ^ (long y, IntTmp& x) { IntRep* r = bitop(x.rep, y, x.rep, '^'); x.rep = 0; return r; } inline void Integer::operator ^= (Integer& y) { rep = bitop(rep, y.rep, rep, '^'); } inline void Integer::operator ^= (long y) { rep = bitop(rep, y, rep, '^'); } inline IntTmp Integer::operator / (Integer& y) { return (div(rep, y.rep, 0)); } inline IntTmp Integer::operator / (IntTmp& y) { IntRep* r = div(rep, y.rep, y.rep); y.rep = 0; return r; } inline IntTmp Integer::operator / (long y) { return(div(rep, y, 0)); } inline IntTmp IntTmp::operator / (Integer& y) { IntRep* r = div(rep, y.rep, rep); rep = 0; return r; } inline IntTmp IntTmp::operator / (IntTmp& y) { IntRep* r = div(rep, y.rep, rep); rep = 0; return r; } inline IntTmp IntTmp::operator / (long y) { IntRep* r = div(rep, y, rep); rep = 0; return r; } inline void Integer::operator /= (Integer& y) { rep = div(rep, y.rep, rep); } inline void Integer::operator /= (long y) { rep = div(rep, y, rep); } inline IntTmp Integer::operator % (Integer& y) { return (mod(rep, y.rep, 0)); } inline IntTmp Integer::operator % (IntTmp& y) { IntRep* r = mod(rep, y.rep, y.rep); y.rep = 0; return r; } inline IntTmp Integer::operator % (long y) { return(mod(rep, y, 0)); } inline IntTmp IntTmp::operator % (Integer& y) { IntRep* r = mod(rep, y.rep, rep); rep = 0; return r; } inline IntTmp IntTmp::operator % (IntTmp& y) { IntRep* r = mod(rep, y.rep, rep); rep = 0; return r; } inline IntTmp IntTmp::operator % (long y) { IntRep* r = mod(rep, y, rep); rep = 0; return r; } inline void Integer::operator %= (Integer& y) { rep = mod(rep, y.rep, rep); } inline void Integer::operator %= (long y) { rep = mod(rep, y, rep); } inline IntTmp Integer::operator << (Integer& y) { return (lshift(rep, y.rep, 0, 0)); } inline IntTmp Integer::operator << (IntTmp& y) { IntRep* r = lshift(rep, y.rep, 0, y.rep); y.rep = 0; return r; } inline IntTmp Integer::operator << (long y) { return(lshift(rep, y, 0)); } inline IntTmp IntTmp::operator << (Integer& y) { IntRep* r = lshift(rep, y.rep, 0, rep); rep = 0; return r; } inline IntTmp IntTmp::operator << (IntTmp& y) { IntRep* r = lshift(rep, y.rep, 0, rep); rep = 0; return r; } inline IntTmp IntTmp::operator << (long y) { IntRep* r = lshift(rep, y, rep); rep = 0; return r; } inline void Integer::operator <<= (Integer& y) { rep = lshift(rep, y.rep, 0, rep); } inline void Integer::operator <<= (long y) { rep = lshift(rep, y, rep); } inline IntTmp Integer::operator >> (Integer& y) { return (lshift(rep, y.rep, 1, 0)); } inline IntTmp Integer::operator >> (IntTmp& y) { IntRep* r = lshift(rep, y.rep, 1, y.rep); y.rep = 0; return r; } inline IntTmp Integer::operator >> (long y) { return(lshift(rep, -y, 0)); } inline IntTmp IntTmp::operator >> (Integer& y) { IntRep* r = lshift(rep, y.rep, 1, rep); rep = 0; return r; } inline IntTmp IntTmp::operator >> (IntTmp& y) { IntRep* r = lshift(rep, y.rep, 1, rep); rep = 0; return r; } inline IntTmp IntTmp::operator >> (long y) { IntRep* r = lshift(rep, -y, rep); rep = 0; return r; } inline void Integer::operator >>= (Integer& y) { rep = lshift(rep, y.rep, 1, rep); } inline void Integer::operator >>= (long y) { rep = lshift(rep, -y, rep); } inline Integer& operator <? (Integer& x, Integer& y) { return (compare(x.rep, y.rep) <= 0) ? x : y; } inline Integer& operator >? (Integer& x, Integer& y) { return (compare(x.rep, y.rep) >= 0)? x : y; } inline int sign(Integer& x) { return (x.rep->len == 0) ? 0 : ( (x.rep->sgn == 1) ? 1 : -1 ); } inline IntTmp abs(Integer& x) { return(Ialloc(0, x.rep->s, x.rep->len, 1, x.rep->len)); } inline IntTmp abs(IntTmp& x) { IntRep* r = x.rep; r->sgn = 1; x.rep = 0; return r; } inline void Integer::abs() { rep->sgn = 1; } inline void Integer::negate() { if (rep->len != 0) rep->sgn = !rep->sgn; } inline IntTmp Integer::operator - () { int sgn = (rep->len == 0)? rep->sgn : !rep->sgn; return(Ialloc(0, rep->s, rep->len, sgn, rep->len)); } inline IntTmp IntTmp::operator - () { IntRep* r = rep; if (r->len != 0) r->sgn = !r->sgn; rep = 0; return r; } inline IntTmp pow(Integer& x, long y) { return(power(x.rep, y, 0)); } inline IntTmp Ipow(long x, long y) { IntRep* r = Icopy_long(0, x); return(power(r, y, r)); } inline IntTmp pow(Integer& x, Integer& y) { long yy = long(y); return power(x.rep, yy, 0); // not incorrect! } inline IntTmp pow(IntTmp& x, long y) { IntRep* r = power(x.rep, y, x.rep); x.rep = 0; return r; } inline int even(Integer& y) { return y.rep->len == 0 || !(y.rep->s[0] & 1); } inline int odd(Integer& y) { return y.rep->len > 0 && (y.rep->s[0] & 1); } inline char* Itoa(Integer& y, int base = 10, int width = 0) { return Itoa(y.rep, base, width); } inline IntTmp atoI(const char* s, int base = 10) { return atoIntRep(s, base); } inline ostream& operator << (ostream& s, Integer& y) { return s << Itoa(y.rep); } inline IntTmp Integer::operator ~ () { return compl(rep, 0); } inline IntTmp IntTmp::operator ~ () { IntRep* r = compl(rep, rep); rep = 0; return r; } inline IntTmp gcd(Integer& x, Integer& y) { return gcd(x.rep, y.rep); } inline long lg(Integer& x) { return lg(x.rep); } //#endif #endif