blob: 97af95a0eb612bdbdb0fe4ae1ffbe95ae3b89cfe [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
Derek Lambertif30f7d32019-04-09 10:25:02 +0100126class QASymm8Encoder : public TypedIterator<uint8_t, Encoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100127{
128public:
129 QASymm8Encoder(uint8_t* data, const float scale, const int32_t offset)
130 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
131
Derek Lambertif30f7d32019-04-09 10:25:02 +0100132 void Set(float right) override
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100133 {
134 *m_Iterator = armnn::Quantize<uint8_t>(right, m_Scale, m_Offset);
135 }
136
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100137 float Get() const override
138 {
139 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
140 }
141
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100142private:
143 const float m_Scale;
144 const int32_t m_Offset;
145};
146
Derek Lambertif30f7d32019-04-09 10:25:02 +0100147class QSymm16Encoder : public TypedIterator<int16_t, Encoder<float>>
148{
149public:
150 QSymm16Encoder(int16_t* data, const float scale, const int32_t offset)
151 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
152
153 void Set(float right) override
154 {
155 *m_Iterator = armnn::Quantize<int16_t>(right, m_Scale, m_Offset);
156 }
157
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100158 float Get() const override
159 {
160 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
161 }
162
Derek Lambertif30f7d32019-04-09 10:25:02 +0100163private:
164 const float m_Scale;
165 const int32_t m_Offset;
166};
167
168class FloatEncoder : public TypedIterator<float, Encoder<float>>
169{
170public:
171 FloatEncoder(float* data)
172 : TypedIterator(data) {}
173
174 void Set(float right) override
175 {
176 *m_Iterator = right;
177 }
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100178
179 float Get() const override
180 {
181 return *m_Iterator;
182 }
Derek Lambertif30f7d32019-04-09 10:25:02 +0100183};
184
185class BooleanEncoder : public TypedIterator<uint8_t, Encoder<bool>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100186{
187public:
188 BooleanEncoder(uint8_t* data)
189 : TypedIterator(data) {}
190
191 void Set(bool right) override
192 {
193 *m_Iterator = right;
194 }
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100195
196 bool Get() const override
197 {
198 return *m_Iterator;
199 }
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100200};
201
Nattapat Chaimanowongeb2b3292019-05-07 12:02:30 +0100202} //namespace armnn