]> Dogcows Code - chaz/yoink/blobdiff - src/stlplus/portability/inf.hpp
cleanup stlplus files
[chaz/yoink] / src / stlplus / portability / inf.hpp
index f28541af6bf9ce7083ffb4f7b26aeb9c8f807321..c20acd4c7109be19f57d90d8f3f4b849dc6015f7 100644 (file)
-#ifndef STLPLUS_INF\r
-#define STLPLUS_INF\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
-//   Author:    Andy Rushton\r
-//   Copyright: (c) Southampton University 1999-2004\r
-//              (c) Andy Rushton           2004-2009\r
-//   License:   BSD License, see ../docs/license.html\r
-\r
-//   An infinite-precision integer class. This allows calculations on large\r
-//   integers to be performed without overflow.\r
-\r
-//   this class can throw the following exceptions:\r
-//     std::out_of_range\r
-//     std::overflow_error\r
-//     std::invalid_argument\r
-//     stlplus::divide_by_zero    // why doesn't std have this?\r
-//   all of these are derivations of the baseclass:\r
-//     std::logic_error\r
-//   So you can catch all of them by catching the baseclass\r
-\r
-//   Warning: inf was never intended to be fast, it is just for programs which\r
-//   need a bit of infinite-precision integer arithmetic. For high-performance\r
-//   processing, use the Gnu Multi-Precision (GMP) library. The inf type is just\r
-//   easier to integrate and is already ported to all platforms and compilers\r
-//   that STLplus is ported to.\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-#include "portability_fixes.hpp"\r
-#include "portability_exceptions.hpp"\r
-#include <string>\r
-#include <iostream>\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
-namespace stlplus\r
-{\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
-  class inf\r
-  {\r
-  public:\r
-\r
-    //////////////////////////////////////////////////////////////////////////////\r
-    // constructors and assignments initialise the inf\r
-\r
-    // the void constructor initialises to zero, the others initialise to the\r
-    // value of the C integer type or the text value contained in the string\r
-\r
-    inf(void);\r
-    explicit inf(short);\r
-    explicit inf(unsigned short);\r
-    explicit inf(int);\r
-    explicit inf(unsigned);\r
-    explicit inf(long);\r
-    explicit inf(unsigned long);\r
-    explicit inf(const std::string&) throw(std::invalid_argument);\r
-    inf(const inf&);\r
-\r
-    ~inf(void);\r
-\r
-    // assignments with equivalent behaviour to the constructors\r
-\r
-    inf& operator = (short);\r
-    inf& operator = (unsigned short);\r
-    inf& operator = (int);\r
-    inf& operator = (unsigned);\r
-    inf& operator = (long);\r
-    inf& operator = (unsigned long);\r
-    inf& operator = (const std::string&) throw(std::invalid_argument);\r
-    inf& operator = (const inf&);\r
-\r
-    //////////////////////////////////////////////////////////////////////////////\r
-    // conversions back to the C types\r
-    // truncate: controls the behaviour when the value is too long for the result\r
-    //           true: truncate the value\r
-    //           false: throw an exception\r
-\r
-    short to_short(bool truncate = true) const throw(std::overflow_error);\r
-    unsigned short to_unsigned_short(bool truncate = true) const throw(std::overflow_error);\r
-\r
-    int to_int(bool truncate = true) const throw(std::overflow_error);\r
-    unsigned to_unsigned(bool truncate = true) const throw(std::overflow_error);\r
-\r
-    long to_long(bool truncate = true) const throw(std::overflow_error);\r
-    unsigned long to_unsigned_long(bool truncate = true) const throw(std::overflow_error);\r
-\r
-    //////////////////////////////////////////////////////////////////////////////\r
-    // bitwise manipulation\r
-\r
-    void resize(unsigned bits);\r
-    void reduce(void);\r
-\r
-    // the number of significant bits in the value\r
-    unsigned bits (void) const;\r
-    unsigned size (void) const;\r
-\r
-    // the number of bits that can be accessed by the bit() method (=bits() rounded up to the next byte)\r
-    unsigned indexable_bits(void) const;\r
-\r
-    bool bit (unsigned index) const throw(std::out_of_range);\r
-    bool operator [] (unsigned index) const throw(std::out_of_range);\r
-\r
-    void set (unsigned index) throw(std::out_of_range);\r
-    void clear (unsigned index) throw(std::out_of_range);\r
-    void preset (unsigned index, bool value) throw(std::out_of_range);\r
-\r
-    inf slice(unsigned low, unsigned high) const throw(std::out_of_range);\r
-\r
-    //////////////////////////////////////////////////////////////////////////////\r
-    // tests for common values or ranges\r
-\r
-    bool negative (void) const;\r
-    bool natural (void) const;\r
-    bool positive (void) const;\r
-    bool zero (void) const;\r
-    bool non_zero (void) const;\r
-\r
-    // tests used in if(i) and if(!i)\r
-//  operator bool (void) const;\r
-    bool operator ! (void) const;\r
-\r
-    //////////////////////////////////////////////////////////////////////////////\r
-    // comparisons\r
-\r
-    bool operator == (const inf&) const;\r
-    bool operator != (const inf&) const;\r
-    bool operator < (const inf&) const;\r
-    bool operator <= (const inf&) const;\r
-    bool operator > (const inf&) const;\r
-    bool operator >= (const inf&) const;\r
-\r
-    //////////////////////////////////////////////////////////////////////////////\r
-    // bitwise logic operations\r
-\r
-    inf& invert (void);\r
-    inf operator ~ (void) const;\r
-\r
-    inf& operator &= (const inf&);\r
-    inf operator & (const inf&) const;\r
-\r
-    inf& operator |= (const inf&);\r
-    inf operator | (const inf&) const;\r
-\r
-    inf& operator ^= (const inf&);\r
-    inf operator ^ (const inf&) const;\r
-\r
-    inf& operator <<= (unsigned shift);\r
-    inf operator << (unsigned shift) const;\r
-\r
-    inf& operator >>= (unsigned shift);\r
-    inf operator >> (unsigned shift) const;\r
-\r
-    //////////////////////////////////////////////////////////////////////////////\r
-    // arithmetic operations\r
-\r
-    inf& negate (void);\r
-    inf operator - (void) const;\r
-\r
-    inf& abs(void);\r
-    friend inf abs(const inf&);\r
-\r
-    inf& operator += (const inf&);\r
-    inf operator + (const inf&) const;\r
-\r
-    inf& operator -= (const inf&);\r
-    inf operator - (const inf&) const;\r
-\r
-    inf& operator *= (const inf&);\r
-    inf operator * (const inf&) const;\r
-\r
-    inf& operator /= (const inf&) throw(divide_by_zero);\r
-    inf operator / (const inf&) const throw(divide_by_zero);\r
-\r
-    inf& operator %= (const inf&) throw(divide_by_zero);\r
-    inf operator % (const inf&) const throw(divide_by_zero);\r
-\r
-    // combined division operator - returns the result pair(quotient,remainder) in one go\r
-    std::pair<inf,inf> divide(const inf&) const throw(divide_by_zero);\r
-\r
-    //////////////////////////////////////////////////////////////////////////////\r
-    // pre- and post- increment and decrement\r
-\r
-    inf& operator ++ (void);\r
-    inf operator ++ (int);\r
-    inf& operator -- (void);\r
-    inf operator -- (int);\r
-\r
-    //////////////////////////////////////////////////////////////////////////////\r
-    // string representation and I/O\r
-\r
-    std::string image_debug(void) const;\r
-\r
-    // conversion to a string representation\r
-    // radix must be 10, 2, 8 or 16\r
-    std::string to_string(unsigned radix = 10) const\r
-      throw(std::invalid_argument);\r
-\r
-    // conversion from a string\r
-    // radix == 0 - radix is deduced from the input - assumed 10 unless number is prefixed by 0b, 0 or 0x\r
-    // however, you can specify the radix to be 10, 2, 8 or 16 to force that interpretation\r
-    inf& from_string(const std::string&, unsigned radix = 0)\r
-      throw(std::invalid_argument);\r
-\r
-    //////////////////////////////////////////////////////////////////////////////\r
-  private:\r
-    std::string m_data;\r
-  public:\r
-    const std::string& get_bytes(void) const;\r
-    void set_bytes(const std::string&);\r
-  };\r
-\r
-  ////////////////////////////////////////////////////////////////////////////////\r
-  // redefine friends for gcc v4.1\r
-\r
-  inf abs(const inf&);\r
-\r
-  ////////////////////////////////////////////////////////////////////////////////\r
-\r
-  std::ostream& operator << (std::ostream&, const inf&);\r
-  std::istream& operator >> (std::istream&, inf&);\r
-\r
-  ////////////////////////////////////////////////////////////////////////////////\r
-\r
-} // end namespace stlplus\r
-\r
-#endif\r
+#ifndef STLPLUS_INF
+#define STLPLUS_INF
+////////////////////////////////////////////////////////////////////////////////
+
+//   Author:    Andy Rushton
+//   Copyright: (c) Southampton University 1999-2004
+//              (c) Andy Rushton           2004-2009
+//   License:   BSD License, see ../docs/license.html
+
+//   An infinite-precision integer class. This allows calculations on large
+//   integers to be performed without overflow.
+
+//   this class can throw the following exceptions:
+//     std::out_of_range
+//     std::overflow_error
+//     std::invalid_argument
+//     stlplus::divide_by_zero    // why doesn't std have this?
+//   all of these are derivations of the baseclass:
+//     std::logic_error
+//   So you can catch all of them by catching the baseclass
+
+//   Warning: inf was never intended to be fast, it is just for programs which
+//   need a bit of infinite-precision integer arithmetic. For high-performance
+//   processing, use the Gnu Multi-Precision (GMP) library. The inf type is just
+//   easier to integrate and is already ported to all platforms and compilers
+//   that STLplus is ported to.
+
+////////////////////////////////////////////////////////////////////////////////
+#include "portability_fixes.hpp"
+#include "portability_exceptions.hpp"
+#include <string>
+#include <iostream>
+
+////////////////////////////////////////////////////////////////////////////////
+
+namespace stlplus
+{
+
+////////////////////////////////////////////////////////////////////////////////
+
+  class inf
+  {
+  public:
+
+    //////////////////////////////////////////////////////////////////////////////
+    // constructors and assignments initialise the inf
+
+    // the void constructor initialises to zero, the others initialise to the
+    // value of the C integer type or the text value contained in the string
+
+    inf(void);
+    explicit inf(short);
+    explicit inf(unsigned short);
+    explicit inf(int);
+    explicit inf(unsigned);
+    explicit inf(long);
+    explicit inf(unsigned long);
+    explicit inf(const std::string&) throw(std::invalid_argument);
+    inf(const inf&);
+
+    ~inf(void);
+
+    // assignments with equivalent behaviour to the constructors
+
+    inf& operator = (short);
+    inf& operator = (unsigned short);
+    inf& operator = (int);
+    inf& operator = (unsigned);
+    inf& operator = (long);
+    inf& operator = (unsigned long);
+    inf& operator = (const std::string&) throw(std::invalid_argument);
+    inf& operator = (const inf&);
+
+    //////////////////////////////////////////////////////////////////////////////
+    // conversions back to the C types
+    // truncate: controls the behaviour when the value is too long for the result
+    //           true: truncate the value
+    //           false: throw an exception
+
+    short to_short(bool truncate = true) const throw(std::overflow_error);
+    unsigned short to_unsigned_short(bool truncate = true) const throw(std::overflow_error);
+
+    int to_int(bool truncate = true) const throw(std::overflow_error);
+    unsigned to_unsigned(bool truncate = true) const throw(std::overflow_error);
+
+    long to_long(bool truncate = true) const throw(std::overflow_error);
+    unsigned long to_unsigned_long(bool truncate = true) const throw(std::overflow_error);
+
+    //////////////////////////////////////////////////////////////////////////////
+    // bitwise manipulation
+
+    void resize(unsigned bits);
+    void reduce(void);
+
+    // the number of significant bits in the value
+    unsigned bits (void) const;
+    unsigned size (void) const;
+
+    // the number of bits that can be accessed by the bit() method (=bits() rounded up to the next byte)
+    unsigned indexable_bits(void) const;
+
+    bool bit (unsigned index) const throw(std::out_of_range);
+    bool operator [] (unsigned index) const throw(std::out_of_range);
+
+    void set (unsigned index) throw(std::out_of_range);
+    void clear (unsigned index) throw(std::out_of_range);
+    void preset (unsigned index, bool value) throw(std::out_of_range);
+
+    inf slice(unsigned low, unsigned high) const throw(std::out_of_range);
+
+    //////////////////////////////////////////////////////////////////////////////
+    // tests for common values or ranges
+
+    bool negative (void) const;
+    bool natural (void) const;
+    bool positive (void) const;
+    bool zero (void) const;
+    bool non_zero (void) const;
+
+    // tests used in if(i) and if(!i)
+//  operator bool (void) const;
+    bool operator ! (void) const;
+
+    //////////////////////////////////////////////////////////////////////////////
+    // comparisons
+
+    bool operator == (const inf&) const;
+    bool operator != (const inf&) const;
+    bool operator < (const inf&) const;
+    bool operator <= (const inf&) const;
+    bool operator > (const inf&) const;
+    bool operator >= (const inf&) const;
+
+    //////////////////////////////////////////////////////////////////////////////
+    // bitwise logic operations
+
+    inf& invert (void);
+    inf operator ~ (void) const;
+
+    inf& operator &= (const inf&);
+    inf operator & (const inf&) const;
+
+    inf& operator |= (const inf&);
+    inf operator | (const inf&) const;
+
+    inf& operator ^= (const inf&);
+    inf operator ^ (const inf&) const;
+
+    inf& operator <<= (unsigned shift);
+    inf operator << (unsigned shift) const;
+
+    inf& operator >>= (unsigned shift);
+    inf operator >> (unsigned shift) const;
+
+    //////////////////////////////////////////////////////////////////////////////
+    // arithmetic operations
+
+    inf& negate (void);
+    inf operator - (void) const;
+
+    inf& abs(void);
+    friend inf abs(const inf&);
+
+    inf& operator += (const inf&);
+    inf operator + (const inf&) const;
+
+    inf& operator -= (const inf&);
+    inf operator - (const inf&) const;
+
+    inf& operator *= (const inf&);
+    inf operator * (const inf&) const;
+
+    inf& operator /= (const inf&) throw(divide_by_zero);
+    inf operator / (const inf&) const throw(divide_by_zero);
+
+    inf& operator %= (const inf&) throw(divide_by_zero);
+    inf operator % (const inf&) const throw(divide_by_zero);
+
+    // combined division operator - returns the result pair(quotient,remainder) in one go
+    std::pair<inf,inf> divide(const inf&) const throw(divide_by_zero);
+
+    //////////////////////////////////////////////////////////////////////////////
+    // pre- and post- increment and decrement
+
+    inf& operator ++ (void);
+    inf operator ++ (int);
+    inf& operator -- (void);
+    inf operator -- (int);
+
+    //////////////////////////////////////////////////////////////////////////////
+    // string representation and I/O
+
+    std::string image_debug(void) const;
+
+    // conversion to a string representation
+    // radix must be 10, 2, 8 or 16
+    std::string to_string(unsigned radix = 10) const
+      throw(std::invalid_argument);
+
+    // conversion from a string
+    // radix == 0 - radix is deduced from the input - assumed 10 unless number is prefixed by 0b, 0 or 0x
+    // however, you can specify the radix to be 10, 2, 8 or 16 to force that interpretation
+    inf& from_string(const std::string&, unsigned radix = 0)
+      throw(std::invalid_argument);
+
+    //////////////////////////////////////////////////////////////////////////////
+  private:
+    std::string m_data;
+  public:
+    const std::string& get_bytes(void) const;
+    void set_bytes(const std::string&);
+  };
+
+  ////////////////////////////////////////////////////////////////////////////////
+  // redefine friends for gcc v4.1
+
+  inf abs(const inf&);
+
+  ////////////////////////////////////////////////////////////////////////////////
+
+  std::ostream& operator << (std::ostream&, const inf&);
+  std::istream& operator >> (std::istream&, inf&);
+
+  ////////////////////////////////////////////////////////////////////////////////
+
+} // end namespace stlplus
+
+#endif
This page took 0.034378 seconds and 4 git commands to generate.