• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 
Array()84      Array ()				{_data = 0;}
Array(long size)85      Array (long size)			{_data = new T[size];}
~Array()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
resizeErase(long size)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
resizeEraseUnsafe(long size)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
Array2D()196 Array2D<T>::Array2D ():
197     _sizeY (0), _data (0)
198 {
199     // emtpy
200 }
201 
202 
203 template <class T>
204 inline
Array2D(long sizeX,long sizeY)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
~Array2D()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
resizeErase(long sizeX,long sizeY)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
resizeEraseUnsafe(long sizeX,long sizeY)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