00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef _DINFO_H
00010 #define _DINFO_H
00011
00012 class DinfoBase
00013 {
00014 public:
00015 DinfoBase()
00016 : isOneZombie_( 0 )
00017 {;}
00018 DinfoBase( bool isOneZombie )
00019 : isOneZombie_( isOneZombie )
00020 {;}
00021 virtual ~DinfoBase()
00022 {;}
00023 virtual char* allocData( unsigned int numData ) const = 0;
00024 virtual void destroyData( char* d ) const = 0;
00025 virtual unsigned int size() const = 0;
00026 virtual unsigned int sizeIncrement() const = 0;
00027
00034 virtual char* copyData( const char* orig, unsigned int origEntries,
00035 unsigned int copyEntries, unsigned int startEntry ) const = 0;
00036
00043 virtual void assignData( char* copy, unsigned int copyEntries,
00044 const char* orig, unsigned int origEntries ) const = 0;
00045
00046
00047
00048
00049
00050
00051 virtual bool isA( const DinfoBase* other ) const = 0;
00052
00053 bool isOneZombie() const {
00054 return isOneZombie_;
00055 }
00056 private:
00057 const bool isOneZombie_;
00058 };
00059
00060 template< class D > class Dinfo: public DinfoBase
00061 {
00062 public:
00063 Dinfo()
00064 : sizeIncrement_( sizeof( D ) )
00065 {;}
00066 Dinfo( bool isOneZombie )
00067 : DinfoBase( isOneZombie ),
00068 sizeIncrement_( isOneZombie ? 0 : sizeof( D ) )
00069 {;}
00070
00071 char* allocData( unsigned int numData ) const {
00072 if ( numData == 0 )
00073 return 0;
00074 else
00075 return reinterpret_cast< char* >( new( nothrow) D[ numData ] );
00076 }
00077
00078 char* copyData( const char* orig, unsigned int origEntries,
00079 unsigned int copyEntries, unsigned int startEntry ) const
00080 {
00081 if ( origEntries == 0 )
00082 return 0;
00083 if ( isOneZombie() )
00084 copyEntries = 1;
00085
00086 D* ret = new( nothrow ) D[copyEntries];
00087 if ( !ret )
00088 return 0;
00089 const D* origData = reinterpret_cast< const D* >( orig );
00090 for ( unsigned int i = 0; i < copyEntries; ++i ) {
00091 ret[ i ] = origData[ ( i + startEntry ) % origEntries ];
00092 }
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103 return reinterpret_cast< char* >( ret );
00104 }
00105
00106 void assignData( char* data, unsigned int copyEntries,
00107 const char* orig, unsigned int origEntries ) const
00108 {
00109 if ( origEntries == 0 || copyEntries == 0 ||
00110 orig == 0 || data == 0 ) {
00111 return;
00112 }
00113 if ( isOneZombie() )
00114 copyEntries = 1;
00115 const D* origData = reinterpret_cast< const D* >( orig );
00116 D* tgt = reinterpret_cast< D* >( data );
00117 for ( unsigned int i = 0; i < copyEntries; ++i ) {
00118 tgt[ i ] = origData[ i % origEntries ];
00119 }
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135 }
00136
00137 void destroyData( char* d ) const {
00138 delete[] reinterpret_cast< D* >( d );
00139 }
00140
00141 unsigned int size() const {
00142 return sizeof( D );
00143 }
00144
00151 unsigned int sizeIncrement() const {
00152 return sizeIncrement_;
00153 }
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170 bool isA( const DinfoBase* other ) const {
00171 return dynamic_cast< const Dinfo< D >* >( other );
00172 }
00173 private:
00174 unsigned int sizeIncrement_;
00175 };
00176
00177 template< class D > class ZeroSizeDinfo: public Dinfo< D >
00178 {
00179 public:
00180 unsigned int size() const {
00181 return 0;
00182 }
00183 unsigned int sizeIncrement() const {
00184 return 0;
00185 }
00186 };
00187
00188 #endif // _DINFO_H