blob: 26b0179e71741596ff1e3f21b050f6761676b9e8 [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;
Francis Murtagh43aec582019-05-27 12:14:10 +010026
27 virtual BaseIterator& operator[](const unsigned int index) = 0;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010028};
29
Derek Lambertif30f7d32019-04-09 10:25:02 +010030template<typename IType>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010031class Decoder : public BaseIterator
32{
33public:
Derek Lambertif30f7d32019-04-09 10:25:02 +010034 Decoder() {}
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010035
36 virtual ~Decoder() {}
37
Derek Lambertif30f7d32019-04-09 10:25:02 +010038 virtual IType Get() const = 0;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010039};
40
Derek Lambertif30f7d32019-04-09 10:25:02 +010041template<typename IType>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010042class Encoder : public BaseIterator
43{
44public:
Derek Lambertif30f7d32019-04-09 10:25:02 +010045 Encoder() {}
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010046
47 virtual ~Encoder() {}
48
Derek Lambertif30f7d32019-04-09 10:25:02 +010049 virtual void Set(IType right) = 0;
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +010050
51 virtual IType Get() const = 0;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010052};
53
54template<typename T, typename Base>
55class TypedIterator : public Base
56{
57public:
58 TypedIterator(T* data)
Francis Murtagh43aec582019-05-27 12:14:10 +010059 : m_Iterator(data), m_Start(data)
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010060 {}
61
62 TypedIterator& operator++() override
63 {
64 ++m_Iterator;
65 return *this;
66 }
67
68 TypedIterator& operator+=(const unsigned int increment) override
69 {
70 m_Iterator += increment;
71 return *this;
72 }
73
74 TypedIterator& operator-=(const unsigned int increment) override
75 {
76 m_Iterator -= increment;
77 return *this;
78 }
79
Francis Murtagh43aec582019-05-27 12:14:10 +010080 TypedIterator& operator[](const unsigned int index) override
81 {
82 m_Iterator = m_Start + index;
83 return *this;
84 }
85
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +010086protected:
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010087 T* m_Iterator;
Francis Murtagh43aec582019-05-27 12:14:10 +010088 T* m_Start;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010089};
90
Derek Lambertif30f7d32019-04-09 10:25:02 +010091class QASymm8Decoder : public TypedIterator<const uint8_t, Decoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010092{
93public:
94 QASymm8Decoder(const uint8_t* data, const float scale, const int32_t offset)
95 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
96
97 float Get() const override
98 {
99 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
100 }
101
102private:
103 const float m_Scale;
104 const int32_t m_Offset;
105};
106
Derek Lambertif30f7d32019-04-09 10:25:02 +0100107class QSymm16Decoder : public TypedIterator<const int16_t, Decoder<float>>
Sadik Armagan2999a022019-04-09 14:20:12 +0100108{
109public:
110 QSymm16Decoder(const int16_t* data, const float scale, const int32_t offset)
111 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
112
113 float Get() const override
114 {
115 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
116 }
117
118private:
119 const float m_Scale;
120 const int32_t m_Offset;
121};
122
Derek Lambertif30f7d32019-04-09 10:25:02 +0100123class FloatDecoder : public TypedIterator<const float, Decoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100124{
125public:
Derek Lambertif30f7d32019-04-09 10:25:02 +0100126 FloatDecoder(const float* data)
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100127 : TypedIterator(data) {}
128
Derek Lambertif30f7d32019-04-09 10:25:02 +0100129 float Get() const override
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100130 {
Derek Lambertif30f7d32019-04-09 10:25:02 +0100131 return *m_Iterator;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100132 }
133};
134
Mike Kelly9b398322019-05-22 17:21:49 +0100135class ScaledInt32Decoder : public TypedIterator<const int32_t, Decoder<float>>
136{
137public:
138 ScaledInt32Decoder(const int32_t* data, const float scale)
139 : TypedIterator(data), m_Scale(scale) {}
140
141 float Get() const override
142 {
143 return static_cast<float>(*m_Iterator) * m_Scale;
144 }
145
146private:
147 const float m_Scale;
148};
149
Derek Lambertif30f7d32019-04-09 10:25:02 +0100150class QASymm8Encoder : public TypedIterator<uint8_t, Encoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100151{
152public:
153 QASymm8Encoder(uint8_t* data, const float scale, const int32_t offset)
154 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
155
Derek Lambertif30f7d32019-04-09 10:25:02 +0100156 void Set(float right) override
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100157 {
158 *m_Iterator = armnn::Quantize<uint8_t>(right, m_Scale, m_Offset);
159 }
160
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100161 float Get() const override
162 {
163 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
164 }
165
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100166private:
167 const float m_Scale;
168 const int32_t m_Offset;
169};
170
Derek Lambertif30f7d32019-04-09 10:25:02 +0100171class QSymm16Encoder : public TypedIterator<int16_t, Encoder<float>>
172{
173public:
174 QSymm16Encoder(int16_t* data, const float scale, const int32_t offset)
175 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
176
177 void Set(float right) override
178 {
179 *m_Iterator = armnn::Quantize<int16_t>(right, m_Scale, m_Offset);
180 }
181
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100182 float Get() const override
183 {
184 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
185 }
186
Derek Lambertif30f7d32019-04-09 10:25:02 +0100187private:
188 const float m_Scale;
189 const int32_t m_Offset;
190};
191
192class FloatEncoder : public TypedIterator<float, Encoder<float>>
193{
194public:
195 FloatEncoder(float* data)
196 : TypedIterator(data) {}
197
198 void Set(float right) override
199 {
200 *m_Iterator = right;
201 }
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100202
203 float Get() const override
204 {
205 return *m_Iterator;
206 }
Derek Lambertif30f7d32019-04-09 10:25:02 +0100207};
208
209class BooleanEncoder : public TypedIterator<uint8_t, Encoder<bool>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100210{
211public:
212 BooleanEncoder(uint8_t* data)
213 : TypedIterator(data) {}
214
215 void Set(bool right) override
216 {
217 *m_Iterator = right;
218 }
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100219
220 bool Get() const override
221 {
222 return *m_Iterator;
223 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100224};
225
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100226} //namespace armnn