blob: 2b3a11af063ef50fc16ccbcbff9d054650c04881 [file] [log] [blame]
Derek Lambertif30f7d32019-04-09 10:25:02 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#pragma once
7
8#include "BaseIterator.hpp"
9
Matteo Martincigh3122bd52019-06-03 16:54:25 +010010#include <boost/assert.hpp>
11
Derek Lambertif30f7d32019-04-09 10:25:02 +010012namespace armnn
13{
14
15template<typename T>
Matthew Benthamc394a6d2019-06-24 12:51:25 +010016inline std::unique_ptr<Encoder<T>> MakeEncoder(const TensorInfo& info, void* data = nullptr);
Derek Lambertif30f7d32019-04-09 10:25:02 +010017
18template<>
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010019inline std::unique_ptr<Encoder<float>> MakeEncoder(const TensorInfo& info, void* data)
Derek Lambertif30f7d32019-04-09 10:25:02 +010020{
21 switch(info.GetDataType())
22 {
23 case armnn::DataType::QuantisedAsymm8:
24 {
25 return std::make_unique<QASymm8Encoder>(
26 static_cast<uint8_t*>(data),
27 info.GetQuantizationScale(),
28 info.GetQuantizationOffset());
29 }
30 case armnn::DataType::QuantisedSymm16:
31 {
32 return std::make_unique<QSymm16Encoder>(
33 static_cast<int16_t*>(data),
34 info.GetQuantizationScale(),
35 info.GetQuantizationOffset());
36 }
Aron Virginas-Tar198ee402019-08-02 18:54:28 +010037 case armnn::DataType::Signed32:
38 {
39 return std::make_unique<Int32Encoder>(static_cast<int32_t*>(data));
40 }
Matthew Jacksone69c3992019-09-09 14:31:21 +010041 case armnn::DataType::Float16:
42 {
43 return std::make_unique<Float16Encoder>(static_cast<Half*>(data));
44 }
Derek Lambertif30f7d32019-04-09 10:25:02 +010045 case armnn::DataType::Float32:
46 {
Matthew Jacksone69c3992019-09-09 14:31:21 +010047 return std::make_unique<Float32Encoder>(static_cast<float*>(data));
Derek Lambertif30f7d32019-04-09 10:25:02 +010048 }
49 default:
50 {
51 BOOST_ASSERT_MSG(false, "Cannot encode from float. Not supported target Data Type!");
52 break;
53 }
54 }
55 return nullptr;
56}
57
58template<>
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010059inline std::unique_ptr<Encoder<bool>> MakeEncoder(const TensorInfo& info, void* data)
Derek Lambertif30f7d32019-04-09 10:25:02 +010060{
61 switch(info.GetDataType())
62 {
63 case armnn::DataType::Boolean:
64 {
65 return std::make_unique<BooleanEncoder>(static_cast<uint8_t*>(data));
66 }
67 default:
68 {
69 BOOST_ASSERT_MSG(false, "Cannot encode from boolean. Not supported target Data Type!");
70 break;
71 }
72 }
73 return nullptr;
74}
75
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010076} //namespace armnn