9#ifndef CORE_PROTOCOL_OPEN62541_VARIANT_CONVERTER_H_
10#define CORE_PROTOCOL_OPEN62541_VARIANT_CONVERTER_H_
18#include <boost/variant.hpp>
20#ifdef UA_ENABLE_AMALGAMATION
21# include <open62541.h>
23# include <open62541/types.h>
39template<>
struct UaScalarTraits<bool> {
using UaT = UA_Boolean;
static constexpr auto Type = UA_TYPES_BOOLEAN; };
41template<>
struct UaScalarTraits<unsigned int> {
using UaT = UA_UInt32;
static constexpr auto Type = UA_TYPES_UINT32; };
43template<>
struct UaScalarTraits<double> {
using UaT = UA_Double;
static constexpr auto Type = UA_TYPES_DOUBLE; };
44template<>
struct UaScalarTraits<std::string> {
using UaT = UA_String;
static constexpr auto Type = UA_TYPES_STRING; };
45template<>
struct UaScalarTraits<uint16_t> {
using UaT = UA_UInt16;
static constexpr auto Type = UA_TYPES_UINT16; };
54template<
typename T,
typename A>
69template<
typename CType,
typename UaType, const
int TypeIndex>
73 UaType value = std::get<CType>(src);
74 UA_Variant_setScalarCopy(&dst, &value,
75 &UA_TYPES[TypeIndex]);
79 if (src.type == &UA_TYPES[TypeIndex]) {
80 UaType value = *
reinterpret_cast<const UaType*
>(src.data);
93 const std::string& s = std::get<std::string>(src);
94 UA_String value = UA_STRING_ALLOC(s.c_str());
95 UA_Variant_setScalarCopy(&dst, &value, &UA_TYPES[UA_TYPES_STRING]);
100 if (src.type == &UA_TYPES[UA_TYPES_STRING]) {
101 const UA_String& ua = *
reinterpret_cast<const UA_String*
>(src.data);
102 dst = std::string(
reinterpret_cast<const char*
>(ua.data), ua.length);
110template<
typename CType,
typename UaType, const
int TypeIndex>
115 const auto& vec = std::get<std::vector<CType>>(src);
117 UA_Variant_setArrayCopy(
120 static_cast<UA_Int32
>(vec.size()),
127 if (src.type == &UA_TYPES[TypeIndex] && src.arrayLength > 0) {
128 const UaType* data =
reinterpret_cast<const UaType*
>(src.data);
130 std::vector<CType> vec;
131 vec.reserve(src.arrayLength);
133 for (
size_t i = 0; i < src.arrayLength; ++i) {
134 vec.emplace_back(
static_cast<CType
>(data[i]));
137 dst = std::move(vec);
145template<
int TypeIndex>
149 const auto& vec = std::get<std::vector<bool>>(src);
152 std::vector<uint8_t> tmp(vec.size());
153 for (
size_t i = 0; i < vec.size(); ++i) {
154 tmp[i] =
static_cast<uint8_t
>(vec[i]);
157 UA_Variant_setArrayCopy(
167 if (src.type == &UA_TYPES[TypeIndex] && src.arrayLength > 0) {
169 const uint8_t* data =
170 static_cast<const uint8_t*
>(src.data);
172 std::vector<bool> vec(src.arrayLength);
173 for (
size_t i = 0; i < src.arrayLength; ++i) {
174 vec[i] = data[i] != 0;
177 dst = std::move(vec);
192 const auto& vec = std::get<std::vector<std::string>>(src);
194 std::vector<UA_String> uaVec;
195 uaVec.reserve(vec.size());
197 for (
const auto& s : vec) {
198 uaVec.emplace_back(UA_STRING_ALLOC(s.c_str()));
201 UA_Variant_setArrayCopy(
204 static_cast<UA_Int32
>(uaVec.size()),
205 &UA_TYPES[UA_TYPES_STRING]
209 for (
auto& s : uaVec) {
216 if (src.type == &UA_TYPES[UA_TYPES_STRING] && src.arrayLength > 0) {
217 const UA_String* data =
reinterpret_cast<const UA_String*
>(src.data);
219 std::vector<std::string> vec;
220 vec.reserve(src.arrayLength);
222 for (
size_t i = 0; i < src.arrayLength; ++i) {
224 reinterpret_cast<const char*
>(data[i].data),
229 dst = std::move(vec);
static void ToUaVariant(const protocol::base::Variant &src, UA_Variant &dst)
Definition variantConverter.hpp:148
static void FromUaVariant(const UA_Variant &src, protocol::base::Variant &dst)
Definition variantConverter.hpp:165
static void ToUaVariant(const protocol::base::Variant &src, UA_Variant &dst)
Definition variantConverter.hpp:190
static void FromUaVariant(const UA_Variant &src, protocol::base::Variant &dst)
Definition variantConverter.hpp:214
Converts a variant holding a vector (OPC UA array).
Definition variantConverter.hpp:111
static void FromUaVariant(const UA_Variant &src, protocol::base::Variant &dst)
Definition variantConverter.hpp:125
static void ToUaVariant(const protocol::base::Variant &src, UA_Variant &dst)
Definition variantConverter.hpp:113
static void ToUaVariant(const protocol::base::Variant &src, UA_Variant &dst)
Definition variantConverter.hpp:91
static void FromUaVariant(const UA_Variant &src, protocol::base::Variant &dst)
Definition variantConverter.hpp:98
Converts a variant holding a scalar value.
Definition variantConverter.hpp:70
static void ToUaVariant(const protocol::base::Variant src, UA_Variant &dst)
Definition variantConverter.hpp:72
static void FromUaVariant(const UA_Variant src, protocol::base::Variant &dst)
Definition variantConverter.hpp:78
std::variant< bool, int, unsigned int, short, double, std::string, unsigned short, float, int8_t, uint8_t, std::vector< bool >, std::vector< int >, std::vector< unsigned int >, std::vector< short >, std::vector< double >, std::vector< float >, std::vector< std::string > > Variant
Definition iComm.hpp:24
Definition iDataChangeHandler.hpp:27
constexpr bool always_false_v
Definition variantConverter.hpp:33
constexpr bool is_std_vector_v
Definition variantConverter.hpp:58
UA_Boolean UaT
Definition variantConverter.hpp:39
static constexpr auto Type
Definition variantConverter.hpp:39
UA_Double UaT
Definition variantConverter.hpp:43
static constexpr auto Type
Definition variantConverter.hpp:43
UA_Float UaT
Definition variantConverter.hpp:46
static constexpr auto Type
Definition variantConverter.hpp:46
UA_SByte UaT
Definition variantConverter.hpp:47
static constexpr auto Type
Definition variantConverter.hpp:47
static constexpr auto Type
Definition variantConverter.hpp:40
UA_Int32 UaT
Definition variantConverter.hpp:40
static constexpr auto Type
Definition variantConverter.hpp:42
UA_Int16 UaT
Definition variantConverter.hpp:42
static constexpr auto Type
Definition variantConverter.hpp:44
UA_String UaT
Definition variantConverter.hpp:44
UA_UInt16 UaT
Definition variantConverter.hpp:45
static constexpr auto Type
Definition variantConverter.hpp:45
static constexpr auto Type
Definition variantConverter.hpp:48
UA_Byte UaT
Definition variantConverter.hpp:48
static constexpr auto Type
Definition variantConverter.hpp:41
UA_UInt32 UaT
Definition variantConverter.hpp:41
Definition variantConverter.hpp:37
Definition variantConverter.hpp:52