blob: ab6de2b37f68d10a537c53a775aa242ada85337a [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
11namespace armnn
12{
13
14class BaseIterator
15{
16public:
17 BaseIterator() {}
18
19 virtual ~BaseIterator() {}
20
21 virtual BaseIterator& operator++() = 0;
22
23 virtual BaseIterator& operator+=(const unsigned int increment) = 0;
24
25 virtual BaseIterator& operator-=(const unsigned int increment) = 0;
26};
27
Derek Lambertif30f7d32019-04-09 10:25:02 +010028template<typename IType>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010029class Decoder : public BaseIterator
30{
31public:
Derek Lambertif30f7d32019-04-09 10:25:02 +010032 Decoder() {}
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010033
34 virtual ~Decoder() {}
35
Derek Lambertif30f7d32019-04-09 10:25:02 +010036 virtual IType Get() const = 0;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010037};
38
Derek Lambertif30f7d32019-04-09 10:25:02 +010039template<typename IType>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010040class Encoder : public BaseIterator
41{
42public:
Derek Lambertif30f7d32019-04-09 10:25:02 +010043 Encoder() {}
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010044
45 virtual ~Encoder() {}
46
Derek Lambertif30f7d32019-04-09 10:25:02 +010047 virtual void Set(IType right) = 0;
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +010048
49 virtual IType Get() const = 0;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010050};
51
52template<typename T, typename Base>
53class TypedIterator : public Base
54{
55public:
56 TypedIterator(T* data)
57 : m_Iterator(data)
58 {}
59
60 TypedIterator& operator++() override
61 {
62 ++m_Iterator;
63 return *this;
64 }
65
66 TypedIterator& operator+=(const unsigned int increment) override
67 {
68 m_Iterator += increment;
69 return *this;
70 }
71
72 TypedIterator& operator-=(const unsigned int increment) override
73 {
74 m_Iterator -= increment;
75 return *this;
76 }
77
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +010078protected:
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010079 T* m_Iterator;
80};
81
Derek Lambertif30f7d32019-04-09 10:25:02 +010082class QASymm8Decoder : public TypedIterator<const uint8_t, Decoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010083{
84public:
85 QASymm8Decoder(const uint8_t* data, const float scale, const int32_t offset)
86 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
87
88 float Get() const override
89 {
90 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
91 }
92
93private:
94 const float m_Scale;
95 const int32_t m_Offset;
96};
97
Derek Lambertif30f7d32019-04-09 10:25:02 +010098class QSymm16Decoder : public TypedIterator<const int16_t, Decoder<float>>
Sadik Armagan2999a022019-04-09 14:20:12 +010099{
100public:
101 QSymm16Decoder(const int16_t* data, const float scale, const int32_t offset)
102 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
103
104 float Get() const override
105 {
106 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
107 }
108
109private:
110 const float m_Scale;
111 const int32_t m_Offset;
112};
113
Derek Lambertif30f7d32019-04-09 10:25:02 +0100114class FloatDecoder : public TypedIterator<const float, Decoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100115{
116public:
Derek Lambertif30f7d32019-04-09 10:25:02 +0100117 FloatDecoder(const float* data)
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100118 : TypedIterator(data) {}
119
Derek Lambertif30f7d32019-04-09 10:25:02 +0100120 float Get() const override
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100121 {
Derek Lambertif30f7d32019-04-09 10:25:02 +0100122 return *m_Iterator;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100123 }
124};
125
Mike Kelly9b398322019-05-22 17:21:49 +0100126class ScaledInt32Decoder : public TypedIterator<const int32_t, Decoder<float>>
127{
128public:
129 ScaledInt32Decoder(const int32_t* data, const float scale)
130 : TypedIterator(data), m_Scale(scale) {}
131
132 float Get() const override
133 {
134 return static_cast<float>(*m_Iterator) * m_Scale;
135 }
136
137private:
138 const float m_Scale;
139};
140
Derek Lambertif30f7d32019-04-09 10:25:02 +0100141class QASymm8Encoder : public TypedIterator<uint8_t, Encoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100142{
143public:
144 QASymm8Encoder(uint8_t* data, const float scale, const int32_t offset)
145 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
146
Derek Lambertif30f7d32019-04-09 10:25:02 +0100147 void Set(float right) override
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100148 {
149 *m_Iterator = armnn::Quantize<uint8_t>(right, m_Scale, m_Offset);
150 }
151
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100152 float Get() const override
153 {
154 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
155 }
156
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100157private:
158 const float m_Scale;
159 const int32_t m_Offset;
160};
161
Derek Lambertif30f7d32019-04-09 10:25:02 +0100162class QSymm16Encoder : public TypedIterator<int16_t, Encoder<float>>
163{
164public:
165 QSymm16Encoder(int16_t* data, const float scale, const int32_t offset)
166 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
167
168 void Set(float right) override
169 {
170 *m_Iterator = armnn::Quantize<int16_t>(right, m_Scale, m_Offset);
171 }
172
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100173 float Get() const override
174 {
175 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
176 }
177
Derek Lambertif30f7d32019-04-09 10:25:02 +0100178private:
179 const float m_Scale;
180 const int32_t m_Offset;
181};
182
183class FloatEncoder : public TypedIterator<float, Encoder<float>>
184{
185public:
186 FloatEncoder(float* data)
187 : TypedIterator(data) {}
188
189 void Set(float right) override
190 {
191 *m_Iterator = right;
192 }
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100193
194 float Get() const override
195 {
196 return *m_Iterator;
197 }
Derek Lambertif30f7d32019-04-09 10:25:02 +0100198};
199
200class BooleanEncoder : public TypedIterator<uint8_t, Encoder<bool>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100201{
202public:
203 BooleanEncoder(uint8_t* data)
204 : TypedIterator(data) {}
205
206 void Set(bool right) override
207 {
208 *m_Iterator = right;
209 }
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100210
211 bool Get() const override
212 {
213 return *m_Iterator;
214 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100215};
216
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100217} //namespace armnn