1*89c4ff92SAndroid Build Coastguard Worker // 2*89c4ff92SAndroid Build Coastguard Worker // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 3*89c4ff92SAndroid Build Coastguard Worker // SPDX-License-Identifier: MIT 4*89c4ff92SAndroid Build Coastguard Worker // 5*89c4ff92SAndroid Build Coastguard Worker #pragma once 6*89c4ff92SAndroid Build Coastguard Worker 7*89c4ff92SAndroid Build Coastguard Worker #include <stdio.h> 8*89c4ff92SAndroid Build Coastguard Worker #include <iterator> 9*89c4ff92SAndroid Build Coastguard Worker 10*89c4ff92SAndroid Build Coastguard Worker /** 11*89c4ff92SAndroid Build Coastguard Worker * Class Array2d is a data structure that represents a two dimensional array. 12*89c4ff92SAndroid Build Coastguard Worker * The data is allocated in contiguous memory, arranged row-wise 13*89c4ff92SAndroid Build Coastguard Worker * and individual elements can be accessed with the () operator. 14*89c4ff92SAndroid Build Coastguard Worker * For example a two dimensional array D of size (M, N) can be accessed: 15*89c4ff92SAndroid Build Coastguard Worker * 16*89c4ff92SAndroid Build Coastguard Worker * _|<------------- col size = N -------->| 17*89c4ff92SAndroid Build Coastguard Worker * | D(r=0, c=0) D(r=0, c=1)... D(r=0, c=N) 18*89c4ff92SAndroid Build Coastguard Worker * | D(r=1, c=0) D(r=1, c=1)... D(r=1, c=N) 19*89c4ff92SAndroid Build Coastguard Worker * | ... 20*89c4ff92SAndroid Build Coastguard Worker * row size = M ... 21*89c4ff92SAndroid Build Coastguard Worker * | ... 22*89c4ff92SAndroid Build Coastguard Worker * _ D(r=M, c=0) D(r=M, c=1)... D(r=M, c=N) 23*89c4ff92SAndroid Build Coastguard Worker * 24*89c4ff92SAndroid Build Coastguard Worker */ 25*89c4ff92SAndroid Build Coastguard Worker template<typename T> 26*89c4ff92SAndroid Build Coastguard Worker class Array2d 27*89c4ff92SAndroid Build Coastguard Worker { 28*89c4ff92SAndroid Build Coastguard Worker private: 29*89c4ff92SAndroid Build Coastguard Worker size_t m_rows; 30*89c4ff92SAndroid Build Coastguard Worker size_t m_cols; 31*89c4ff92SAndroid Build Coastguard Worker T* m_data; 32*89c4ff92SAndroid Build Coastguard Worker 33*89c4ff92SAndroid Build Coastguard Worker public: 34*89c4ff92SAndroid Build Coastguard Worker /** 35*89c4ff92SAndroid Build Coastguard Worker * Creates the array2d with the given sizes. 36*89c4ff92SAndroid Build Coastguard Worker * 37*89c4ff92SAndroid Build Coastguard Worker * @param rows number of rows. 38*89c4ff92SAndroid Build Coastguard Worker * @param cols number of columns. 39*89c4ff92SAndroid Build Coastguard Worker */ Array2d(unsigned rows,unsigned cols)40*89c4ff92SAndroid Build Coastguard Worker Array2d(unsigned rows, unsigned cols) 41*89c4ff92SAndroid Build Coastguard Worker { 42*89c4ff92SAndroid Build Coastguard Worker if (rows == 0 || cols == 0) { 43*89c4ff92SAndroid Build Coastguard Worker printf("Array2d constructor has 0 size.\n"); 44*89c4ff92SAndroid Build Coastguard Worker m_data = nullptr; 45*89c4ff92SAndroid Build Coastguard Worker return; 46*89c4ff92SAndroid Build Coastguard Worker } 47*89c4ff92SAndroid Build Coastguard Worker m_rows = rows; 48*89c4ff92SAndroid Build Coastguard Worker m_cols = cols; 49*89c4ff92SAndroid Build Coastguard Worker m_data = new T[rows * cols]; 50*89c4ff92SAndroid Build Coastguard Worker } 51*89c4ff92SAndroid Build Coastguard Worker ~Array2d()52*89c4ff92SAndroid Build Coastguard Worker ~Array2d() 53*89c4ff92SAndroid Build Coastguard Worker { 54*89c4ff92SAndroid Build Coastguard Worker delete[] m_data; 55*89c4ff92SAndroid Build Coastguard Worker } 56*89c4ff92SAndroid Build Coastguard Worker operator ()(unsigned int row,unsigned int col)57*89c4ff92SAndroid Build Coastguard Worker T& operator() (unsigned int row, unsigned int col) 58*89c4ff92SAndroid Build Coastguard Worker { 59*89c4ff92SAndroid Build Coastguard Worker return m_data[m_cols * row + col]; 60*89c4ff92SAndroid Build Coastguard Worker } 61*89c4ff92SAndroid Build Coastguard Worker operator ()(unsigned int row,unsigned int col) const62*89c4ff92SAndroid Build Coastguard Worker T operator() (unsigned int row, unsigned int col) const 63*89c4ff92SAndroid Build Coastguard Worker { 64*89c4ff92SAndroid Build Coastguard Worker return m_data[m_cols * row + col]; 65*89c4ff92SAndroid Build Coastguard Worker } 66*89c4ff92SAndroid Build Coastguard Worker 67*89c4ff92SAndroid Build Coastguard Worker /** 68*89c4ff92SAndroid Build Coastguard Worker * Gets rows number of the current array2d. 69*89c4ff92SAndroid Build Coastguard Worker * @return number of rows. 70*89c4ff92SAndroid Build Coastguard Worker */ size(size_t dim)71*89c4ff92SAndroid Build Coastguard Worker size_t size(size_t dim) 72*89c4ff92SAndroid Build Coastguard Worker { 73*89c4ff92SAndroid Build Coastguard Worker switch (dim) 74*89c4ff92SAndroid Build Coastguard Worker { 75*89c4ff92SAndroid Build Coastguard Worker case 0: 76*89c4ff92SAndroid Build Coastguard Worker return m_rows; 77*89c4ff92SAndroid Build Coastguard Worker case 1: 78*89c4ff92SAndroid Build Coastguard Worker return m_cols; 79*89c4ff92SAndroid Build Coastguard Worker default: 80*89c4ff92SAndroid Build Coastguard Worker return 0; 81*89c4ff92SAndroid Build Coastguard Worker } 82*89c4ff92SAndroid Build Coastguard Worker } 83*89c4ff92SAndroid Build Coastguard Worker 84*89c4ff92SAndroid Build Coastguard Worker /** 85*89c4ff92SAndroid Build Coastguard Worker * Gets the array2d total size. 86*89c4ff92SAndroid Build Coastguard Worker */ totalSize()87*89c4ff92SAndroid Build Coastguard Worker size_t totalSize() 88*89c4ff92SAndroid Build Coastguard Worker { 89*89c4ff92SAndroid Build Coastguard Worker return m_rows * m_cols; 90*89c4ff92SAndroid Build Coastguard Worker } 91*89c4ff92SAndroid Build Coastguard Worker 92*89c4ff92SAndroid Build Coastguard Worker /** 93*89c4ff92SAndroid Build Coastguard Worker * array2d iterator. 94*89c4ff92SAndroid Build Coastguard Worker */ 95*89c4ff92SAndroid Build Coastguard Worker using iterator=T*; 96*89c4ff92SAndroid Build Coastguard Worker using const_iterator=T const*; 97*89c4ff92SAndroid Build Coastguard Worker begin()98*89c4ff92SAndroid Build Coastguard Worker iterator begin() { return m_data; } end()99*89c4ff92SAndroid Build Coastguard Worker iterator end() { return m_data + totalSize(); } begin() const100*89c4ff92SAndroid Build Coastguard Worker const_iterator begin() const { return m_data; } end() const101*89c4ff92SAndroid Build Coastguard Worker const_iterator end() const { return m_data + totalSize(); }; 102*89c4ff92SAndroid Build Coastguard Worker }; 103