mirror of https://github.com/opencv/opencv.git
Open Source Computer Vision Library
https://opencv.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
261 lines
6.2 KiB
261 lines
6.2 KiB
/////////////////////////////////////////////////////////////////////////// |
|
// |
|
// Copyright (c) 2002, Industrial Light & Magic, a division of Lucas |
|
// Digital Ltd. LLC |
|
// |
|
// All rights reserved. |
|
// |
|
// Redistribution and use in source and binary forms, with or without |
|
// modification, are permitted provided that the following conditions are |
|
// met: |
|
// * Redistributions of source code must retain the above copyright |
|
// notice, this list of conditions and the following disclaimer. |
|
// * Redistributions in binary form must reproduce the above |
|
// copyright notice, this list of conditions and the following disclaimer |
|
// in the documentation and/or other materials provided with the |
|
// distribution. |
|
// * Neither the name of Industrial Light & Magic nor the names of |
|
// its contributors may be used to endorse or promote products derived |
|
// from this software without specific prior written permission. |
|
// |
|
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
|
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
|
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
|
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
|
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
|
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
|
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
|
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
|
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
|
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
|
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|
// |
|
/////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
|
|
#ifndef INCLUDED_IMF_ARRAY_H |
|
#define INCLUDED_IMF_ARRAY_H |
|
|
|
//------------------------------------------------------------------------- |
|
// |
|
// class Array |
|
// class Array2D |
|
// |
|
// "Arrays of T" whose sizes are not known at compile time. |
|
// When an array goes out of scope, its elements are automatically |
|
// deleted. |
|
// |
|
// Usage example: |
|
// |
|
// struct C |
|
// { |
|
// C () {std::cout << "C::C (" << this << ")\n";}; |
|
// virtual ~C () {std::cout << "C::~C (" << this << ")\n";}; |
|
// }; |
|
// |
|
// int |
|
// main () |
|
// { |
|
// Array <C> a(3); |
|
// |
|
// C &b = a[1]; |
|
// const C &c = a[1]; |
|
// C *d = a + 2; |
|
// const C *e = a; |
|
// |
|
// return 0; |
|
// } |
|
// |
|
//------------------------------------------------------------------------- |
|
|
|
namespace Imf { |
|
|
|
|
|
template <class T> |
|
class Array |
|
{ |
|
public: |
|
|
|
//----------------------------- |
|
// Constructors and destructors |
|
//----------------------------- |
|
|
|
Array () {_data = 0;} |
|
Array (long size) {_data = new T[size];} |
|
~Array () {delete [] _data;} |
|
|
|
|
|
//----------------------------- |
|
// Access to the array elements |
|
//----------------------------- |
|
|
|
operator T * () {return _data;} |
|
operator const T * () const {return _data;} |
|
|
|
|
|
//------------------------------------------------------ |
|
// Resize and clear the array (the contents of the array |
|
// are not preserved across the resize operation). |
|
// |
|
// resizeEraseUnsafe() is more memory efficient than |
|
// resizeErase() because it deletes the old memory block |
|
// before allocating a new one, but if allocating the |
|
// new block throws an exception, resizeEraseUnsafe() |
|
// leaves the array in an unusable state. |
|
// |
|
//------------------------------------------------------ |
|
|
|
void resizeErase (long size); |
|
void resizeEraseUnsafe (long size); |
|
|
|
|
|
private: |
|
|
|
Array (const Array &); // Copying and assignment |
|
Array & operator = (const Array &); // are not implemented |
|
|
|
T * _data; |
|
}; |
|
|
|
|
|
template <class T> |
|
class Array2D |
|
{ |
|
public: |
|
|
|
//----------------------------- |
|
// Constructors and destructors |
|
//----------------------------- |
|
|
|
Array2D (); // empty array, 0 by 0 elements |
|
Array2D (long sizeX, long sizeY); // sizeX by sizeY elements |
|
~Array2D (); |
|
|
|
|
|
//----------------------------- |
|
// Access to the array elements |
|
//----------------------------- |
|
|
|
T * operator [] (long x); |
|
const T * operator [] (long x) const; |
|
|
|
|
|
//------------------------------------------------------ |
|
// Resize and clear the array (the contents of the array |
|
// are not preserved across the resize operation). |
|
// |
|
// resizeEraseUnsafe() is more memory efficient than |
|
// resizeErase() because it deletes the old memory block |
|
// before allocating a new one, but if allocating the |
|
// new block throws an exception, resizeEraseUnsafe() |
|
// leaves the array in an unusable state. |
|
// |
|
//------------------------------------------------------ |
|
|
|
void resizeErase (long sizeX, long sizeY); |
|
void resizeEraseUnsafe (long sizeX, long sizeY); |
|
|
|
|
|
private: |
|
|
|
Array2D (const Array2D &); // Copying and assignment |
|
Array2D & operator = (const Array2D &); // are not implemented |
|
|
|
long _sizeY; |
|
T * _data; |
|
}; |
|
|
|
|
|
//--------------- |
|
// Implementation |
|
//--------------- |
|
|
|
template <class T> |
|
inline void |
|
Array<T>::resizeErase (long size) |
|
{ |
|
T *tmp = new T[size]; |
|
delete [] _data; |
|
_data = tmp; |
|
} |
|
|
|
|
|
template <class T> |
|
inline void |
|
Array<T>::resizeEraseUnsafe (long size) |
|
{ |
|
delete [] _data; |
|
_data = 0; |
|
_data = new T[size]; |
|
} |
|
|
|
|
|
template <class T> |
|
inline |
|
Array2D<T>::Array2D (): |
|
_sizeY (0), _data (0) |
|
{ |
|
// emtpy |
|
} |
|
|
|
|
|
template <class T> |
|
inline |
|
Array2D<T>::Array2D (long sizeX, long sizeY): |
|
_sizeY (sizeY), _data (new T[sizeX * sizeY]) |
|
{ |
|
// emtpy |
|
} |
|
|
|
|
|
template <class T> |
|
inline |
|
Array2D<T>::~Array2D () |
|
{ |
|
delete [] _data; |
|
} |
|
|
|
|
|
template <class T> |
|
inline T * |
|
Array2D<T>::operator [] (long x) |
|
{ |
|
return _data + x * _sizeY; |
|
} |
|
|
|
|
|
template <class T> |
|
inline const T * |
|
Array2D<T>::operator [] (long x) const |
|
{ |
|
return _data + x * _sizeY; |
|
} |
|
|
|
|
|
template <class T> |
|
inline void |
|
Array2D<T>::resizeErase (long sizeX, long sizeY) |
|
{ |
|
T *tmp = new T[sizeX * sizeY]; |
|
delete [] _data; |
|
_sizeY = sizeY; |
|
_data = tmp; |
|
} |
|
|
|
|
|
template <class T> |
|
inline void |
|
Array2D<T>::resizeEraseUnsafe (long sizeX, long sizeY) |
|
{ |
|
delete [] _data; |
|
_data = 0; |
|
_sizeY = 0; |
|
_data = new T[sizeX * sizeY]; |
|
_sizeY = sizeY; |
|
} |
|
|
|
|
|
} // namespace Imf |
|
|
|
#endif
|
|
|