/* * This file is part of RawTherapee. * * Copyright (c) 2016 Ingo Weyrich * Copyright (c) 2016 Adam Reichold * * RawTherapee is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * RawTherapee is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with RawTherapee. If not, see . */ #ifndef JAGGEDARRAY_H #define JAGGEDARRAY_H namespace rtengine { // These emulate a jagged array, but use only 2 allocations instead of 1 + H. template inline T** const allocJaggedArray (const int W, const int H, const bool initZero = false) { T** const a = new T*[H]; a[0] = new T[H * W]; for (int i = 1; i < H; ++i) { a[i] = a[i - 1] + W; } if (initZero) { std::memset(a[0], 0, sizeof(T) * W * H); } return a; } template inline void freeJaggedArray (T** const a) { delete [] a[0]; delete [] a; } template class JaggedArray { public: JaggedArray (const int W, const int H, const bool initZero = false) { a = allocJaggedArray (W, H, initZero); } ~JaggedArray () { if (a) { freeJaggedArray (a); a = nullptr; } } JaggedArray (const JaggedArray&) = delete; JaggedArray& operator= (const JaggedArray&) = delete; public: operator T** const () const { return a; } private: T** a; }; // Declared but not defined to prevent // explicitly freeing a JaggedArray implicitly cast to T**. template void freeJaggedArray (JaggedArray&); } // rtengine #endif // JAGGEDARRAY_H