Home | History | Annotate | Download | only in IlmImf
      1 ///////////////////////////////////////////////////////////////////////////
      2 //
      3 // Copyright (c) 2002, Industrial Light & Magic, a division of Lucas
      4 // Digital Ltd. LLC
      5 //
      6 // All rights reserved.
      7 //
      8 // Redistribution and use in source and binary forms, with or without
      9 // modification, are permitted provided that the following conditions are
     10 // met:
     11 // *       Redistributions of source code must retain the above copyright
     12 // notice, this list of conditions and the following disclaimer.
     13 // *       Redistributions in binary form must reproduce the above
     14 // copyright notice, this list of conditions and the following disclaimer
     15 // in the documentation and/or other materials provided with the
     16 // distribution.
     17 // *       Neither the name of Industrial Light & Magic nor the names of
     18 // its contributors may be used to endorse or promote products derived
     19 // from this software without specific prior written permission.
     20 //
     21 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
     22 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
     23 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
     24 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
     25 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
     26 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
     27 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
     28 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
     29 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     30 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     31 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     32 //
     33 ///////////////////////////////////////////////////////////////////////////
     34 
     35 
     36 
     37 #ifndef INCLUDED_IMF_ARRAY_H
     38 #define INCLUDED_IMF_ARRAY_H
     39 
     40 //-------------------------------------------------------------------------
     41 //
     42 // class Array
     43 // class Array2D
     44 //
     45 // "Arrays of T" whose sizes are not known at compile time.
     46 // When an array goes out of scope, its elements are automatically
     47 // deleted.
     48 //
     49 // Usage example:
     50 //
     51 //	struct C
     52 //	{
     53 //	    C ()		{std::cout << "C::C  (" << this << ")\n";};
     54 //	    virtual ~C ()	{std::cout << "C::~C (" << this << ")\n";};
     55 //	};
     56 //
     57 //	int
     58 //	main ()
     59 //	{
     60 //	    Array <C> a(3);
     61 //
     62 //	    C &b = a[1];
     63 //	    const C &c = a[1];
     64 //	    C *d = a + 2;
     65 //	    const C *e = a;
     66 //
     67 //	    return 0;
     68 //	}
     69 //
     70 //-------------------------------------------------------------------------
     71 
     72 namespace Imf {
     73 
     74 
     75 template <class T>
     76 class Array
     77 {
     78   public:
     79 
     80     //-----------------------------
     81     // Constructors and destructors
     82     //-----------------------------
     83 
     84      Array ()				{_data = 0;}
     85      Array (long size)			{_data = new T[size];}
     86     ~Array ()				{delete [] _data;}
     87 
     88 
     89     //-----------------------------
     90     // Access to the array elements
     91     //-----------------------------
     92 
     93     operator T * ()			{return _data;}
     94     operator const T * () const		{return _data;}
     95 
     96 
     97     //------------------------------------------------------
     98     // Resize and clear the array (the contents of the array
     99     // are not preserved across the resize operation).
    100     //
    101     // resizeEraseUnsafe() is more memory efficient than
    102     // resizeErase() because it deletes the old memory block
    103     // before allocating a new one, but if allocating the
    104     // new block throws an exception, resizeEraseUnsafe()
    105     // leaves the array in an unusable state.
    106     //
    107     //------------------------------------------------------
    108 
    109     void resizeErase (long size);
    110     void resizeEraseUnsafe (long size);
    111 
    112 
    113   private:
    114 
    115     Array (const Array &);		// Copying and assignment
    116     Array & operator = (const Array &);	// are not implemented
    117 
    118     T * _data;
    119 };
    120 
    121 
    122 template <class T>
    123 class Array2D
    124 {
    125   public:
    126 
    127     //-----------------------------
    128     // Constructors and destructors
    129     //-----------------------------
    130 
    131      Array2D ();			// empty array, 0 by 0 elements
    132      Array2D (long sizeX, long sizeY);	// sizeX by sizeY elements
    133     ~Array2D ();
    134 
    135 
    136     //-----------------------------
    137     // Access to the array elements
    138     //-----------------------------
    139 
    140     T *		operator [] (long x);
    141     const T *	operator [] (long x) const;
    142 
    143 
    144     //------------------------------------------------------
    145     // Resize and clear the array (the contents of the array
    146     // are not preserved across the resize operation).
    147     //
    148     // resizeEraseUnsafe() is more memory efficient than
    149     // resizeErase() because it deletes the old memory block
    150     // before allocating a new one, but if allocating the
    151     // new block throws an exception, resizeEraseUnsafe()
    152     // leaves the array in an unusable state.
    153     //
    154     //------------------------------------------------------
    155 
    156     void resizeErase (long sizeX, long sizeY);
    157     void resizeEraseUnsafe (long sizeX, long sizeY);
    158 
    159 
    160   private:
    161 
    162     Array2D (const Array2D &);			// Copying and assignment
    163     Array2D & operator = (const Array2D &);	// are not implemented
    164 
    165     long	_sizeY;
    166     T *		_data;
    167 };
    168 
    169 
    170 //---------------
    171 // Implementation
    172 //---------------
    173 
    174 template <class T>
    175 inline void
    176 Array<T>::resizeErase (long size)
    177 {
    178     T *tmp = new T[size];
    179     delete [] _data;
    180     _data = tmp;
    181 }
    182 
    183 
    184 template <class T>
    185 inline void
    186 Array<T>::resizeEraseUnsafe (long size)
    187 {
    188     delete [] _data;
    189     _data = 0;
    190     _data = new T[size];
    191 }
    192 
    193 
    194 template <class T>
    195 inline
    196 Array2D<T>::Array2D ():
    197     _sizeY (0), _data (0)
    198 {
    199     // emtpy
    200 }
    201 
    202 
    203 template <class T>
    204 inline
    205 Array2D<T>::Array2D (long sizeX, long sizeY):
    206     _sizeY (sizeY), _data (new T[sizeX * sizeY])
    207 {
    208     // emtpy
    209 }
    210 
    211 
    212 template <class T>
    213 inline
    214 Array2D<T>::~Array2D ()
    215 {
    216     delete [] _data;
    217 }
    218 
    219 
    220 template <class T>
    221 inline T *
    222 Array2D<T>::operator [] (long x)
    223 {
    224     return _data + x * _sizeY;
    225 }
    226 
    227 
    228 template <class T>
    229 inline const T *
    230 Array2D<T>::operator [] (long x) const
    231 {
    232     return _data + x * _sizeY;
    233 }
    234 
    235 
    236 template <class T>
    237 inline void
    238 Array2D<T>::resizeErase (long sizeX, long sizeY)
    239 {
    240     T *tmp = new T[sizeX * sizeY];
    241     delete [] _data;
    242     _sizeY = sizeY;
    243     _data = tmp;
    244 }
    245 
    246 
    247 template <class T>
    248 inline void
    249 Array2D<T>::resizeEraseUnsafe (long sizeX, long sizeY)
    250 {
    251     delete [] _data;
    252     _data = 0;
    253     _sizeY = 0;
    254     _data = new T[sizeX * sizeY];
    255     _sizeY = sizeY;
    256 }
    257 
    258 
    259 } // namespace Imf
    260 
    261 #endif
    262