00001 /*========================================================================= 00002 00003 Program: Visualization Toolkit 00004 Module: $RCSfile: vtkLargeInteger.h,v $ 00005 Language: C++ 00006 00007 Copyright (c) 1993-2001 Ken Martin, Will Schroeder, Bill Lorensen 00008 All rights reserved. 00009 00010 Redistribution and use in source and binary forms, with or without 00011 modification, are permitted provided that the following conditions are met: 00012 00013 * Redistributions of source code must retain the above copyright notice, 00014 this list of conditions and the following disclaimer. 00015 00016 * Redistributions in binary form must reproduce the above copyright notice, 00017 this list of conditions and the following disclaimer in the documentation 00018 and/or other materials provided with the distribution. 00019 00020 * Neither name of Ken Martin, Will Schroeder, or Bill Lorensen nor the names 00021 of any contributors may be used to endorse or promote products derived 00022 from this software without specific prior written permission. 00023 00024 * Modified source versions must be plainly marked as such, and must not be 00025 misrepresented as being the original software. 00026 00027 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' 00028 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00029 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00030 ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR 00031 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00032 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 00033 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00034 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00035 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00036 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00037 00038 =========================================================================*/ 00046 #ifndef __vtkLargeInteger_h 00047 #define __vtkLargeInteger_h 00048 00049 #include "vtkObject.h" 00050 00051 class VTK_COMMON_EXPORT vtkLargeInteger 00052 { 00053 public: 00054 vtkLargeInteger(void); 00055 vtkLargeInteger(long n); 00056 vtkLargeInteger(unsigned long n); 00057 vtkLargeInteger(int n); 00058 vtkLargeInteger(unsigned int n); 00059 vtkLargeInteger(const vtkLargeInteger& n); 00060 ~vtkLargeInteger(void); 00061 00062 char CastToChar(void) const; 00063 short CastToShort(void) const; 00064 int CastToInt(void) const; 00065 long CastToLong(void) const; 00066 unsigned long CastToUnsignedLong(void) const; 00067 00068 int IsEven(void) const; 00069 int IsOdd(void) const; 00070 int GetLength(void) const; // in bits 00071 int GetBit(unsigned int p) const; // p'th bit (from zero) 00072 int IsZero() const; // is zero 00073 int GetSign(void) const; // is negative 00074 00075 void Truncate(unsigned int n); // reduce to lower n bits 00076 void Complement(void); // * -1 00077 00078 int operator==(const vtkLargeInteger& n) const; 00079 int operator!=(const vtkLargeInteger& n) const; 00080 int operator<(const vtkLargeInteger& n) const; 00081 int operator<=(const vtkLargeInteger& n) const; 00082 int operator>(const vtkLargeInteger& n) const; 00083 int operator>=(const vtkLargeInteger& n) const; 00084 00085 vtkLargeInteger& operator=(const vtkLargeInteger& n); 00086 vtkLargeInteger& operator+=(const vtkLargeInteger& n); 00087 vtkLargeInteger& operator-=(const vtkLargeInteger& n); 00088 vtkLargeInteger& operator<<=(int n); 00089 vtkLargeInteger& operator>>=(int n); 00090 vtkLargeInteger& operator++(void); 00091 vtkLargeInteger& operator--(void); 00092 vtkLargeInteger operator++(int); 00093 vtkLargeInteger operator--(int); 00094 vtkLargeInteger& operator*=(const vtkLargeInteger& n); 00095 vtkLargeInteger& operator/=(const vtkLargeInteger& n); 00096 vtkLargeInteger& operator%=(const vtkLargeInteger& n); 00097 // no change of sign for following operators 00098 vtkLargeInteger& operator&=(const vtkLargeInteger& n); 00099 vtkLargeInteger& operator|=(const vtkLargeInteger& n); 00100 vtkLargeInteger& operator^=(const vtkLargeInteger& n); 00101 00102 vtkLargeInteger operator+(const vtkLargeInteger& n) const; 00103 vtkLargeInteger operator-(const vtkLargeInteger& n) const; 00104 vtkLargeInteger operator*(const vtkLargeInteger& n) const; 00105 vtkLargeInteger operator/(const vtkLargeInteger& n) const; 00106 vtkLargeInteger operator%(const vtkLargeInteger& n) const; 00107 // no change of sign for following operators 00108 vtkLargeInteger operator&(const vtkLargeInteger& n) const; 00109 vtkLargeInteger operator|(const vtkLargeInteger& n) const; 00110 vtkLargeInteger operator^(const vtkLargeInteger& n) const; 00111 vtkLargeInteger operator<<(int n) const; 00112 vtkLargeInteger operator>>(int n) const; 00113 00114 friend ostream& operator<<(ostream& s, const vtkLargeInteger& n); 00115 friend istream& operator>>(istream& s, vtkLargeInteger& n); 00116 00117 private: 00118 char* Number; 00119 int Negative; 00120 unsigned int Sig; 00121 unsigned int Max; 00122 00123 // unsigned operators 00124 int IsSmaller(const vtkLargeInteger& n) const; // unsigned 00125 int IsGreater(const vtkLargeInteger& n) const; // unsigned 00126 void Expand(unsigned int n); // ensure n'th bit exits 00127 void Contract(); // remove leading 0s 00128 void Plus(const vtkLargeInteger& n); // unsigned 00129 void Minus(const vtkLargeInteger& n); // unsigned 00130 }; 00131 00132 #endif 00133 00134