IOLink  IOL_v1.1.0_release
DataType.h
1 #pragma once
2 
3 #include <iolink/IOLinkAPI.h>
4 #include <iolink/Vector.h>
5 
6 #include <iostream>
7 
8 namespace iolink
9 {
10 
19 enum class PrimitiveTypeId : uint16_t
20 {
22  UNKNOWN = 0x0000,
23 
25  UNSIGNED_INTEGER = 0x0001,
26 
28  SIGNED_INTEGER = 0x0002,
29 
31  FLOATING_POINT = 0x0003,
32 
34  UNICODE_STRING = 0x0004,
35 };
36 
40 enum class DataTypeInterpretation : uint32_t
41 {
43  RAW = 0,
44 
51  COMPLEX,
52 
66 
80 };
81 
85 enum class DataTypeId : uint64_t
86 {
87  UNKNOWN = 0x0000000000000000,
88  UINT8 = 0x0000000000010108,
89  UINT16 = 0x0000000000010110,
90  UINT32 = 0x0000000000010120,
91  UINT64 = 0x0000000000010140,
92  INT8 = 0x0000000000020108,
93  INT16 = 0x0000000000020110,
94  INT32 = 0x0000000000020120,
95  INT64 = 0x0000000000020140,
96  FLOAT = 0x0000000000030120,
97  DOUBLE = 0x0000000000030140,
98  UTF8_STRING = 0x0000000000040108,
99  UTF16_STRING = 0x0000000000040110,
100  UTF32_STRING = 0x0000000000040120,
101  VEC2_UINT8 = 0x0000000000010208,
102  VEC2_UINT16 = 0x0000000000010210,
103  VEC2_UINT32 = 0x0000000000010220,
104  VEC2_UINT64 = 0x0000000000010240,
105  VEC2_INT8 = 0x0000000000020208,
106  VEC2_INT16 = 0x0000000000020210,
107  VEC2_INT32 = 0x0000000000020220,
108  VEC2_INT64 = 0x0000000000020240,
109  VEC2_FLOAT = 0x0000000000030220,
110  VEC2_DOUBLE = 0x0000000000030240,
111  VEC3_UINT8 = 0x0000000000010308,
112  VEC3_UINT16 = 0x0000000000010310,
113  VEC3_UINT32 = 0x0000000000010320,
114  VEC3_UINT64 = 0x0000000000010340,
115  VEC3_INT8 = 0x0000000000020308,
116  VEC3_INT16 = 0x0000000000020310,
117  VEC3_INT32 = 0x0000000000020320,
118  VEC3_INT64 = 0x0000000000020340,
119  VEC3_FLOAT = 0x0000000000030320,
120  VEC3_DOUBLE = 0x0000000000030340,
121  VEC4_UINT8 = 0x0000000000010408,
122  VEC4_UINT16 = 0x0000000000010410,
123  VEC4_UINT32 = 0x0000000000010420,
124  VEC4_UINT64 = 0x0000000000010440,
125  VEC4_INT8 = 0x0000000000020408,
126  VEC4_INT16 = 0x0000000000020410,
127  VEC4_INT32 = 0x0000000000020420,
128  VEC4_INT64 = 0x0000000000020440,
129  VEC4_FLOAT = 0x0000000000030420,
130  VEC4_DOUBLE = 0x0000000000030440,
131  COMPLEX_FLOAT = 0x0000000100030220,
132  COMPLEX_DOUBLE = 0x0000000100030240,
133  MATRIX2_FLOAT = 0x0000000200030420,
134  MATRIX2_DOUBLE = 0x0000000200030440,
135  MATRIX3_FLOAT = 0x0000000200030920,
136  MATRIX3_DOUBLE = 0x0000000200030940,
137  MATRIX4_FLOAT = 0x0000000200031020,
138  MATRIX4_DOUBLE = 0x0000000200031040,
139  SYM_MATRIX2_FLOAT = 0x0000000300030320,
140  SYM_MATRIX2_DOUBLE = 0x0000000300030340,
141  SYM_MATRIX3_FLOAT = 0x0000000300030620,
142  SYM_MATRIX3_DOUBLE = 0x0000000300030640
143 };
144 
161 class IOLINK_API DataType
162 {
163 
164 public:
170  static DataType extractScalarType(DataType dtype);
171 
183  static Vector2d standardRange(DataType dtype);
184 
190  DataType() noexcept;
191 
195  explicit DataType(uint64_t value) noexcept;
196 
200  DataType(DataTypeId value) noexcept;
201 
205  DataType(PrimitiveTypeId primitiveType,
206  size_t dimension,
207  size_t bitDepth,
208  DataTypeInterpretation interpretation) noexcept;
209 
213  DataType(PrimitiveTypeId primitiveType, size_t dimension, size_t bitDepth) noexcept;
214 
218  bool isNumeric() const;
219 
223  bool isScalar() const;
224 
228  bool isVector() const;
229 
235  bool isConvertibleTo(DataType other) const;
236 
241  uint64_t id() const noexcept;
242 
246  inline size_t bitDepth() const noexcept { return m_bitDepth; }
247 
255  inline size_t elementCount() const noexcept { return m_dimension; }
256 
262  inline PrimitiveTypeId primitiveType() const noexcept { return m_primitiveType; }
263 
269  inline DataTypeInterpretation interpretation() const noexcept { return m_interpretation; }
270 
274  inline size_t bitCount() const { return m_bitDepth * m_dimension; }
275 
283  size_t byteCount() const { return (m_bitDepth * m_dimension - 1) / 8 + 1; }
284 
288  std::string toString() const;
289 
290  bool operator==(DataType other) const;
291  bool operator!=(DataType other) const;
292 
293 private:
294  uint8_t m_bitDepth;
295  uint8_t m_dimension;
296  PrimitiveTypeId m_primitiveType;
297  DataTypeInterpretation m_interpretation;
298 };
299 
300 inline std::ostream&
301 operator<<(std::ostream& os, const DataType datatype)
302 {
303  os << datatype.toString().c_str();
304  return os;
305 }
306 
307 } // end namespace iolink