| 30 | // a 2D array as a T**, etc. |
| 31 | template <typename T, size_t N = 1> |
| 32 | class Array |
| 33 | { |
| 34 | public: |
| 35 | size_t mSize; // Size of the last dimension of this array. For an m x n array, this is n. |
| 36 | unique_ptr<T[]> mElements; // Contiguous buffer containing all elements of this array, in row-major order. |
| 37 | Array<T*, N - 1> mPointers; // Array of rank N-1, containing pointers to "columns" of this array. For an |
| 38 | // m x n x k array, this is an m x n array of pointers, each pointing to k |
| 39 | // elements. Recursively, this will expand to a buffer of m * n elements, |
| 40 | // and an array of m pointers to n elements. |
| 41 | size_t mSizes[N]; |
| 42 | |
| 43 | // Default constructor creates an array of size 0. |
| 44 | Array() |
| 45 | : mSize(0) |
| 46 | , mElements(nullptr) |
| 47 | , mPointers() |
| 48 | {} |
| 49 | |
| 50 | // Creates an array with the given dimensions. |
| 51 | template <typename S, typename... Sizes> |
| 52 | Array(S size, Sizes... sizes) |
| 53 | { |
| 54 | resize(size, sizes...); |
| 55 | } |
| 56 | |
| 57 | ~Array() |
| 58 | {} |
| 59 | |
| 60 | // Resizes this array to have the given dimensions. |
| 61 | template <typename S, typename... Sizes> |
| 62 | void resize(S size, Sizes... sizes) |
| 63 | { |
| 64 | auto sizeList = {sizes...}; |
| 65 | auto sizeArray = sizeList.begin(); |
| 66 | |
| 67 | mSizes[0] = size; |
| 68 | for (auto i = 1; i < N; ++i) |
| 69 | { |
| 70 | mSizes[i] = sizeArray[i - 1]; |
| 71 | } |
| 72 | |
| 73 | mSize = sizeArray[N - 2]; |
| 74 | |
| 75 | auto numElements = size; |
| 76 | for (auto i = 0; i < N - 1; ++i) |
| 77 | { |
| 78 | numElements *= sizeArray[i]; |
| 79 | } |
| 80 | |
| 81 | mElements = ipl::make_unique<T[]>(numElements); |
| 82 | |
| 83 | mPointers.resize(size, sizes...); |
| 84 | |
| 85 | auto stride = mSize; |
| 86 | for (auto i = 0u; mSize > 0 && i < numElements / mSize; ++i) |
| 87 | { |
| 88 | mPointers.mElements[i] = &mElements[i * stride]; |
| 89 | } |
nothing calls this directly
no outgoing calls
no test coverage detected