00001 #ifndef SIMPLEARRAYDATA 00002 #define SIMPLEARRAYDATA 00003 00004 00014 #include "IotrRefCount.hh" 00015 #include "IotrHandle.hh" 00016 00029 template<typename T> 00030 class SimpleArrayDataT: public IotrRefCount { 00031 protected: 00033 int mNeverDelete; 00035 int mSize; 00037 T * mArray; 00038 00039 SimpleArrayDataT() {}; // Cannot be called. 00040 00041 public: 00045 SimpleArrayDataT( T * array, int length ) 00046 { 00047 mArray = array; 00048 mSize = length; 00049 mNeverDelete = 1; 00050 }; 00054 SimpleArrayDataT( int length ) : mNeverDelete( 0 ), mSize( length ) 00055 { 00056 assert( length >= 0 ); 00057 00058 int asize = mSize > 0 ? mSize : 1; 00059 00060 mArray = new T[asize]; 00061 }; 00063 ~SimpleArrayDataT() 00064 { 00065 if( !mNeverDelete ) { 00066 delete [] mArray; 00067 } 00068 }; 00069 bool operator==( const SimpleArrayDataT<T> & w ) const 00070 { 00071 assert( mSize == w.mSize ); 00072 if( mSize != w.mSize ) return false; 00073 T * wa = w.mArray; 00074 for( int i = 0; i < mSize; i++ ) { 00075 if( mArray[i] != wa[i] ) return false; 00076 } 00077 return true; 00078 } 00079 bool operator!=( const SimpleArrayDataT<T> & w ) const 00080 { 00081 return !(*this == w ); 00082 } 00084 int size() const { return mSize; }; 00086 T * array() { return mArray; }; 00087 const T * array() const { return mArray; }; 00088 T & operator[]( int i ) { 00089 #if defined (CHECK_ARRAY_BOUNDS) || defined (IOTRINTENSEDEBUG) 00090 assert( i >= 0 && i < mSize ); 00091 #endif 00092 return mArray[i]; 00093 } 00095 const T & operator[]( int i ) const 00096 { 00097 #if defined (CHECK_ARRAY_BOUNDS) || defined (IOTRINTENSEDEBUG) 00098 assert( i >= 0 && i < mSize ); 00099 #endif 00100 return mArray[i]; 00101 } 00102 00103 }; 00104 00105 typedef SimpleArrayDataT<double> SimpleArrayData; 00106 typedef Handle<SimpleArrayData> SimpleArrayDataHandle; 00107 00108 #endif