xref: /aosp_15_r20/external/armnn/samples/common/include/Audio/DataStructures.hpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
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