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 | #include "ImfForward.h"  |
41 |   |
42 | //-------------------------------------------------------------------------  |
43 | //  |
44 | // class Array  |
45 | // class Array2D  |
46 | //  |
47 | // "Arrays of T" whose sizes are not known at compile time.  |
48 | // When an array goes out of scope, its elements are automatically  |
49 | // deleted.  |
50 | //  |
51 | // Usage example:  |
52 | //  |
53 | // struct C  |
54 | // {  |
55 | // C () {std::cout << "C::C (" << this << ")\n";};  |
56 | // virtual ~C () {std::cout << "C::~C (" << this << ")\n";};  |
57 | // };  |
58 | //   |
59 | // int  |
60 | // main ()  |
61 | // {  |
62 | // Array <C> a(3);  |
63 | //   |
64 | // C &b = a[1];  |
65 | // const C &c = a[1];  |
66 | // C *d = a + 2;  |
67 | // const C *e = a;  |
68 | //   |
69 | // return 0;  |
70 | // }  |
71 | //  |
72 | //-------------------------------------------------------------------------  |
73 |   |
74 | OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_ENTER  |
75 |   |
76 | template <class T>  |
77 | class Array  |
78 | {  |
79 | public:  |
80 |   |
81 | //-----------------------------  |
82 | // Constructors and destructors  |
83 | //-----------------------------  |
84 |   |
85 | Array () {_data = 0; _size = 0;}  |
86 | Array (long size) {_data = new T[size]; _size = size;}  |
87 | ~Array () {delete [] _data;}  |
88 |   |
89 |   |
90 | //-----------------------------  |
91 | // Access to the array elements  |
92 | //-----------------------------  |
93 |   |
94 | operator T * () {return _data;}  |
95 | operator const T * () const {return _data;}  |
96 |   |
97 |   |
98 | //------------------------------------------------------  |
99 | // Resize and clear the array (the contents of the array  |
100 | // are not preserved across the resize operation).  |
101 | //  |
102 | // resizeEraseUnsafe() is more memory efficient than  |
103 | // resizeErase() because it deletes the old memory block  |
104 | // before allocating a new one, but if allocating the  |
105 | // new block throws an exception, resizeEraseUnsafe()  |
106 | // leaves the array in an unusable state.  |
107 | //  |
108 | //------------------------------------------------------  |
109 |   |
110 | void resizeErase (long size);  |
111 | void resizeEraseUnsafe (long size);  |
112 |   |
113 |   |
114 | //-------------------------------  |
115 | // Return the size of this array.  |
116 | //-------------------------------  |
117 |   |
118 | long size() const {return _size;}  |
119 |   |
120 |   |
121 | private:  |
122 |   |
123 | Array (const Array &) = delete;  |
124 | Array & operator = (const Array &) = delete;  |
125 | Array (Array &&) = delete;  |
126 | Array & operator = (Array &&) = delete;  |
127 |   |
128 | long _size;  |
129 | T * _data;  |
130 | };  |
131 |   |
132 |   |
133 | template <class T>  |
134 | class Array2D  |
135 | {  |
136 | public:  |
137 |   |
138 | //-----------------------------  |
139 | // Constructors and destructors  |
140 | //-----------------------------  |
141 |   |
142 | Array2D (); // empty array, 0 by 0 elements  |
143 | Array2D (long sizeX, long sizeY); // sizeX by sizeY elements  |
144 | ~Array2D ();  |
145 |   |
146 |   |
147 | //-----------------------------  |
148 | // Access to the array elements  |
149 | //-----------------------------  |
150 |   |
151 | T * operator [] (long x);  |
152 | const T * operator [] (long x) const;  |
153 |   |
154 |   |
155 | //------------------------------------------------------  |
156 | // Resize and clear the array (the contents of the array  |
157 | // are not preserved across the resize operation).  |
158 | //  |
159 | // resizeEraseUnsafe() is more memory efficient than  |
160 | // resizeErase() because it deletes the old memory block  |
161 | // before allocating a new one, but if allocating the  |
162 | // new block throws an exception, resizeEraseUnsafe()  |
163 | // leaves the array in an unusable state.  |
164 | //  |
165 | //------------------------------------------------------  |
166 |   |
167 | void resizeErase (long sizeX, long sizeY);  |
168 | void resizeEraseUnsafe (long sizeX, long sizeY);  |
169 |   |
170 |   |
171 | //-------------------------------  |
172 | // Return the size of this array.  |
173 | //-------------------------------  |
174 |   |
175 | long height() const {return _sizeX;}  |
176 | long width() const {return _sizeY;}  |
177 |   |
178 |   |
179 | private:  |
180 |   |
181 | Array2D (const Array2D &) = delete;  |
182 | Array2D & operator = (const Array2D &) = delete;  |
183 | Array2D (Array2D &&) = delete;  |
184 | Array2D & operator = (Array2D &&) = delete;  |
185 |   |
186 | long _sizeX;  |
187 | long _sizeY;  |
188 | T * _data;  |
189 | };  |
190 |   |
191 |   |
192 | //---------------  |
193 | // Implementation  |
194 | //---------------  |
195 |   |
196 | template <class T>  |
197 | inline void  |
198 | Array<T>::resizeErase (long size)  |
199 | {  |
200 | T *tmp = new T[size];  |
201 | delete [] _data;  |
202 | _size = size;  |
203 | _data = tmp;  |
204 | }  |
205 |   |
206 |   |
207 | template <class T>  |
208 | inline void  |
209 | Array<T>::resizeEraseUnsafe (long size)  |
210 | {  |
211 | delete [] _data;  |
212 | _data = 0;  |
213 | _size = 0;  |
214 | _data = new T[size];  |
215 | _size = size;  |
216 | }  |
217 |   |
218 |   |
219 | template <class T>  |
220 | inline  |
221 | Array2D<T>::Array2D ():  |
222 | _sizeX(0), _sizeY (0), _data (0)  |
223 | {  |
224 | // emtpy  |
225 | }  |
226 |   |
227 |   |
228 | template <class T>  |
229 | inline  |
230 | Array2D<T>::Array2D (long sizeX, long sizeY):  |
231 | _sizeX (sizeX), _sizeY (sizeY), _data (new T[sizeX * sizeY])  |
232 | {  |
233 | // emtpy  |
234 | }  |
235 |   |
236 |   |
237 | template <class T>  |
238 | inline  |
239 | Array2D<T>::~Array2D ()  |
240 | {  |
241 | delete [] _data;  |
242 | }  |
243 |   |
244 |   |
245 | template <class T>  |
246 | inline T *   |
247 | Array2D<T>::operator [] (long x)  |
248 | {  |
249 | return _data + x * _sizeY;  |
250 | }  |
251 |   |
252 |   |
253 | template <class T>  |
254 | inline const T *  |
255 | Array2D<T>::operator [] (long x) const  |
256 | {  |
257 | return _data + x * _sizeY;  |
258 | }  |
259 |   |
260 |   |
261 | template <class T>  |
262 | inline void  |
263 | Array2D<T>::resizeErase (long sizeX, long sizeY)  |
264 | {  |
265 | T *tmp = new T[sizeX * sizeY];  |
266 | delete [] _data;  |
267 | _sizeX = sizeX;  |
268 | _sizeY = sizeY;  |
269 | _data = tmp;  |
270 | }  |
271 |   |
272 |   |
273 | template <class T>  |
274 | inline void  |
275 | Array2D<T>::resizeEraseUnsafe (long sizeX, long sizeY)  |
276 | {  |
277 | delete [] _data;  |
278 | _data = 0;  |
279 | _sizeX = 0;  |
280 | _sizeY = 0;  |
281 | _data = new T[sizeX * sizeY];  |
282 | _sizeX = sizeX;  |
283 | _sizeY = sizeY;  |
284 | }  |
285 |   |
286 | OPENEXR_IMF_INTERNAL_NAMESPACE_HEADER_EXIT  |
287 |   |
288 |   |
289 | #endif  |
290 | |