blob: c9fd773d5e2d8a09c27e5ac618d869b35db7098c [file] [log] [blame]
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include <armnn/ArmNN.hpp>
Aron Virginas-Tard4f0fea2019-04-09 14:08:06 +01009#include <ResolveType.hpp>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010010
Matthew Benthamc394a6d2019-06-24 12:51:25 +010011#include <boost/assert.hpp>
12
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010013namespace armnn
14{
15
16class BaseIterator
17{
18public:
19 BaseIterator() {}
20
21 virtual ~BaseIterator() {}
22
23 virtual BaseIterator& operator++() = 0;
24
25 virtual BaseIterator& operator+=(const unsigned int increment) = 0;
26
27 virtual BaseIterator& operator-=(const unsigned int increment) = 0;
Francis Murtagh43aec582019-05-27 12:14:10 +010028
29 virtual BaseIterator& operator[](const unsigned int index) = 0;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010030};
31
Derek Lambertif30f7d32019-04-09 10:25:02 +010032template<typename IType>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010033class Decoder : public BaseIterator
34{
35public:
Derek Lambertif30f7d32019-04-09 10:25:02 +010036 Decoder() {}
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010037
38 virtual ~Decoder() {}
39
Matthew Benthamc394a6d2019-06-24 12:51:25 +010040 virtual void Reset(void*) = 0;
41
Derek Lambertif30f7d32019-04-09 10:25:02 +010042 virtual IType Get() const = 0;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010043};
44
Derek Lambertif30f7d32019-04-09 10:25:02 +010045template<typename IType>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010046class Encoder : public BaseIterator
47{
48public:
Derek Lambertif30f7d32019-04-09 10:25:02 +010049 Encoder() {}
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010050
51 virtual ~Encoder() {}
52
Matthew Benthamc394a6d2019-06-24 12:51:25 +010053 virtual void Reset(void*) = 0;
54
Derek Lambertif30f7d32019-04-09 10:25:02 +010055 virtual void Set(IType right) = 0;
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +010056
57 virtual IType Get() const = 0;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010058};
59
60template<typename T, typename Base>
61class TypedIterator : public Base
62{
63public:
Matthew Benthamc394a6d2019-06-24 12:51:25 +010064 TypedIterator(T* data = nullptr)
Francis Murtagh43aec582019-05-27 12:14:10 +010065 : m_Iterator(data), m_Start(data)
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010066 {}
67
Matthew Benthamc394a6d2019-06-24 12:51:25 +010068 void Reset(void* data) override
69 {
70 m_Iterator = reinterpret_cast<T*>(data);
71 m_Start = m_Iterator;
72 }
73
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010074 TypedIterator& operator++() override
75 {
Matthew Benthamc394a6d2019-06-24 12:51:25 +010076 BOOST_ASSERT(m_Iterator);
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010077 ++m_Iterator;
78 return *this;
79 }
80
81 TypedIterator& operator+=(const unsigned int increment) override
82 {
Matthew Benthamc394a6d2019-06-24 12:51:25 +010083 BOOST_ASSERT(m_Iterator);
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010084 m_Iterator += increment;
85 return *this;
86 }
87
88 TypedIterator& operator-=(const unsigned int increment) override
89 {
Matthew Benthamc394a6d2019-06-24 12:51:25 +010090 BOOST_ASSERT(m_Iterator);
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010091 m_Iterator -= increment;
92 return *this;
93 }
94
Francis Murtagh43aec582019-05-27 12:14:10 +010095 TypedIterator& operator[](const unsigned int index) override
96 {
Matthew Benthamc394a6d2019-06-24 12:51:25 +010097 BOOST_ASSERT(m_Iterator);
Francis Murtagh43aec582019-05-27 12:14:10 +010098 m_Iterator = m_Start + index;
99 return *this;
100 }
101
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100102protected:
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100103 T* m_Iterator;
Francis Murtagh43aec582019-05-27 12:14:10 +0100104 T* m_Start;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100105};
106
Derek Lambertif30f7d32019-04-09 10:25:02 +0100107class QASymm8Decoder : public TypedIterator<const uint8_t, Decoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100108{
109public:
110 QASymm8Decoder(const uint8_t* data, const float scale, const int32_t offset)
111 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
112
Matthew Benthamc394a6d2019-06-24 12:51:25 +0100113 QASymm8Decoder(const float scale, const int32_t offset)
114 : QASymm8Decoder(nullptr, scale, offset) {}
115
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100116 float Get() const override
117 {
118 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
119 }
120
121private:
122 const float m_Scale;
123 const int32_t m_Offset;
124};
125
Derek Lambertif30f7d32019-04-09 10:25:02 +0100126class QSymm16Decoder : public TypedIterator<const int16_t, Decoder<float>>
Sadik Armagan2999a022019-04-09 14:20:12 +0100127{
128public:
129 QSymm16Decoder(const int16_t* data, const float scale, const int32_t offset)
130 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
131
Matthew Benthamc394a6d2019-06-24 12:51:25 +0100132 QSymm16Decoder(const float scale, const int32_t offset)
133 : QSymm16Decoder(nullptr, scale, offset) {}
134
Sadik Armagan2999a022019-04-09 14:20:12 +0100135 float Get() const override
136 {
137 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
138 }
139
140private:
141 const float m_Scale;
142 const int32_t m_Offset;
143};
144
Derek Lambertif30f7d32019-04-09 10:25:02 +0100145class FloatDecoder : public TypedIterator<const float, Decoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100146{
147public:
Derek Lambertif30f7d32019-04-09 10:25:02 +0100148 FloatDecoder(const float* data)
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100149 : TypedIterator(data) {}
150
Matthew Benthamc394a6d2019-06-24 12:51:25 +0100151 FloatDecoder()
152 : FloatDecoder(nullptr) {}
153
Derek Lambertif30f7d32019-04-09 10:25:02 +0100154 float Get() const override
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100155 {
Derek Lambertif30f7d32019-04-09 10:25:02 +0100156 return *m_Iterator;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100157 }
158};
159
Mike Kelly9b398322019-05-22 17:21:49 +0100160class ScaledInt32Decoder : public TypedIterator<const int32_t, Decoder<float>>
161{
162public:
163 ScaledInt32Decoder(const int32_t* data, const float scale)
164 : TypedIterator(data), m_Scale(scale) {}
165
Matthew Benthamc394a6d2019-06-24 12:51:25 +0100166 ScaledInt32Decoder(const float scale)
167 : ScaledInt32Decoder(nullptr, scale) {}
168
Mike Kelly9b398322019-05-22 17:21:49 +0100169 float Get() const override
170 {
171 return static_cast<float>(*m_Iterator) * m_Scale;
172 }
173
174private:
175 const float m_Scale;
176};
177
Aron Virginas-Tar198ee402019-08-02 18:54:28 +0100178class Int32Decoder : public TypedIterator<const int32_t, Decoder<float>>
179{
180public:
181 Int32Decoder(const int32_t* data)
182 : TypedIterator(data) {}
183
184 Int32Decoder()
185 : Int32Decoder(nullptr) {}
186
187 float Get() const override
188 {
189 return static_cast<float>(*m_Iterator);
190 }
191};
192
Derek Lambertif30f7d32019-04-09 10:25:02 +0100193class QASymm8Encoder : public TypedIterator<uint8_t, Encoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100194{
195public:
196 QASymm8Encoder(uint8_t* data, const float scale, const int32_t offset)
197 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
198
Matthew Benthamc394a6d2019-06-24 12:51:25 +0100199 QASymm8Encoder(const float scale, const int32_t offset)
200 : QASymm8Encoder(nullptr, scale, offset) {}
201
Derek Lambertif30f7d32019-04-09 10:25:02 +0100202 void Set(float right) override
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100203 {
204 *m_Iterator = armnn::Quantize<uint8_t>(right, m_Scale, m_Offset);
205 }
206
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100207 float Get() const override
208 {
209 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
210 }
211
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100212private:
213 const float m_Scale;
214 const int32_t m_Offset;
215};
216
Derek Lambertif30f7d32019-04-09 10:25:02 +0100217class QSymm16Encoder : public TypedIterator<int16_t, Encoder<float>>
218{
219public:
220 QSymm16Encoder(int16_t* data, const float scale, const int32_t offset)
221 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
222
Matthew Benthamc394a6d2019-06-24 12:51:25 +0100223 QSymm16Encoder(const float scale, const int32_t offset)
224 : QSymm16Encoder(nullptr, scale, offset) {}
225
Derek Lambertif30f7d32019-04-09 10:25:02 +0100226 void Set(float right) override
227 {
228 *m_Iterator = armnn::Quantize<int16_t>(right, m_Scale, m_Offset);
229 }
230
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100231 float Get() const override
232 {
233 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
234 }
235
Derek Lambertif30f7d32019-04-09 10:25:02 +0100236private:
237 const float m_Scale;
238 const int32_t m_Offset;
239};
240
241class FloatEncoder : public TypedIterator<float, Encoder<float>>
242{
243public:
244 FloatEncoder(float* data)
245 : TypedIterator(data) {}
246
Matthew Benthamc394a6d2019-06-24 12:51:25 +0100247 FloatEncoder()
248 : FloatEncoder(nullptr) {}
249
Derek Lambertif30f7d32019-04-09 10:25:02 +0100250 void Set(float right) override
251 {
252 *m_Iterator = right;
253 }
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100254
255 float Get() const override
256 {
257 return *m_Iterator;
258 }
Derek Lambertif30f7d32019-04-09 10:25:02 +0100259};
260
Aron Virginas-Tar198ee402019-08-02 18:54:28 +0100261class Int32Encoder : public TypedIterator<int32_t, Encoder<float>>
262{
263public:
264 Int32Encoder(int32_t* data)
265 : TypedIterator(data) {}
266
267 Int32Encoder()
268 : Int32Encoder(nullptr) {}
269
270 void Set(float right) override
271 {
272 *m_Iterator = static_cast<int32_t>(right);
273 }
274
275 float Get() const override
276 {
277 return static_cast<float>(*m_Iterator);
278 }
279};
280
Derek Lambertif30f7d32019-04-09 10:25:02 +0100281class BooleanEncoder : public TypedIterator<uint8_t, Encoder<bool>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100282{
283public:
284 BooleanEncoder(uint8_t* data)
285 : TypedIterator(data) {}
286
Matthew Benthamc394a6d2019-06-24 12:51:25 +0100287 BooleanEncoder()
288 : BooleanEncoder(nullptr) {}
289
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100290 void Set(bool right) override
291 {
292 *m_Iterator = right;
293 }
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100294
295 bool Get() const override
296 {
297 return *m_Iterator;
298 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100299};
300
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100301} //namespace armnn