blob: 955d7f21858dd30c03c74683a7d00d44c4977c46 [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>
9#include <TypeUtils.hpp>
10
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 using InterfaceType = IType;
33
34 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 using InterfaceType = IType;
46
47 Encoder() {}
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010048
49 virtual ~Encoder() {}
50
Derek Lambertif30f7d32019-04-09 10:25:02 +010051 virtual void Set(IType right) = 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)
59 : m_Iterator(data)
60 {}
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
80 T* m_Iterator;
81};
82
Derek Lambertif30f7d32019-04-09 10:25:02 +010083class QASymm8Decoder : public TypedIterator<const uint8_t, Decoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010084{
85public:
86 QASymm8Decoder(const uint8_t* data, const float scale, const int32_t offset)
87 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
88
89 float Get() const override
90 {
91 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
92 }
93
94private:
95 const float m_Scale;
96 const int32_t m_Offset;
97};
98
Derek Lambertif30f7d32019-04-09 10:25:02 +010099class QSymm16Decoder : public TypedIterator<const int16_t, Decoder<float>>
Sadik Armagan2999a022019-04-09 14:20:12 +0100100{
101public:
102 QSymm16Decoder(const int16_t* data, const float scale, const int32_t offset)
103 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
104
105 float Get() const override
106 {
107 return armnn::Dequantize(*m_Iterator, m_Scale, m_Offset);
108 }
109
110private:
111 const float m_Scale;
112 const int32_t m_Offset;
113};
114
Derek Lambertif30f7d32019-04-09 10:25:02 +0100115class FloatDecoder : public TypedIterator<const float, Decoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100116{
117public:
Derek Lambertif30f7d32019-04-09 10:25:02 +0100118 FloatDecoder(const float* data)
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100119 : TypedIterator(data) {}
120
Derek Lambertif30f7d32019-04-09 10:25:02 +0100121 float Get() const override
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100122 {
Derek Lambertif30f7d32019-04-09 10:25:02 +0100123 return *m_Iterator;
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100124 }
125};
126
Derek Lambertif30f7d32019-04-09 10:25:02 +0100127class QASymm8Encoder : public TypedIterator<uint8_t, Encoder<float>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100128{
129public:
130 QASymm8Encoder(uint8_t* data, const float scale, const int32_t offset)
131 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
132
Derek Lambertif30f7d32019-04-09 10:25:02 +0100133 void Set(float right) override
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100134 {
135 *m_Iterator = armnn::Quantize<uint8_t>(right, m_Scale, m_Offset);
136 }
137
138private:
139 const float m_Scale;
140 const int32_t m_Offset;
141};
142
Derek Lambertif30f7d32019-04-09 10:25:02 +0100143class QSymm16Encoder : public TypedIterator<int16_t, Encoder<float>>
144{
145public:
146 QSymm16Encoder(int16_t* data, const float scale, const int32_t offset)
147 : TypedIterator(data), m_Scale(scale), m_Offset(offset) {}
148
149 void Set(float right) override
150 {
151 *m_Iterator = armnn::Quantize<int16_t>(right, m_Scale, m_Offset);
152 }
153
154private:
155 const float m_Scale;
156 const int32_t m_Offset;
157};
158
159class FloatEncoder : public TypedIterator<float, Encoder<float>>
160{
161public:
162 FloatEncoder(float* data)
163 : TypedIterator(data) {}
164
165 void Set(float right) override
166 {
167 *m_Iterator = right;
168 }
169};
170
171class BooleanEncoder : public TypedIterator<uint8_t, Encoder<bool>>
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100172{
173public:
174 BooleanEncoder(uint8_t* data)
175 : TypedIterator(data) {}
176
177 void Set(bool right) override
178 {
179 *m_Iterator = right;
180 }
181};
182
Sadik Armagan2999a022019-04-09 14:20:12 +0100183
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100184} //namespace armnn