blob: 5cc8b5e3e09d5301f85b52ffa339a4d5f419e7cc [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 */
50 Array2d(unsigned rows, unsigned cols)
51 {
52 if (rows == 0 || cols == 0) {
53 printf_err("Array2d constructor has 0 size.\n");
54 _m_data = nullptr;
55 return;
56 }
57 _m_rows = rows;
58 _m_cols = cols;
59 _m_data = new T[rows * cols];
60 }
61
62 ~Array2d()
63 {
64 delete[] _m_data;
65 }
66
67 T& operator() (unsigned int row, unsigned int col)
68 {
69#if defined(DEBUG)
70 if (row >= _m_rows || col >= _m_cols || _m_data == nullptr) {
71 printf_err("Array2d subscript out of bounds.\n");
72 }
73#endif /* defined(DEBUG) */
74 return _m_data[_m_cols * row + col];
75 }
76
77 T operator() (unsigned int row, unsigned int col) const
78 {
79#if defined(DEBUG)
80 if (row >= _m_rows || col >= _m_cols || _m_data == nullptr) {
81 printf_err("const Array2d subscript out of bounds.\n");
82 }
83#endif /* defined(DEBUG) */
84 return _m_data[_m_cols * row + col];
85 }
86
87 /**
88 * @brief Gets rows number of the current array2d.
89 * @return Number of rows.
90 */
91 size_t size(size_t dim)
92 {
93 switch (dim)
94 {
95 case 0:
96 return _m_rows;
97 case 1:
98 return _m_cols;
99 default:
100 return 0;
101 }
102 }
103
104 /**
105 * @brief Gets the array2d total size.
106 */
107 size_t totalSize()
108 {
109 return _m_rows * _m_cols;
110 }
111
112 /**
113 * array2d iterator.
114 */
115 using iterator=T*;
116 using const_iterator=T const*;
117
118 iterator begin() { return _m_data; }
119 iterator end() { return _m_data + totalSize(); }
120 const_iterator begin() const { return _m_data; }
121 const_iterator end() const { return _m_data + totalSize(); };
122
123 private:
124 size_t _m_rows;
125 size_t _m_cols;
126 T* _m_data;
127 };
128
129} /* namespace app */
130} /* namespace arm */
131
132#endif /* DATA_STRUCTURES_HPP */