cel_dsarray.h

Go to the documentation of this file.
00001 //----------------------------------------------------------------------------
00004 //
00005 // (C) 2003-2006 Celartem Technology Inc. All rights reserved.
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_

This document is automatically generated using doxygen 1.5.4 at Fri Jun 27 18:21:54 2008.