PLCnext API Documentation 25.0.2.69
DataTypeDeductionBase.hpp
1
2//
3// Copyright Phoenix Contact GmbH & Co. KG
4//
6#pragma once
8#include "Arp/System/Core/TypeDeduction.hxx"
9#include "Arp/Plc/Commons/DataType.hpp"
10#include "Arp/Plc/Commons/DataTypeEnum.hpp"
11#include "Arp/Plc/Commons/PlcTypes.h"
12#include "Arp/Plc/Commons/Esm/IProgram.hpp"
13namespace Arp { namespace Plc { namespace Commons { namespace Meta { namespace TypeSystem
14{
15
17
18// helper types to determine element type of arrays
19template<class T, bool IsArray = std::is_array<T>::value>
21{
22 using type = T; // primary template, none array
23};
24
25template<class T>
26struct array_element_type<T, true>
27{
28 using type = typename std::remove_reference<decltype(*std::begin(std::declval<T&>()))>;
29};
30
31// global function GetDataType<T>() to determine DataType value by type
32template<class T>
33inline DataType GetDataType(void)
34{
35 if (std::is_enum<T>::value)
36 {
37 return DataType::Enum | GetDataType<typename underlying_enum_type<T>::type>();
38 }
39 else if (std::is_class<T>::value)
40 {
41 return DataType::Struct;
42 }
43 else if (std::is_array<T>::value)
44 {
45 return DataType::Array | GetDataType<typename array_element_type<T>::type>();
46 }
47 else if (std::is_pointer<T>::value)
48 {
49 return DataType::Pointer | GetDataType<typename std::remove_pointer<T>::type>();
50 }
51 else
52 {
53 return DataType::None; // this should never be returned here
54 }
55}
56
57template<>
58inline DataType GetDataType<Bit>()
59{
60 return DataType::Bit;
61}
62
63template<>
64inline DataType GetDataType<boolean>()
65{
66 return DataType::Boolean;
67}
68
69template<>
70inline DataType GetDataType<char8>()
71{
72 return DataType::Char8;
73}
74
75//template<>
76//inline DataType GetDataType<Char16>(void) { return DataType::Char16; }
77//
78template<>
79inline DataType GetDataType<uint8>()
80{
81 return DataType::UInt8;
82}
83
84template<>
85inline DataType GetDataType<int8>(void)
86{
87 return DataType::Int8;
88}
89
90template<>
91inline DataType GetDataType<uint16>(void)
92{
93 return DataType::UInt16;
94}
95
96template<>
97inline DataType GetDataType<int16>(void)
98{
99 return DataType::Int16;
100}
101
102template<>
103inline DataType GetDataType<uint32>(void)
104{
105 return DataType::UInt32;
106}
107
108template<>
109inline DataType GetDataType<int32>(void)
110{
111 return DataType::Int32;
112}
113
114template<>
115inline DataType GetDataType<uint64>(void)
116{
117 return DataType::UInt64;
118}
119
120template<>
121inline DataType GetDataType<int64>(void)
122{
123 return DataType::Int64;
124}
125
126template<>
127inline DataType GetDataType<float32>(void)
128{
129 return DataType::Float32;
130}
131
132template<>
133inline DataType GetDataType<float64>(void)
134{
135 return DataType::Float64;
136}
137
138template<>
139inline DataType GetDataType<DateTime>(void)
140{
141 return DataType::DateTime;
142}
143
144template<>
145inline DataType GetDataType<String>(void)
146{
147 return DataType::String;
148}
149
150template<>
151inline DataType GetDataType<IProgram>(void)
152{
153 return DataType::Program;
154}
155
157{
158protected: // typedefs/usings
160
161protected: // construction
162 DataTypeDeductionBase(DataType value) : Value(value) {}
163 DataTypeDeductionBase(const DataTypeDeductionBase& arg) = default;
165 DataTypeDeductionBase& operator=(const DataTypeDeductionBase& arg) = default;
166 DataTypeDeductionBase& operator=(DataTypeDeductionBase&& arg) = default;
167 ~DataTypeDeductionBase(void) = default;
168
169public: // operators
170 operator DataType(void)const;
171 operator DataTypeEnum(void)const;
172
173public: // fields
174 DataType Value = DataType::None;
175};
176
178// inline methods of class DataTypeDeductionBase
179inline DataTypeDeductionBase::operator DataType()const
180{
181 return this->Value;
182}
183
184inline DataTypeDeductionBase::operator DataTypeEnum()const
185{
186 return DataTypeEnum(this->Value);
187}
188
189}}}}} // end of namespace Arp::Plc::Commons::Meta::TypeSystem
Interface to implement PLC program to be executed in realtime context.
Definition: IProgram.hpp:19
Definition: DataTypeDeductionBase.hpp:157
Definition: DataTypeEnum.hpp:15
DataType
This enum represents the data type of a variable.
Definition: DataType.hpp:15
Root namespace for the PLCnext API
Definition: DataTypeDeductionBase.hpp:21