home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 7 / FreshFishVol7.bin / bbs / gnu / libg++-2.6-fsf.lha / libg++-2.6 / libg++ / src / Integer.h < prev    next >
C/C++ Source or Header  |  1994-05-11  |  27KB  |  1,120 lines

  1. // This may look like C code, but it is really -*- C++ -*-
  2.  
  3. /* 
  4. Copyright (C) 1988 Free Software Foundation
  5.     written by Doug Lea (dl@rocky.oswego.edu)
  6.  
  7. This file is part of the GNU C++ Library.  This library is free
  8. software; you can redistribute it and/or modify it under the terms of
  9. the GNU Library General Public License as published by the Free
  10. Software Foundation; either version 2 of the License, or (at your
  11. option) any later version.  This library is distributed in the hope
  12. that it will be useful, but WITHOUT ANY WARRANTY; without even the
  13. implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  14. PURPOSE.  See the GNU Library General Public License for more details.
  15. You should have received a copy of the GNU Library General Public
  16. License along with this library; if not, write to the Free Software
  17. Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  18. */
  19.  
  20. #ifndef _Integer_h
  21. #ifdef __GNUG__
  22. #pragma interface
  23. #endif
  24. #define _Integer_h 1
  25.  
  26. #include <iostream.h>
  27.  
  28. struct IntRep                    // internal Integer representations
  29. {
  30.   unsigned short  len;          // current length
  31.   unsigned short  sz;           // allocated space (0 means static).
  32.   short           sgn;          // 1 means >= 0; 0 means < 0 
  33.   unsigned short  s[1];         // represented as ushort array starting here
  34. };
  35.  
  36. // True if REP is staticly (or manually) allocated,
  37. // and should not be deleted by an Integer destructor.
  38. #define STATIC_IntRep(rep) ((rep)->sz==0)
  39.  
  40. extern IntRep*  Ialloc(IntRep*, const unsigned short *, int, int, int);
  41. extern IntRep*  Icalloc(IntRep*, int);
  42. extern IntRep*  Icopy_ulong(IntRep*, unsigned long);
  43. extern IntRep*  Icopy_long(IntRep*, long);
  44. extern IntRep*  Icopy(IntRep*, const IntRep*);
  45. extern IntRep*  Iresize(IntRep*, int);
  46. extern IntRep*  add(const IntRep*, int, const IntRep*, int, IntRep*);
  47. extern IntRep*  add(const IntRep*, int, long, IntRep*);
  48. extern IntRep*  multiply(const IntRep*, const IntRep*, IntRep*);
  49. extern IntRep*  multiply(const IntRep*, long, IntRep*);
  50. extern IntRep*  lshift(const IntRep*, long, IntRep*);
  51. extern IntRep*  lshift(const IntRep*, const IntRep*, int, IntRep*);
  52. extern IntRep*  bitop(const IntRep*, const IntRep*, IntRep*, char);
  53. extern IntRep*  bitop(const IntRep*, long, IntRep*, char);
  54. extern IntRep*  power(const IntRep*, long, IntRep*);
  55. extern IntRep*  div(const IntRep*, const IntRep*, IntRep*);
  56. extern IntRep*  mod(const IntRep*, const IntRep*, IntRep*);
  57. extern IntRep*  div(const IntRep*, long, IntRep*);
  58. extern IntRep*  mod(const IntRep*, long, IntRep*);
  59. extern IntRep*  compl(const IntRep*, IntRep*);
  60. extern IntRep*  abs(const IntRep*, IntRep*);
  61. extern IntRep*  negate(const IntRep*, IntRep*);
  62. extern IntRep*  pow(const IntRep*, long);
  63. extern IntRep*  gcd(const IntRep*, const IntRep* y);
  64. extern int      compare(const IntRep*, const IntRep*);
  65. extern int      compare(const IntRep*, long);
  66. extern int      ucompare(const IntRep*, const IntRep*);
  67. extern int      ucompare(const IntRep*, long);
  68. extern char*    Itoa(const IntRep* x, int base = 10, int width = 0);
  69. extern char*    cvtItoa(const IntRep* x, char* fmt, int& fmtlen, int base,
  70.                         int showbase, int width, int align_right, 
  71.                         char fillchar, char Xcase, int showpos);
  72. extern IntRep*  atoIntRep(const char* s, int base = 10);
  73. extern long     Itolong(const IntRep*);
  74. extern int      Iislong(const IntRep*);
  75. extern long     lg(const IntRep*);
  76.  
  77. extern IntRep _ZeroRep, _OneRep, _MinusOneRep;
  78.  
  79. class Integer
  80. {
  81. protected:
  82.   IntRep*         rep;
  83. public:
  84.                   Integer();
  85.                   Integer(int);
  86.                   Integer(long);
  87.                   Integer(unsigned long);
  88.                   Integer(IntRep*);
  89.                   Integer(const Integer&);
  90.  
  91.                   ~Integer();
  92.   Integer&        operator =  (const Integer&);
  93.   Integer&        operator =  (long);
  94.  
  95. // unary operations to self
  96.  
  97.   Integer&        operator ++ ();
  98.   Integer&        operator -- ();
  99.   void            negate();          // negate in-place
  100.   void            abs();             // absolute-value in-place
  101.   void            complement();      // bitwise complement in-place
  102.  
  103. // assignment-based operations
  104.  
  105.   Integer&        operator += (const Integer&);
  106.   Integer&        operator -= (const Integer&);
  107.   Integer&        operator *= (const Integer&);
  108.   Integer&        operator /= (const Integer&);
  109.   Integer&        operator %= (const Integer&);
  110.   Integer&        operator <<=(const Integer&);
  111.   Integer&        operator >>=(const Integer&);
  112.   Integer&        operator &= (const Integer&);
  113.   Integer&        operator |= (const Integer&);
  114.   Integer&        operator ^= (const Integer&);
  115.  
  116.   Integer&        operator += (long);
  117.   Integer&        operator -= (long);
  118.   Integer&        operator *= (long);
  119.   Integer&        operator /= (long);
  120.   Integer&        operator %= (long);
  121.   Integer&        operator <<=(long);
  122.   Integer&        operator >>=(long);
  123.   Integer&        operator &= (long);
  124.   Integer&        operator |= (long);
  125.   Integer&        operator ^= (long);
  126.  
  127. // (constructive binary operations are inlined below)
  128.  
  129. #if defined (__GNUG__) && ! defined (__STRICT_ANSI__)
  130.   friend Integer operator <? (const Integer& x, const Integer& y); // min
  131.   friend Integer operator >? (const Integer& x, const Integer& y); // max
  132. #endif
  133.  
  134. // builtin Integer functions that must be friends
  135.  
  136.   friend long     lg (const Integer&); // floor log base 2 of abs(x)
  137.   friend double   ratio(const Integer& x, const Integer& y);
  138.                   // return x/y as a double
  139.  
  140.   friend Integer  gcd(const Integer&, const Integer&);
  141.   friend int      even(const Integer&); // true if even
  142.   friend int      odd(const Integer&); // true if odd
  143.   friend int      sign(const Integer&); // returns -1, 0, +1
  144.  
  145.   friend void     (setbit)(Integer& x, long b);   // set b'th bit of x
  146.   friend void     clearbit(Integer& x, long b); // clear b'th bit
  147.   friend int      testbit(const Integer& x, long b);  // return b'th bit
  148.  
  149. // procedural versions of operators
  150.  
  151.   friend void     abs(const Integer& x, Integer& dest);
  152.   friend void     negate(const Integer& x, Integer& dest);
  153.   friend void     complement(const Integer& x, Integer& dest);
  154.  
  155.   friend int      compare(const Integer&, const Integer&);  
  156.   friend int      ucompare(const Integer&, const Integer&); 
  157.   friend void     add(const Integer& x, const Integer& y, Integer& dest);
  158.   friend void     sub(const Integer& x, const Integer& y, Integer& dest);
  159.   friend void     mul(const Integer& x, const Integer& y, Integer& dest);
  160.   friend void     div(const Integer& x, const Integer& y, Integer& dest);
  161.   friend void     mod(const Integer& x, const Integer& y, Integer& dest);
  162.   friend void     divide(const Integer& x, const Integer& y, 
  163.                          Integer& q, Integer& r);
  164.   friend void     and(const Integer& x, const Integer& y, Integer& dest);
  165.   friend void     or(const Integer& x, const Integer& y, Integer& dest);
  166.   friend void     xor(const Integer& x, const Integer& y, Integer& dest);
  167.   friend void     lshift(const Integer& x, const Integer& y, Integer& dest);
  168.   friend void     rshift(const Integer& x, const Integer& y, Integer& dest);
  169.   friend void     pow(const Integer& x, const Integer& y, Integer& dest);
  170.  
  171.   friend int      compare(const Integer&, long);  
  172.   friend int      ucompare(const Integer&, long); 
  173.   friend void     add(const Integer& x, long y, Integer& dest);
  174.   friend void     sub(const Integer& x, long y, Integer& dest);
  175.   friend void     mul(const Integer& x, long y, Integer& dest);
  176.   friend void     div(const Integer& x, long y, Integer& dest);
  177.   friend void     mod(const Integer& x, long y, Integer& dest);
  178.   friend void     divide(const Integer& x, long y, Integer& q, long& r);
  179.   friend void     and(const Integer& x, long y, Integer& dest);
  180.   friend void     or(const Integer& x, long y, Integer& dest);
  181.   friend void     xor(const Integer& x, long y, Integer& dest);
  182.   friend void     lshift(const Integer& x, long y, Integer& dest);
  183.   friend void     rshift(const Integer& x, long y, Integer& dest);
  184.   friend void     pow(const Integer& x, long y, Integer& dest);
  185.  
  186.   friend int      compare(long, const Integer&);  
  187.   friend int      u