Orion
high-rate readout
variant.hpp
Go to the documentation of this file.
1 
5 #pragma once
6 
7 #include <cstdint>
8 #include <string>
9 #include <vector>
10 #include <variant>
11 
12 
13 namespace itk::opc {
14 
18 class Variant {
19 public:
20  inline bool operator == (const Variant& var) const { return var.val == val; }
21  inline bool operator != (const Variant& var) const { return !(*this == var); }
22 
25  template<typename T>
26  inline T& get() { return std::get<T>(val); }
27 
31  template<typename T>
32  inline void set(const T& value) { val = value; }
33 
36  template<typename T>
37  inline bool is_type() { return std::holds_alternative<T>(val); }
38 
41  inline bool &get_bool() { return std::get<bool>(val); }
42  inline int8_t &get_int8() { return std::get<int8_t>(val); }
43  inline int16_t &get_int16() { return std::get<int16_t>(val); }
44  inline int32_t &get_int32() { return std::get<int32_t>(val); }
45  inline int64_t &get_int64() { return std::get<int64_t>(val); }
46  inline uint8_t &get_uint8() { return std::get<uint8_t>(val); }
47  inline uint16_t &get_uint16() { return std::get<uint16_t>(val); }
48  inline uint32_t &get_uint32() { return std::get<uint32_t>(val); }
49  inline uint64_t &get_uint64() { return std::get<uint64_t>(val); }
50  inline float &get_float() { return std::get<float>(val); }
51  inline double &get_double() { return std::get<double>(val); }
52  inline std::string &get_string() { return std::get<std::string>(val); }
53 
56  inline void set(bool value) { set<bool>(value); }
57  inline void set(int8_t value) { set<int8_t>(value); }
58  inline void set(int16_t value) { set<int16_t>(value); }
59  inline void set(int32_t value) { set<int32_t>(value); }
60  inline void set(int64_t value) { set<int64_t>(value); }
61  inline void set(uint8_t value) { set<uint8_t>(value); }
62  inline void set(uint16_t value) { set<uint16_t>(value); }
63  inline void set(uint32_t value) { set<uint32_t>(value); }
64  inline void set(uint64_t value) { set<uint64_t>(value); }
65  inline void set(float value) { set<float>(value); }
66  inline void set(double value) { set<double>(value); }
67  inline void set(const std::string& value) { set<std::string>(value); }
68 
71  inline bool undefined() {
72  return std::holds_alternative<std::monostate>(val);
73  }
74  inline bool is_bool() { return is_type<bool>(); }
75  inline bool is_int8() { return is_type<int8_t>(); }
76  inline bool is_int16() { return is_type<int16_t>(); }
77  inline bool is_int32() { return is_type<int32_t>(); }
78  inline bool is_int64() { return is_type<int64_t>(); }
79  inline bool is_uint8() { return is_type<uint8_t>(); }
80  inline bool is_uint16() { return is_type<uint16_t>(); }
81  inline bool is_uint32() { return is_type<uint32_t>(); }
82  inline bool is_uint64() { return is_type<uint64_t>(); }
83  inline bool is_float() { return is_type<float>(); }
84  inline bool is_double() { return is_type<double>(); }
85  inline bool is_string() { return is_type<std::string>(); }
86 
89  inline bool is_int() {
90  return is_int8() || is_int16() || is_int32() || is_int64();
91  }
92 
95  inline bool is_uint() {
96  return is_uint8() || is_uint16() || is_uint32() || is_uint64();
97  }
98 
101  inline bool is_real() {
102  return is_float() || is_double();
103  }
104 
107  inline int64_t as_int() {
108  if (is_int8()) return get_int8();
109  if (is_int16()) return get_int16();
110  if (is_int32()) return get_int32();
111  return get_int64();
112  }
113 
116  inline uint64_t as_uint() {
117  if (is_uint8()) return get_uint8();
118  if (is_uint16()) return get_uint16();
119  if (is_uint32()) return get_uint32();
120  return get_uint64();
121  }
122 
125  inline double as_real() {
126  if (is_float()) return get_float();
127  return get_double();
128  }
129 
130  std::variant<
131  std::monostate,
132  bool,
133  int8_t, uint8_t,
134  int16_t, uint16_t,
135  int32_t, uint32_t,
136  int64_t, uint64_t,
137  float, double,
138  std::string,
139  std::vector<int8_t>,
140  std::vector<uint8_t>,
141  std::vector<int16_t>,
142  std::vector<uint16_t>,
143  std::vector<int32_t>,
144  std::vector<uint32_t>,
145  std::vector<int64_t>,
146  std::vector<uint64_t>
147  > val;
148 
149 }; // Variant
150 
151 } // itk::opc
Definition: variant.hpp:18
double as_real()
Getting real value (float or double)
Definition: variant.hpp:125
void set(bool value)
List of setters for each variant type.
Definition: variant.hpp:56
void set(const T &value)
template to set value
Definition: variant.hpp:32
bool is_int()
Test if value is signed integer (int8, int16, int32, int64).
Definition: variant.hpp:89
uint64_t as_uint()
Getting unsigned value.
Definition: variant.hpp:116
bool undefined()
Definition: variant.hpp:71
bool & get_bool()
List of getters for each variant type.
Definition: variant.hpp:41
int64_t as_int()
Getting signed value.
Definition: variant.hpp:107
bool is_uint()
Test if value is unsigned integer (uint8, uint16, uint32, uint64).
Definition: variant.hpp:95
bool is_real()
Test if value is real (float pr double).
Definition: variant.hpp:101
bool is_type()
Template to check type of variant.
Definition: variant.hpp:37
T & get()
template to get value
Definition: variant.hpp:26