blob: 5583fe79ad2503e9c257ff91f3b895516e28cbb9 [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
Derek Lambertif30f7d32019-04-09 10:25:02 +0100178class QASymm8Encoder : public TypedIterator<uint8_t, Encoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100179{
180public:
181 QASymm8Encoder(uint8_t* data, const float scale, const int32_t offset)
182 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
183
Matthew Benthamc394a6d2019-06-24 12:51:25 +0100184 QASymm8Encoder(const float scale, const int32_t offset)
185 : QASymm8Encoder(nullptr, scale, offset) {}
186
Derek Lambertif30f7d32019-04-09 10:25:02 +0100187 void Set(float right) override
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100188 {
189 *m_Iterator = armnn::Quantize<uint8_t>(right, m_Scale, m_Offset);
190 }
191
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100192 float Get() const override
193 {
194 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
195 }
196
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100197private:
198 const float m_Scale;
199 const int32_t m_Offset;
200};
201
Derek Lambertif30f7d32019-04-09 10:25:02 +0100202class QSymm16Encoder : public TypedIterator<int16_t, Encoder<float>>
203{
204public:
205 QSymm16Encoder(int16_t* data, const float scale, const int32_t offset)
206 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
207
Matthew Benthamc394a6d2019-06-24 12:51:25 +0100208 QSymm16Encoder(const float scale, const int32_t offset)
209 : QSymm16Encoder(nullptr, scale, offset) {}
210
Derek Lambertif30f7d32019-04-09 10:25:02 +0100211 void Set(float right) override
212 {
213 *m_Iterator = armnn::Quantize<int16_t>(right, m_Scale, m_Offset);
214 }
215
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100216 float Get() const override
217 {
218 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
219 }
220
Derek Lambertif30f7d32019-04-09 10:25:02 +0100221private:
222 const float m_Scale;
223 const int32_t m_Offset;
224};
225
226class FloatEncoder : public TypedIterator<float, Encoder<float>>
227{
228public:
229 FloatEncoder(float* data)
230 : TypedIterator(data) {}
231
Matthew Benthamc394a6d2019-06-24 12:51:25 +0100232 FloatEncoder()
233 : FloatEncoder(nullptr) {}
234
Derek Lambertif30f7d32019-04-09 10:25:02 +0100235 void Set(float right) override
236 {
237 *m_Iterator = right;
238 }
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100239
240 float Get() const override
241 {
242 return *m_Iterator;
243 }
Derek Lambertif30f7d32019-04-09 10:25:02 +0100244};
245
246class BooleanEncoder : public TypedIterator<uint8_t, Encoder<bool>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100247{
248public:
249 BooleanEncoder(uint8_t* data)
250 : TypedIterator(data) {}
251
Matthew Benthamc394a6d2019-06-24 12:51:25 +0100252 BooleanEncoder()
253 : BooleanEncoder(nullptr) {}
254
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100255 void Set(bool right) override
256 {
257 *m_Iterator = right;
258 }
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100259
260 bool Get() const override
261 {
262 return *m_Iterator;
263 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100264};
265
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100266} //namespace armnn