Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef CUINT_HPP
00031 #define CUINT_HPP
00032
00033 #include <stdio.h>
00034 #include <stdlib.h>
00035 #include <string.h>
00036 #include "glue.h"
00037 #include "cobstack.h"
00038
00039
00040 #ifndef MAX
00041 #define MAX(a,b) ((a)<(b)?(b):(a))
00042 #endif // MAX
00043
00044 #define CUINT_DEFAULT_SIZE (4) // size in 32 bit words
00045
00050 class CUInt {
00051 private:
00052 unsigned int defaultData[CUINT_DEFAULT_SIZE];
00053 unsigned int *data;
00054 int allocatedSize;
00055 int size;
00056 CObstack* heap;
00057 public:
00058
00062 CUInt( void )
00063 {
00064 heap = NULL;
00065 allocatedSize = CUINT_DEFAULT_SIZE;
00066 data = defaultData;
00067 size = 1;
00068 data[0] = 0;
00069 };
00070
00075 CUInt( unsigned int aValue )
00076 {
00077 heap = NULL;
00078 allocatedSize = CUINT_DEFAULT_SIZE;
00079 data = defaultData;
00080 size = 1;
00081 data[0] = aValue;
00082 };
00083
00084
00089 CUInt( const CUInt &aValue )
00090 {
00091 INT32 i;
00092
00093 heap = NULL;
00094 allocatedSize = CUINT_DEFAULT_SIZE;
00095 data = defaultData;
00096 size = 1;
00097 grow( aValue.size );
00098 for( i = 0; i < size; i++ ) {
00099 data[i] = aValue.data[i];
00100 }
00101 };
00102
00106 virtual ~CUInt()
00107 {
00108 if( heap == NULL && data != defaultData ) {
00109 shell_xfree( data, size );
00110 data = NULL;
00111 }
00112 } ;
00113
00114
00119 void SetHeap( CObstack* aHeap )
00120 {
00121 heap = aHeap;
00122 }
00123
00126 const CUInt &operator=( const CUInt &aValue )
00127 {
00128 INT32 i;
00129
00130 grow( aValue.size );
00131 for( i = 0; i < size; i++ ) {
00132 data[i] = aValue.data[i];
00133 }
00134 return( aValue );
00135 };
00136
00137 const UINT64 operator=( const UINT64 aValue )
00138 {
00139 if( aValue>>32 != 0 ) {
00140 grow( 2 );
00141 data[0] = aValue;
00142 data[1] = aValue>>32;
00143 } else {
00144 grow( 1 );
00145 data[0] = aValue;
00146 }
00147 return( aValue );
00148 };
00150
00157 void Truncate( int newSize )
00158 {
00159 grow( newSize );
00160 };
00161
00164 CUInt operator~( void ) const;
00166
00169 CUInt operator+( const CUInt & ) const;
00170 CUInt operator+( const unsigned int ) const;
00171 CUInt operator-( const CUInt & ) const;
00172 CUInt operator-( unsigned int ) const;
00173 CUInt operator*( const CUInt & ) const;
00174 CUInt operator*( unsigned int ) const;
00175 CUInt operator/( const CUInt & ) const;
00176 CUInt operator/( unsigned int ) const;
00177 CUInt operator%( const CUInt & ) const;
00178 CUInt operator%( unsigned int ) const;
00179 CUInt operator>>( const CUInt & ) const;
00180 CUInt operator>>( unsigned int ) const;
00181 CUInt operator<<( const CUInt & ) const;
00182 CUInt operator<<( unsigned int ) const;
00183 CUInt operator&( const CUInt & ) const;
00184 CUInt operator&( unsigned int ) const;
00185 CUInt operator|( const CUInt & ) const;
00186 CUInt operator|( unsigned int ) const;
00187 CUInt operator^( const CUInt & ) const;
00188 CUInt operator^( unsigned int ) const;
00190
00193 int operator<( const CUInt & ) const;
00194 int operator<( unsigned int ) const;
00195 int operator<=( const CUInt & ) const;
00196 int operator<=( unsigned int ) const;
00197 int operator>( const CUInt & ) const;
00198 int operator>( unsigned int ) const;
00199 int operator>=( const CUInt & ) const;
00200 int operator>=( unsigned int ) const;
00201 int operator==( const CUInt & ) const;
00202 int operator==( unsigned int ) const;
00203 int operator!=( const CUInt & ) const;
00204 int operator!=( unsigned int ) const;
00206
00209 UINT32 GetUINT32() const;
00210 UINT64 GetUINT64() const;
00212
00217 UINT32 Size();
00218
00222 private:
00223 void calibrate( void )
00224 {
00225 int i;
00226 for( i=size-1; i>0; i-- ) {
00227 if( data[i] != 0 ) {
00228 break;
00229 }
00230 }
00231 size = i+1;
00232 return;
00233 };
00234 void grow( int aSize )
00235 {
00236 int i;
00237
00238 if( aSize <= size ) {
00239 size = aSize;
00240 return;
00241 }
00242 if( allocatedSize < aSize ) {
00243 if( heap == NULL ) {
00244 if( data != defaultData ) {
00245 unsigned int* newData;
00246 newData = (unsigned int*)shell_xmalloc( aSize*4);
00247 memcpy( newData, data, size*4 );
00248 shell_xfree( data, allocatedSize*4 );
00249 data = newData;
00250 } else {
00251 data = (unsigned int*)shell_xmalloc( aSize*4 );
00252 memcpy( data, defaultData, size*4 );
00253 }
00254 } else {
00255 unsigned int* newData;
00256 newData = (unsigned int*)heap->Alloc( aSize*4 );
00257 memcpy( newData, data, size*4 );
00258 data = newData;
00259 }
00260 allocatedSize = aSize;
00261 }
00262 for( i=size; i < aSize; i++ ) {
00263 data[i] = 0;
00264 }
00265 size = aSize;
00266 };
00270 };
00271
00272
00273
00274
00275 #endif // CUINT_HPP