00001
00004
00005
00006
00007
00008 #ifndef _cel_dsarray_h_
00009 #define _cel_dsarray_h_
00010
00011 #include "cel_serializable.h"
00012 #include "cel_memory.h"
00013 #include "cel_endian.h"
00014 #include "cel_rational.h"
00015
00016 namespace Celartem
00017 {
00024 class BasicDataArray : public Serializable
00025 {
00026 public:
00027
00032 virtual bool isValid() const = 0;
00033
00034
00039 virtual size_t getSize() const = 0;
00040
00041
00045 virtual u16 getTag() const = 0;
00046
00047
00051 virtual void setTag(u16 tag) = 0;
00052
00053
00057 virtual u16 getType() const = 0;
00058
00059
00063 virtual void setType(u16 type) = 0;
00064
00065
00071 virtual const void *getVoidPtr() const = 0;
00072
00073
00083 virtual size_t getAsInt(size_t inIndex) const;
00084
00085
00095 virtual double getAsDouble(size_t inIndex) const;
00096
00097
00108 virtual TIFF_RATIONAL getAsRational(size_t inIndex) const;
00109 };
00110
00111
00121 template<typename T> class DataArray : public BasicDataArray
00122 {
00123 public:
00124
00135 virtual void serialize(
00136 Stream *inStream, size_t inLevel, Endian inEndian)
00137 {
00138 const size_t size = m_array.getSize();
00139 write<u16>(inStream, m_tag, inEndian);
00140 write<u16>(inStream, m_type, inEndian);
00141 write<u32>(inStream, (u32)size, inEndian);
00142 for(size_t i = 0; i < size; i++)
00143 write<T>(inStream, m_array[i], inEndian);
00144 }
00145
00146
00152 virtual AutoPtr<Serializable> duplicate() const
00153 {
00154 AutoPtr<DataArray<T> > array = new DataArray<T>;
00155 array->duplicate(this);
00156 return array.getPtr();
00157 }
00158
00159
00165 virtual AutoPtr<DataArray<T> > duplicateDataArray() const
00166 {
00167 AutoPtr<DataArray> array = new DataArray<T>;
00168 array->duplicate(this);
00169 return array;
00170 }
00171
00172
00185 static AutoPtr<Serializable> deserialize(
00186 Stream *inStream, size_t inLevel, Endian inEndian)
00187 {
00188 AutoPtr<DataArray<T> > da = create();
00189
00190 da->m_tag = read<u16>(inStream, inEndian);
00191 da->m_type = read<u16>(inStream, inEndian);
00192
00193 const size_t size = (size_t)read<u32>(inStream, inEndian);
00194 SimpleArray<T>& array = da->m_array;
00195 array.allocate(size);
00196 for(size_t i = 0; i < size; i++)
00197 array[i] = read<T>(inStream, inEndian);
00198 return da.getPtr();
00199 }
00200
00201
00211 static AutoPtr<DataArray<T> > create()
00212 {
00213 return new DataArray<T>;
00214 }
00215
00216
00226 static AutoPtr<DataArray<T> > create(
00227 size_t inSize, size_t inReserve = (size_t)-1)
00228 {
00229 AutoPtr<DataArray<T> > array = new DataArray<T>();
00230 array->allocate(inSize, inReserve);
00231 return array;
00232 }
00233
00234
00241 inline SimpleArray<T>& getReference() {return m_array;}
00242
00243
00250 inline const SimpleArray<T>& getReference() const {return m_array;}
00251
00252
00257 inline T *getPtr() {return m_array.getPtr();}
00258
00259
00264 inline const T *getPtr() const {return m_array.getPtr();}
00265
00266
00272 virtual const void *getVoidPtr() const {return m_array.getPtr();}
00273
00274
00282 inline T& at(size_t pos) {return m_array[pos];}
00283
00284
00292 inline const T& at(size_t pos) const
00293 {
00294 return m_array[pos];
00295 }
00296
00297
00302 virtual bool isValid() const
00303 {
00304 return m_array.isValid();
00305 }
00306
00307
00312 virtual size_t getSize() const
00313 {
00314 return m_array.getSize();
00315 }
00316
00317
00322 inline void allocate(
00323 size_t inSize, size_t inReserve = (size_t)-1)
00324 {
00325 m_array.allocate(inSize, inReserve);
00326 }
00327
00328
00333 inline void reserve(size_t inSize)
00334 {
00335 m_array.reserve(inSize);
00336 }
00337
00338
00343 inline void reallocate(size_t inSize)
00344 {
00345 m_array.rellocate(inSize);
00346 }
00347
00348
00353 inline void resize(size_t inSize)
00354 {
00355 m_array.reallocate(inSize);
00356 }
00357
00358
00363 inline void free()
00364 {
00365 m_array.free();
00366 }
00367
00368
00377 inline void duplicate(const SimpleArray<T>& inSa)
00378 {
00379 m_array.duplicate(inSa);
00380 m_array.strictCleanup();
00381 m_tag = 0;
00382 m_type = 0;
00383 }
00384
00385
00395 inline void duplicate(const Serializable *inDataArray)
00396 {
00397 const DataArray<T> *pDa
00398 = dynamic_cast<const DataArray<T> *>(inDataArray);
00399 if(!pDa)
00400 celThrow(errTypeMismatch);
00401 m_array.duplicate(pDa->m_array);
00402 m_tag = pDa->m_tag;
00403 m_type = pDa->m_type;
00404 m_array.strictCleanup();
00405 }
00406
00407
00416 inline void duplicate(
00417 const T *inBuffer, size_t inSize, Endian inEndian = endianHost)
00418 {
00419 m_array.duplicate(inBuffer, inSize, inEndian);
00420 m_array.strictCleanup();
00421 m_tag = 0;
00422 m_type = 0;
00423 }
00424
00425
00430 inline void fill(const T& t)
00431 {
00432 m_array.fill(t);
00433 }
00434
00435
00440 inline void zeroClear()
00441 {
00442 m_array.zeroClear();
00443 }
00444
00445
00454 inline void swap(SimpleArray<T>& inSa)
00455 {
00456 m_array.swap(inSa);
00457 m_array.strictCleanup();
00458 m_tag = 0;
00459 m_type = 0;
00460 }
00461
00462
00474 inline void swap(Serializable *inDataArray)
00475 {
00476 DataArray<T> *pDa = dynamic_cast<DataArray<T> *>(inDataArray);
00477 if(!pDa)
00478 celThrow(errTypeMismatch);
00479 m_array.swap(pDa->m_array);
00480 m_array.strictCleanup();
00481
00482 u16 tmp;
00483 tmp = m_tag; m_tag = pDa->m_tag; pDa->m_tag = tmp;
00484 tmp = m_type; m_type = pDa->m_type; pDa->m_type = tmp;
00485 }
00486
00487
00492 inline void push_back(T& t)
00493 {
00494 m_array.push_back(t);
00495 }
00496
00497
00502 inline T pop_back()
00503 {
00504 return m_array.pop_back();
00505 }
00506
00507
00511 virtual u16 getTag() const
00512 {
00513 return m_tag;
00514 }
00515
00516
00520 virtual void setTag(u16 tag)
00521 {
00522 m_tag = tag;
00523 }
00524
00525
00529 virtual u16 getType() const
00530 {
00531 return m_type;
00532 }
00533
00534
00538 virtual void setType(u16 type)
00539 {
00540 m_type = type;
00541 }
00542
00543 private:
00544 SimpleArray<T> m_array;
00545 u16 m_tag, m_type;
00546
00547 DataArray()
00548 {
00549 m_array.strictCleanup();
00550 }
00551 };
00552
00553
00554 typedef DataArray<int8_t> DataArrayI8;
00555 typedef DataArray<int16_t> DataArrayI16;
00556 typedef DataArray<int32_t> DataArrayI32;
00557 typedef DataArray<int64_t> DataArrayI64;
00558
00559 typedef DataArray<uint8_t> DataArrayU8;
00560 typedef DataArray<uint16_t> DataArrayU16;
00561 typedef DataArray<uint32_t> DataArrayU32;
00562 typedef DataArray<uint64_t> DataArrayU64;
00563
00564 typedef DataArray<float> DataArrayFloat;
00565 typedef DataArray<double> DataArrayDouble;
00566 }
00567
00568 #endif // _cel_dsarray_h_