Release 18.08
[platform/upstream/armnn.git] / src / armnn / LayerSupportCommon.hpp
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // See LICENSE file in the project root for full license information.
4 //
5 #pragma once
6
7 #include <armnn/DescriptorsFwd.hpp>
8 #include <armnn/Types.hpp>
9 #include <armnn/Tensor.hpp>
10
11 namespace armnn
12 {
13
14 template<typename Float16Func, typename Float32Func, typename Uint8Func, typename ... Params>
15 bool IsSupportedForDataTypeGeneric(std::string* reasonIfUnsupported,
16                                    DataType dataType,
17                                    Float16Func float16FuncPtr,
18                                    Float32Func float32FuncPtr,
19                                    Uint8Func uint8FuncPtr,
20                                    Params&&... params)
21 {
22     switch(dataType)
23     {
24         case DataType::Float16:
25             return float16FuncPtr(reasonIfUnsupported, std::forward<Params>(params)...);
26         case DataType::Float32:
27             return float32FuncPtr(reasonIfUnsupported, std::forward<Params>(params)...);
28         case DataType::QuantisedAsymm8:
29             return uint8FuncPtr(reasonIfUnsupported, std::forward<Params>(params)...);
30         default:
31             return false;
32     }
33 }
34
35 template<typename ... Params>
36 bool TrueFunc(std::string* reasonIfUnsupported, Params&&... params)
37 {
38     return true;
39 }
40
41 template<typename ... Params>
42 bool FalseFunc(std::string* reasonIfUnsupported, Params&&... params)
43 {
44     return false;
45 }
46
47 template<typename ... Params>
48 bool FalseFuncF16(std::string* reasonIfUnsupported, Params&&... params)
49 {
50     if (reasonIfUnsupported)
51     {
52         *reasonIfUnsupported = "Layer is not supported with float16 data type";
53     }
54     return false;
55 }
56
57 template<typename ... Params>
58 bool FalseFuncF32(std::string* reasonIfUnsupported, Params&&... params)
59 {
60     if (reasonIfUnsupported)
61     {
62         *reasonIfUnsupported = "Layer is not supported with float32 data type";
63     }
64     return false;
65 }
66
67 template<typename ... Params>
68 bool FalseFuncU8(std::string* reasonIfUnsupported, Params&&... params)
69 {
70     if (reasonIfUnsupported)
71     {
72         *reasonIfUnsupported = "Layer is not supported with 8-bit data type";
73     }
74     return false;
75 }
76
77 template<typename ... Params>
78 bool FalseInputFuncF32(std::string* reasonIfUnsupported, Params&&... params)
79 {
80     if (reasonIfUnsupported)
81     {
82         *reasonIfUnsupported = "Layer is not supported with float32 data type input";
83     }
84     return false;
85 }
86
87 template<typename ... Params>
88 bool FalseInputFuncF16(std::string* reasonIfUnsupported, Params&&... params)
89 {
90     if (reasonIfUnsupported)
91     {
92         *reasonIfUnsupported = "Layer is not supported with float16 data type input";
93     }
94     return false;
95 }
96
97 template<typename ... Params>
98 bool FalseOutputFuncF32(std::string* reasonIfUnsupported, Params&&... params)
99 {
100     if (reasonIfUnsupported)
101     {
102         *reasonIfUnsupported = "Layer is not supported with float32 data type output";
103     }
104     return false;
105 }
106
107 template<typename ... Params>
108 bool FalseOutputFuncF16(std::string* reasonIfUnsupported, Params&&... params)
109 {
110     if (reasonIfUnsupported)
111     {
112         *reasonIfUnsupported = "Layer is not supported with float16 data type output";
113     }
114     return false;
115 }
116
117 }