IOLink IOL_v1.8.0_release
Loading...
Searching...
No Matches
DataType.h
1#pragma once
2
3#include <iolink/IOLinkAPI.h>
4#include <iolink/Vector.h>
5
6#include <iostream>
7
8namespace iolink
9{
10
19enum 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
40enum class DataTypeInterpretation : uint32_t
41{
43 RAW = 0,
44
51 COMPLEX,
52
66
80};
81
85enum 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
161class IOLINK_API DataType
162{
163
164public:
171
184
190 DataType() noexcept;
191
195 explicit DataType(uint64_t value) noexcept;
196
200 DataType(DataTypeId value) noexcept;
201
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
293private:
294 uint8_t m_bitDepth;
295 uint8_t m_dimension;
296 PrimitiveTypeId m_primitiveType;
297 DataTypeInterpretation m_interpretation;
298};
299
300inline std::ostream&
301operator<<(std::ostream& os, const DataType datatype)
302{
303 os << datatype.toString().c_str();
304 return os;
305}
306
307} // end namespace iolink