blob: 2f267c0d00f999091fa0fecd18d2bea81296e8c2 [file] [log] [blame]
alexander3c798932021-03-26 21:42:19 +00001/*
2 * Copyright (c) 2021 Arm Limited. All rights reserved.
3 * SPDX-License-Identifier: Apache-2.0
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17#ifndef DATA_STRUCTURES_HPP
18#define DATA_STRUCTURES_HPP
19
20#include "hal.h"
21
22#include <iterator>
23
24namespace arm {
25namespace app {
26
27 /**
28 * Class Array2d is a data structure that represents a two dimensional array.
29 * The data is allocated in contiguous memory, arranged row-wise
30 * and individual elements can be accessed with the () operator.
31 * For example a two dimensional array D of size (M, N) can be accessed:
32 *
33 * _|<------------- col size = N -------->|
34 * | D(r=0, c=0) D(r=0, c=1)... D(r=0, c=N)
35 * | D(r=1, c=0) D(r=1, c=1)... D(r=1, c=N)
36 * | ...
37 * row size = M ...
38 * | ...
39 * _ D(r=M, c=0) D(r=M, c=1)... D(r=M, c=N)
40 *
41 */
42 template<typename T>
43 class Array2d {
44 public:
45 /**
46 * @brief Creates the array2d with the given sizes.
47 * @param[in] rows Number of rows.
48 * @param[in] cols Number of columns.
49 */
alexanderc350cdc2021-04-29 20:36:09 +010050 Array2d(unsigned rows, unsigned cols): _m_rows(rows), _m_cols(cols)
alexander3c798932021-03-26 21:42:19 +000051 {
52 if (rows == 0 || cols == 0) {
53 printf_err("Array2d constructor has 0 size.\n");
54 _m_data = nullptr;
55 return;
56 }
alexander3c798932021-03-26 21:42:19 +000057 _m_data = new T[rows * cols];
58 }
59
60 ~Array2d()
61 {
62 delete[] _m_data;
63 }
64
65 T& operator() (unsigned int row, unsigned int col)
66 {
67#if defined(DEBUG)
68 if (row >= _m_rows || col >= _m_cols || _m_data == nullptr) {
69 printf_err("Array2d subscript out of bounds.\n");
70 }
71#endif /* defined(DEBUG) */
72 return _m_data[_m_cols * row + col];
73 }
74
75 T operator() (unsigned int row, unsigned int col) const
76 {
77#if defined(DEBUG)
78 if (row >= _m_rows || col >= _m_cols || _m_data == nullptr) {
79 printf_err("const Array2d subscript out of bounds.\n");
80 }
81#endif /* defined(DEBUG) */
82 return _m_data[_m_cols * row + col];
83 }
84
85 /**
86 * @brief Gets rows number of the current array2d.
87 * @return Number of rows.
88 */
89 size_t size(size_t dim)
90 {
91 switch (dim)
92 {
93 case 0:
94 return _m_rows;
95 case 1:
96 return _m_cols;
97 default:
98 return 0;
99 }
100 }
101
102 /**
103 * @brief Gets the array2d total size.
104 */
105 size_t totalSize()
106 {
107 return _m_rows * _m_cols;
108 }
109
110 /**
111 * array2d iterator.
112 */
113 using iterator=T*;
114 using const_iterator=T const*;
115
116 iterator begin() { return _m_data; }
117 iterator end() { return _m_data + totalSize(); }
118 const_iterator begin() const { return _m_data; }
119 const_iterator end() const { return _m_data + totalSize(); };
120
121 private:
122 size_t _m_rows;
123 size_t _m_cols;
124 T* _m_data;
125 };
126
127} /* namespace app */
128} /* namespace arm */
129
130#endif /* DATA_STRUCTURES_HPP */