Commit | Line | Data |
---|---|---|
a1e31878 PP |
1 | /* |
2 | * Copyright (c) 2020 Philippe Proulx <pproulx@efficios.com> | |
3 | * | |
4 | * SPDX-License-Identifier: MIT | |
5 | */ | |
6 | ||
7 | #ifndef BABELTRACE_CPP_COMMON_BT2_FIELD_HPP | |
8 | #define BABELTRACE_CPP_COMMON_BT2_FIELD_HPP | |
9 | ||
a1e31878 | 10 | #include <cstdint> |
c802cacb SM |
11 | #include <type_traits> |
12 | ||
a1e31878 PP |
13 | #include <babeltrace2/babeltrace.h> |
14 | ||
15 | #include "common/assert.h" | |
e7f0f07b | 16 | #include "cpp-common/bt2c/c-string-view.hpp" |
a613491d | 17 | #include "cpp-common/bt2s/span.hpp" |
c802cacb | 18 | |
0d218157 | 19 | #include "borrowed-object.hpp" |
a1e31878 | 20 | #include "field-class.hpp" |
c802cacb | 21 | #include "internal/utils.hpp" |
ca61ecbc | 22 | #include "optional-borrowed-object.hpp" |
7f7fbdb3 | 23 | #include "raw-value-proxy.hpp" |
a1e31878 PP |
24 | |
25 | namespace bt2 { | |
26 | ||
27 | template <typename LibObjT> | |
28 | class CommonBoolField; | |
29 | ||
30 | template <typename LibObjT> | |
31 | class CommonBitArrayField; | |
32 | ||
33 | template <typename LibObjT> | |
34 | class CommonUnsignedIntegerField; | |
35 | ||
36 | template <typename LibObjT> | |
37 | class CommonSignedIntegerField; | |
38 | ||
39 | template <typename LibObjT> | |
40 | class CommonUnsignedEnumerationField; | |
41 | ||
42 | template <typename LibObjT> | |
43 | class CommonSignedEnumerationField; | |
44 | ||
45 | template <typename LibObjT> | |
46 | class CommonSinglePrecisionRealField; | |
47 | ||
48 | template <typename LibObjT> | |
49 | class CommonDoublePrecisionRealField; | |
50 | ||
51 | template <typename LibObjT> | |
52 | class CommonStringField; | |
53 | ||
a613491d PP |
54 | template <typename LibObjT> |
55 | class CommonBlobField; | |
56 | ||
57 | template <typename LibObjT> | |
58 | class CommonDynamicBlobField; | |
59 | ||
a1e31878 PP |
60 | template <typename LibObjT> |
61 | class CommonStructureField; | |
62 | ||
63 | template <typename LibObjT> | |
64 | class CommonArrayField; | |
65 | ||
66 | template <typename LibObjT> | |
67 | class CommonDynamicArrayField; | |
68 | ||
69 | template <typename LibObjT> | |
70 | class CommonOptionField; | |
71 | ||
72 | template <typename LibObjT> | |
73 | class CommonVariantField; | |
74 | ||
75 | namespace internal { | |
76 | ||
77 | template <typename LibObjT> | |
78 | struct CommonFieldSpec; | |
79 | ||
b5f55e9f | 80 | /* Functions specific to mutable fields */ |
a1e31878 PP |
81 | template <> |
82 | struct CommonFieldSpec<bt_field> final | |
83 | { | |
84 | static bt_field_class *cls(bt_field * const libObjPtr) noexcept | |
85 | { | |
86 | return bt_field_borrow_class(libObjPtr); | |
87 | } | |
88 | }; | |
89 | ||
b5f55e9f | 90 | /* Functions specific to constant fields */ |
a1e31878 PP |
91 | template <> |
92 | struct CommonFieldSpec<const bt_field> final | |
93 | { | |
94 | static const bt_field_class *cls(const bt_field * const libObjPtr) noexcept | |
95 | { | |
96 | return bt_field_borrow_class_const(libObjPtr); | |
97 | } | |
98 | }; | |
99 | ||
b5f55e9f | 100 | } /* namespace internal */ |
a1e31878 PP |
101 | |
102 | template <typename LibObjT> | |
0d218157 | 103 | class CommonField : public BorrowedObject<LibObjT> |
a1e31878 PP |
104 | { |
105 | private: | |
0d218157 | 106 | using typename BorrowedObject<LibObjT>::_ThisBorrowedObject; |
a1e31878 PP |
107 | |
108 | protected: | |
a1e31878 PP |
109 | using _ThisCommonField = CommonField<LibObjT>; |
110 | ||
111 | public: | |
d246c457 | 112 | using typename BorrowedObject<LibObjT>::LibObjPtr; |
8047a175 | 113 | using Class = internal::DepFc<LibObjT>; |
a1e31878 | 114 | |
d246c457 | 115 | explicit CommonField(const LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr} |
a1e31878 PP |
116 | { |
117 | } | |
118 | ||
119 | template <typename OtherLibObjT> | |
0d218157 | 120 | CommonField(const CommonField<OtherLibObjT> val) noexcept : _ThisBorrowedObject {val} |
a1e31878 PP |
121 | { |
122 | } | |
123 | ||
124 | template <typename OtherLibObjT> | |
ac30a470 | 125 | _ThisCommonField operator=(const CommonField<OtherLibObjT> val) noexcept |
a1e31878 | 126 | { |
0d218157 | 127 | _ThisBorrowedObject::operator=(val); |
a1e31878 PP |
128 | return *this; |
129 | } | |
130 | ||
328a274a PP |
131 | CommonField<const bt_field> asConst() const noexcept |
132 | { | |
133 | return CommonField<const bt_field> {*this}; | |
134 | } | |
135 | ||
a1e31878 PP |
136 | FieldClassType classType() const noexcept |
137 | { | |
341a67c4 | 138 | return static_cast<FieldClassType>(bt_field_get_class_type(this->libObjPtr())); |
a1e31878 PP |
139 | } |
140 | ||
dcb8ae9b | 141 | Class cls() const noexcept |
a1e31878 | 142 | { |
341a67c4 | 143 | return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())}; |
a1e31878 PP |
144 | } |
145 | ||
146 | bool isBool() const noexcept | |
147 | { | |
148 | return this->cls().isBool(); | |
149 | } | |
150 | ||
151 | bool isBitArray() const noexcept | |
152 | { | |
153 | return this->cls().isBitArray(); | |
154 | } | |
155 | ||
156 | bool isUnsignedInteger() const noexcept | |
157 | { | |
158 | return this->cls().isUnsignedInteger(); | |
159 | } | |
160 | ||
161 | bool isSignedInteger() const noexcept | |
162 | { | |
163 | return this->cls().isSignedInteger(); | |
164 | } | |
165 | ||
166 | bool isUnsignedEnumeration() const noexcept | |
167 | { | |
168 | return this->cls().isUnsignedEnumeration(); | |
169 | } | |
170 | ||
171 | bool isSignedEnumeration() const noexcept | |
172 | { | |
173 | return this->cls().isSignedEnumeration(); | |
174 | } | |
175 | ||
176 | bool isSinglePrecisionReal() const noexcept | |
177 | { | |
178 | return this->cls().isSinglePrecisionReal(); | |
179 | } | |
180 | ||
181 | bool isDoublePrecisionReal() const noexcept | |
182 | { | |
183 | return this->cls().isDoublePrecisionReal(); | |
184 | } | |
185 | ||
186 | bool isString() const noexcept | |
187 | { | |
188 | return this->cls().isString(); | |
189 | } | |
190 | ||
a613491d PP |
191 | bool isBlob() const noexcept |
192 | { | |
193 | return this->cls().isBlob(); | |
194 | } | |
195 | ||
196 | bool isDynamicBlob() const noexcept | |
197 | { | |
198 | return this->cls().isDynamicBlob(); | |
199 | } | |
200 | ||
a1e31878 PP |
201 | bool isStructure() const noexcept |
202 | { | |
203 | return this->cls().isStructure(); | |
204 | } | |
205 | ||
206 | bool isArray() const noexcept | |
207 | { | |
208 | return this->cls().isArray(); | |
209 | } | |
210 | ||
211 | bool isDynamicArray() const noexcept | |
212 | { | |
213 | return this->cls().isDynamicArray(); | |
214 | } | |
215 | ||
216 | bool isOption() const noexcept | |
217 | { | |
218 | return this->cls().isOption(); | |
219 | } | |
220 | ||
221 | bool isVariant() const noexcept | |
222 | { | |
223 | return this->cls().isVariant(); | |
224 | } | |
225 | ||
45e0ded5 PP |
226 | template <typename FieldT> |
227 | FieldT as() const noexcept | |
228 | { | |
229 | return FieldT {this->libObjPtr()}; | |
230 | } | |
231 | ||
a1e31878 PP |
232 | CommonBoolField<LibObjT> asBool() const noexcept; |
233 | CommonBitArrayField<LibObjT> asBitArray() const noexcept; | |
234 | CommonUnsignedIntegerField<LibObjT> asUnsignedInteger() const noexcept; | |
235 | CommonSignedIntegerField<LibObjT> asSignedInteger() const noexcept; | |
236 | CommonUnsignedEnumerationField<LibObjT> asUnsignedEnumeration() const noexcept; | |
237 | CommonSignedEnumerationField<LibObjT> asSignedEnumeration() const noexcept; | |
238 | CommonSinglePrecisionRealField<LibObjT> asSinglePrecisionReal() const noexcept; | |
239 | CommonDoublePrecisionRealField<LibObjT> asDoublePrecisionReal() const noexcept; | |
240 | CommonStringField<LibObjT> asString() const noexcept; | |
a613491d PP |
241 | CommonBlobField<LibObjT> asBlob() const noexcept; |
242 | CommonDynamicBlobField<LibObjT> asDynamicBlob() const noexcept; | |
a1e31878 PP |
243 | CommonStructureField<LibObjT> asStructure() const noexcept; |
244 | CommonArrayField<LibObjT> asArray() const noexcept; | |
245 | CommonDynamicArrayField<LibObjT> asDynamicArray() const noexcept; | |
246 | CommonOptionField<LibObjT> asOption() const noexcept; | |
247 | CommonVariantField<LibObjT> asVariant() const noexcept; | |
248 | }; | |
249 | ||
250 | using Field = CommonField<bt_field>; | |
251 | using ConstField = CommonField<const bt_field>; | |
252 | ||
4927bae7 PP |
253 | namespace internal { |
254 | ||
255 | struct FieldTypeDescr | |
256 | { | |
257 | using Const = ConstField; | |
258 | using NonConst = Field; | |
259 | }; | |
260 | ||
261 | template <> | |
262 | struct TypeDescr<Field> : public FieldTypeDescr | |
263 | { | |
264 | }; | |
265 | ||
266 | template <> | |
267 | struct TypeDescr<ConstField> : public FieldTypeDescr | |
268 | { | |
269 | }; | |
270 | ||
271 | } /* namespace internal */ | |
272 | ||
a1e31878 PP |
273 | template <typename LibObjT> |
274 | class CommonBoolField final : public CommonField<LibObjT> | |
275 | { | |
276 | private: | |
a1e31878 PP |
277 | using typename CommonField<LibObjT>::_ThisCommonField; |
278 | ||
279 | public: | |
d246c457 | 280 | using typename CommonField<LibObjT>::LibObjPtr; |
a1e31878 PP |
281 | using Value = bool; |
282 | ||
d246c457 | 283 | explicit CommonBoolField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr} |
a1e31878 PP |
284 | { |
285 | BT_ASSERT_DBG(this->isBool()); | |
286 | } | |
287 | ||
288 | template <typename OtherLibObjT> | |
100fa861 | 289 | CommonBoolField(const CommonBoolField<OtherLibObjT> val) noexcept : _ThisCommonField {val} |
a1e31878 PP |
290 | { |
291 | } | |
292 | ||
293 | template <typename OtherLibObjT> | |
ac30a470 | 294 | CommonBoolField<LibObjT> operator=(const CommonBoolField<OtherLibObjT> val) noexcept |
a1e31878 PP |
295 | { |
296 | _ThisCommonField::operator=(val); | |
297 | return *this; | |
298 | } | |
299 | ||
328a274a PP |
300 | CommonBoolField<const bt_field> asConst() const noexcept |
301 | { | |
302 | return CommonBoolField<const bt_field> {*this}; | |
303 | } | |
304 | ||
7f7fbdb3 PP |
305 | RawValueProxy<CommonBoolField> operator*() const noexcept |
306 | { | |
307 | return RawValueProxy<CommonBoolField> {*this}; | |
308 | } | |
309 | ||
2a24eba8 | 310 | CommonBoolField value(const Value val) const noexcept |
a1e31878 | 311 | { |
5c895f64 | 312 | static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstBoolField`."); |
a1e31878 | 313 | |
341a67c4 | 314 | bt_field_bool_set_value(this->libObjPtr(), static_cast<bt_bool>(val)); |
2a24eba8 | 315 | return *this; |
a1e31878 PP |
316 | } |
317 | ||
318 | Value value() const noexcept | |
319 | { | |
341a67c4 | 320 | return static_cast<Value>(bt_field_bool_get_value(this->libObjPtr())); |
a1e31878 | 321 | } |
a1e31878 PP |
322 | }; |
323 | ||
324 | using BoolField = CommonBoolField<bt_field>; | |
325 | using ConstBoolField = CommonBoolField<const bt_field>; | |
326 | ||
4927bae7 PP |
327 | namespace internal { |
328 | ||
329 | struct BoolFieldTypeDescr | |
330 | { | |
331 | using Const = ConstBoolField; | |
332 | using NonConst = BoolField; | |
333 | }; | |
334 | ||
335 | template <> | |
336 | struct TypeDescr<BoolField> : public BoolFieldTypeDescr | |
337 | { | |
338 | }; | |
339 | ||
340 | template <> | |
341 | struct TypeDescr<ConstBoolField> : public BoolFieldTypeDescr | |
342 | { | |
343 | }; | |
344 | ||
345 | } /* namespace internal */ | |
346 | ||
9d7e0f16 PP |
347 | template <typename LibLabelArrayT> |
348 | class Labels | |
349 | { | |
350 | public: | |
351 | explicit Labels(const LibLabelArrayT labels, const std::uint64_t size) : | |
352 | _mLabels {labels}, _mLen {size} | |
353 | { | |
354 | } | |
355 | ||
356 | std::uint64_t length() const noexcept | |
357 | { | |
358 | return _mLen; | |
359 | } | |
360 | ||
361 | bt2c::CStringView operator[](const std::uint64_t index) const noexcept | |
362 | { | |
363 | return _mLabels[index]; | |
364 | } | |
365 | ||
366 | private: | |
367 | LibLabelArrayT _mLabels; | |
368 | std::uint64_t _mLen; | |
369 | }; | |
370 | ||
a1e31878 PP |
371 | template <typename LibObjT> |
372 | class CommonBitArrayField final : public CommonField<LibObjT> | |
373 | { | |
374 | private: | |
a1e31878 PP |
375 | using typename CommonField<LibObjT>::_ThisCommonField; |
376 | ||
377 | public: | |
d246c457 | 378 | using typename CommonField<LibObjT>::LibObjPtr; |
8047a175 | 379 | using Class = internal::DepType<LibObjT, BitArrayFieldClass, ConstBitArrayFieldClass>; |
a1e31878 | 380 | |
d246c457 | 381 | explicit CommonBitArrayField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr} |
a1e31878 PP |
382 | { |
383 | BT_ASSERT_DBG(this->isBitArray()); | |
384 | } | |
385 | ||
386 | template <typename OtherLibObjT> | |
100fa861 | 387 | CommonBitArrayField(const CommonBitArrayField<OtherLibObjT> val) noexcept : |
a1e31878 PP |
388 | _ThisCommonField {val} |
389 | { | |
390 | } | |
391 | ||
392 | template <typename OtherLibObjT> | |
ac30a470 | 393 | CommonBitArrayField<LibObjT> operator=(const CommonBitArrayField<OtherLibObjT> val) noexcept |
a1e31878 PP |
394 | { |
395 | _ThisCommonField::operator=(val); | |
396 | return *this; | |
397 | } | |
398 | ||
328a274a PP |
399 | CommonBitArrayField<const bt_field> asConst() const noexcept |
400 | { | |
401 | return CommonBitArrayField<const bt_field> {*this}; | |
402 | } | |
403 | ||
9d7e0f16 | 404 | Class cls() const noexcept |
a1e31878 | 405 | { |
341a67c4 | 406 | return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())}; |
a1e31878 PP |
407 | } |
408 | ||
2a24eba8 | 409 | CommonBitArrayField valueAsInteger(const std::uint64_t bits) const noexcept |
a1e31878 | 410 | { |
5c895f64 PP |
411 | static_assert(!std::is_const<LibObjT>::value, |
412 | "Not available with `bt2::ConstBitArrayField`."); | |
a1e31878 | 413 | |
341a67c4 | 414 | bt_field_bit_array_set_value_as_integer(this->libObjPtr(), bits); |
2a24eba8 | 415 | return *this; |
a1e31878 PP |
416 | } |
417 | ||
418 | std::uint64_t valueAsInteger() const noexcept | |
419 | { | |
341a67c4 | 420 | return bt_field_bit_array_get_value_as_integer(this->libObjPtr()); |
a1e31878 PP |
421 | } |
422 | ||
423 | bool bitValue(const std::uint64_t index) const noexcept | |
424 | { | |
425 | BT_ASSERT_DBG(index < this->cls().length()); | |
426 | return static_cast<bool>(this->valueAsInteger() & (1ULL << index)); | |
427 | } | |
9d7e0f16 PP |
428 | |
429 | Labels<bt_field_class_bit_array_flag_label_array> activeFlagLabels() const | |
430 | { | |
431 | bt_field_class_bit_array_flag_label_array labelArray; | |
432 | std::uint64_t count; | |
433 | ||
434 | if (bt_field_bit_array_get_active_flag_labels(this->libObjPtr(), &labelArray, &count) == | |
435 | BT_FIELD_BIT_ARRAY_GET_ACTIVE_FLAG_LABELS_STATUS_MEMORY_ERROR) { | |
436 | throw MemoryError {}; | |
437 | } | |
438 | ||
439 | return Labels<bt_field_class_bit_array_flag_label_array> {labelArray, count}; | |
440 | } | |
a1e31878 PP |
441 | }; |
442 | ||
443 | using BitArrayField = CommonBitArrayField<bt_field>; | |
444 | using ConstBitArrayField = CommonBitArrayField<const bt_field>; | |
445 | ||
4927bae7 PP |
446 | namespace internal { |
447 | ||
448 | struct BitArrayFieldTypeDescr | |
449 | { | |
450 | using Const = ConstBitArrayField; | |
451 | using NonConst = BitArrayField; | |
452 | }; | |
453 | ||
454 | template <> | |
455 | struct TypeDescr<BitArrayField> : public BitArrayFieldTypeDescr | |
456 | { | |
457 | }; | |
458 | ||
459 | template <> | |
460 | struct TypeDescr<ConstBitArrayField> : public BitArrayFieldTypeDescr | |
461 | { | |
462 | }; | |
463 | ||
464 | } /* namespace internal */ | |
465 | ||
a1e31878 | 466 | template <typename LibObjT> |
edfe13aa | 467 | class CommonUnsignedIntegerField : public CommonField<LibObjT> |
a1e31878 PP |
468 | { |
469 | private: | |
470 | using typename CommonField<LibObjT>::_ThisCommonField; | |
471 | ||
472 | protected: | |
a1e31878 PP |
473 | using _ThisCommonUnsignedIntegerField = CommonUnsignedIntegerField<LibObjT>; |
474 | ||
475 | public: | |
d246c457 | 476 | using typename CommonField<LibObjT>::LibObjPtr; |
a1e31878 | 477 | using Value = std::uint64_t; |
8047a175 | 478 | using Class = internal::DepType<LibObjT, IntegerFieldClass, ConstIntegerFieldClass>; |
a1e31878 | 479 | |
d246c457 | 480 | explicit CommonUnsignedIntegerField(const LibObjPtr libObjPtr) noexcept : |
a1e31878 PP |
481 | _ThisCommonField {libObjPtr} |
482 | { | |
483 | BT_ASSERT_DBG(this->isUnsignedInteger()); | |
484 | } | |
485 | ||
486 | template <typename OtherLibObjT> | |
100fa861 | 487 | CommonUnsignedIntegerField(const CommonUnsignedIntegerField<OtherLibObjT> val) noexcept : |
a1e31878 PP |
488 | _ThisCommonField {val} |
489 | { | |
490 | } | |
491 | ||
492 | template <typename OtherLibObjT> | |
ac30a470 | 493 | _ThisCommonUnsignedIntegerField |
100fa861 | 494 | operator=(const CommonUnsignedIntegerField<OtherLibObjT> val) noexcept |
a1e31878 PP |
495 | { |
496 | _ThisCommonField::operator=(val); | |
497 | return *this; | |
498 | } | |
499 | ||
328a274a PP |
500 | CommonUnsignedIntegerField<const bt_field> asConst() const noexcept |
501 | { | |
502 | return CommonUnsignedIntegerField<const bt_field> {*this}; | |
503 | } | |
504 | ||
dcb8ae9b | 505 | Class cls() const noexcept |
a1e31878 | 506 | { |
341a67c4 | 507 | return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())}; |
a1e31878 PP |
508 | } |
509 | ||
7f7fbdb3 PP |
510 | RawValueProxy<CommonUnsignedIntegerField> operator*() const noexcept |
511 | { | |
512 | return RawValueProxy<CommonUnsignedIntegerField> {*this}; | |
513 | } | |
514 | ||
2a24eba8 | 515 | CommonUnsignedIntegerField value(const Value val) const noexcept |
a1e31878 | 516 | { |
5c895f64 PP |
517 | static_assert(!std::is_const<LibObjT>::value, |
518 | "Not available with `bt2::ConstUnsignedIntegerField`."); | |
a1e31878 | 519 | |
341a67c4 | 520 | bt_field_integer_unsigned_set_value(this->libObjPtr(), val); |
2a24eba8 | 521 | return *this; |
a1e31878 PP |
522 | } |
523 | ||
524 | Value value() const noexcept | |
525 | { | |
341a67c4 | 526 | return bt_field_integer_unsigned_get_value(this->libObjPtr()); |
a1e31878 | 527 | } |
a1e31878 PP |
528 | }; |
529 | ||
530 | using UnsignedIntegerField = CommonUnsignedIntegerField<bt_field>; | |
531 | using ConstUnsignedIntegerField = CommonUnsignedIntegerField<const bt_field>; | |
532 | ||
4927bae7 PP |
533 | namespace internal { |
534 | ||
535 | struct UnsignedIntegerFieldTypeDescr | |
536 | { | |
537 | using Const = ConstUnsignedIntegerField; | |
538 | using NonConst = UnsignedIntegerField; | |
539 | }; | |
540 | ||
541 | template <> | |
542 | struct TypeDescr<UnsignedIntegerField> : public UnsignedIntegerFieldTypeDescr | |
543 | { | |
544 | }; | |
545 | ||
546 | template <> | |
547 | struct TypeDescr<ConstUnsignedIntegerField> : public UnsignedIntegerFieldTypeDescr | |
548 | { | |
549 | }; | |
550 | ||
551 | } /* namespace internal */ | |
552 | ||
a1e31878 | 553 | template <typename LibObjT> |
edfe13aa | 554 | class CommonSignedIntegerField : public CommonField<LibObjT> |
a1e31878 PP |
555 | { |
556 | private: | |
557 | using typename CommonField<LibObjT>::_ThisCommonField; | |
558 | ||
559 | protected: | |
a1e31878 PP |
560 | using _ThisCommonSignedIntegerField = CommonSignedIntegerField<LibObjT>; |
561 | ||
562 | public: | |
d246c457 | 563 | using typename CommonField<LibObjT>::LibObjPtr; |
edfe13aa | 564 | using Value = std::int64_t; |
8047a175 | 565 | using Class = internal::DepType<LibObjT, IntegerFieldClass, ConstIntegerFieldClass>; |
a1e31878 | 566 | |
d246c457 | 567 | explicit CommonSignedIntegerField(const LibObjPtr libObjPtr) noexcept : |
a1e31878 PP |
568 | _ThisCommonField {libObjPtr} |
569 | { | |
570 | BT_ASSERT_DBG(this->isSignedInteger()); | |
571 | } | |
572 | ||
573 | template <typename OtherLibObjT> | |
100fa861 | 574 | CommonSignedIntegerField(const CommonSignedIntegerField<OtherLibObjT> val) noexcept : |
a1e31878 PP |
575 | _ThisCommonField {val} |
576 | { | |
577 | } | |
578 | ||
579 | template <typename OtherLibObjT> | |
ac30a470 | 580 | _ThisCommonSignedIntegerField |
100fa861 | 581 | operator=(const CommonSignedIntegerField<OtherLibObjT> val) noexcept |
a1e31878 PP |
582 | { |
583 | _ThisCommonField::operator=(val); | |
584 | return *this; | |
585 | } | |
586 | ||
328a274a PP |
587 | CommonSignedIntegerField<const bt_field> asConst() const noexcept |
588 | { | |
589 | return CommonSignedIntegerField<const bt_field> {*this}; | |
590 | } | |
591 | ||
dcb8ae9b | 592 | Class cls() const noexcept |
a1e31878 | 593 | { |
341a67c4 | 594 | return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())}; |
a1e31878 PP |
595 | } |
596 | ||
7f7fbdb3 PP |
597 | RawValueProxy<CommonSignedIntegerField> operator*() const noexcept |
598 | { | |
599 | return RawValueProxy<CommonSignedIntegerField> {*this}; | |
600 | } | |
601 | ||
2a24eba8 | 602 | CommonSignedIntegerField value(const Value val) const noexcept |
a1e31878 | 603 | { |
5c895f64 PP |
604 | static_assert(!std::is_const<LibObjT>::value, |
605 | "Not available with `bt2::ConstSignedIntegerField`."); | |
a1e31878 | 606 | |
341a67c4 | 607 | bt_field_integer_signed_set_value(this->libObjPtr(), val); |
2a24eba8 | 608 | return *this; |
a1e31878 PP |
609 | } |
610 | ||
611 | Value value() const noexcept | |
612 | { | |
341a67c4 | 613 | return bt_field_integer_signed_get_value(this->libObjPtr()); |
a1e31878 | 614 | } |
a1e31878 PP |
615 | }; |
616 | ||
617 | using SignedIntegerField = CommonSignedIntegerField<bt_field>; | |
618 | using ConstSignedIntegerField = CommonSignedIntegerField<const bt_field>; | |
619 | ||
4927bae7 PP |
620 | namespace internal { |
621 | ||
622 | struct SignedIntegerFieldTypeDescr | |
623 | { | |
624 | using Const = ConstSignedIntegerField; | |
625 | using NonConst = SignedIntegerField; | |
626 | }; | |
627 | ||
628 | template <> | |
629 | struct TypeDescr<SignedIntegerField> : public SignedIntegerFieldTypeDescr | |
630 | { | |
631 | }; | |
632 | ||
633 | template <> | |
634 | struct TypeDescr<ConstSignedIntegerField> : public SignedIntegerFieldTypeDescr | |
635 | { | |
636 | }; | |
637 | ||
638 | } /* namespace internal */ | |
639 | ||
a1e31878 PP |
640 | template <typename LibObjT> |
641 | class CommonUnsignedEnumerationField final : public CommonUnsignedIntegerField<LibObjT> | |
642 | { | |
643 | private: | |
644 | using typename CommonUnsignedIntegerField<LibObjT>::_ThisCommonUnsignedIntegerField; | |
a1e31878 PP |
645 | |
646 | public: | |
d246c457 PP |
647 | using typename CommonField<LibObjT>::LibObjPtr; |
648 | ||
8047a175 PP |
649 | using Class = internal::DepType<LibObjT, UnsignedEnumerationFieldClass, |
650 | ConstUnsignedEnumerationFieldClass>; | |
a1e31878 | 651 | |
d246c457 | 652 | explicit CommonUnsignedEnumerationField(const LibObjPtr libObjPtr) noexcept : |
a1e31878 PP |
653 | _ThisCommonUnsignedIntegerField {libObjPtr} |
654 | { | |
655 | BT_ASSERT_DBG(this->isUnsignedEnumeration()); | |
656 | } | |
657 | ||
658 | template <typename OtherLibObjT> | |
100fa861 | 659 | CommonUnsignedEnumerationField(const CommonUnsignedEnumerationField<OtherLibObjT> val) noexcept |
a1e31878 PP |
660 | : |
661 | _ThisCommonUnsignedIntegerField {val} | |
662 | { | |
663 | } | |
664 | ||
665 | template <typename OtherLibObjT> | |
ac30a470 | 666 | CommonUnsignedEnumerationField<LibObjT> |
100fa861 | 667 | operator=(const CommonUnsignedEnumerationField<OtherLibObjT> val) noexcept |
a1e31878 PP |
668 | { |
669 | _ThisCommonUnsignedIntegerField::operator=(val); | |
670 | return *this; | |
671 | } | |
672 | ||
328a274a PP |
673 | CommonUnsignedEnumerationField<const bt_field> asConst() const noexcept |
674 | { | |
675 | return CommonUnsignedEnumerationField<const bt_field> {*this}; | |
676 | } | |
677 | ||
dcb8ae9b | 678 | Class cls() const noexcept |
a1e31878 | 679 | { |
341a67c4 | 680 | return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())}; |
a1e31878 PP |
681 | } |
682 | ||
9d7e0f16 | 683 | Labels<bt_field_class_enumeration_mapping_label_array> labels() const |
a1e31878 PP |
684 | { |
685 | bt_field_class_enumeration_mapping_label_array labelArray; | |
686 | std::uint64_t count; | |
341a67c4 | 687 | const auto status = bt_field_enumeration_unsigned_get_mapping_labels(this->libObjPtr(), |
a1e31878 PP |
688 | &labelArray, &count); |
689 | ||
690 | if (status == BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_MEMORY_ERROR) { | |
39278ebc | 691 | throw MemoryError {}; |
a1e31878 PP |
692 | } |
693 | ||
9d7e0f16 | 694 | return Labels<bt_field_class_enumeration_mapping_label_array> {labelArray, count}; |
a1e31878 PP |
695 | } |
696 | }; | |
697 | ||
698 | using UnsignedEnumerationField = CommonUnsignedEnumerationField<bt_field>; | |
699 | using ConstUnsignedEnumerationField = CommonUnsignedEnumerationField<const bt_field>; | |
700 | ||
4927bae7 PP |
701 | namespace internal { |
702 | ||
703 | struct UnsignedEnumerationFieldTypeDescr | |
704 | { | |
705 | using Const = ConstUnsignedEnumerationField; | |
706 | using NonConst = UnsignedEnumerationField; | |
707 | }; | |
708 | ||
709 | template <> | |
710 | struct TypeDescr<UnsignedEnumerationField> : public UnsignedEnumerationFieldTypeDescr | |
711 | { | |
712 | }; | |
713 | ||
714 | template <> | |
715 | struct TypeDescr<ConstUnsignedEnumerationField> : public UnsignedEnumerationFieldTypeDescr | |
716 | { | |
717 | }; | |
718 | ||
719 | } /* namespace internal */ | |
720 | ||
a1e31878 PP |
721 | template <typename LibObjT> |
722 | class CommonSignedEnumerationField final : public CommonSignedIntegerField<LibObjT> | |
723 | { | |
724 | private: | |
725 | using typename CommonSignedIntegerField<LibObjT>::_ThisCommonSignedIntegerField; | |
a1e31878 PP |
726 | |
727 | public: | |
d246c457 PP |
728 | using typename CommonField<LibObjT>::LibObjPtr; |
729 | ||
a1e31878 | 730 | using Class = |
8047a175 | 731 | internal::DepType<LibObjT, SignedEnumerationFieldClass, ConstSignedEnumerationFieldClass>; |
a1e31878 | 732 | |
d246c457 | 733 | explicit CommonSignedEnumerationField(const LibObjPtr libObjPtr) noexcept : |
a1e31878 PP |
734 | _ThisCommonSignedIntegerField {libObjPtr} |
735 | { | |
736 | BT_ASSERT_DBG(this->isSignedEnumeration()); | |
737 | } | |
738 | ||
739 | template <typename OtherLibObjT> | |
100fa861 | 740 | CommonSignedEnumerationField(const CommonSignedEnumerationField<OtherLibObjT> val) noexcept : |
a1e31878 PP |
741 | _ThisCommonSignedIntegerField {val} |
742 | { | |
743 | } | |
744 | ||
745 | template <typename OtherLibObjT> | |
ac30a470 | 746 | CommonSignedEnumerationField<LibObjT> |
100fa861 | 747 | operator=(const CommonSignedEnumerationField<OtherLibObjT> val) noexcept |
a1e31878 PP |
748 | { |
749 | _ThisCommonSignedIntegerField::operator=(val); | |
750 | return *this; | |
751 | } | |
752 | ||
328a274a PP |
753 | CommonSignedEnumerationField<const bt_field> asConst() const noexcept |
754 | { | |
755 | return CommonSignedEnumerationField<const bt_field> {*this}; | |
756 | } | |
757 | ||
dcb8ae9b | 758 | Class cls() const noexcept |
a1e31878 | 759 | { |
341a67c4 | 760 | return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())}; |
a1e31878 PP |
761 | } |
762 | ||
9d7e0f16 | 763 | Labels<bt_field_class_enumeration_mapping_label_array> mappingLabels() const |
a1e31878 PP |
764 | { |
765 | bt_field_class_enumeration_mapping_label_array labelArray; | |
766 | std::uint64_t count; | |
767 | const auto status = | |
341a67c4 | 768 | bt_field_enumeration_signed_get_mapping_labels(this->libObjPtr(), &labelArray, &count); |
a1e31878 PP |
769 | |
770 | if (status == BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_MEMORY_ERROR) { | |
39278ebc | 771 | throw MemoryError {}; |
a1e31878 PP |
772 | } |
773 | ||
9d7e0f16 | 774 | return Labels<bt_field_class_enumeration_mapping_label_array> {labelArray, count}; |
a1e31878 PP |
775 | } |
776 | }; | |
777 | ||
778 | using SignedEnumerationField = CommonSignedEnumerationField<bt_field>; | |
779 | using ConstSignedEnumerationField = CommonSignedEnumerationField<const bt_field>; | |
780 | ||
4927bae7 PP |
781 | namespace internal { |
782 | ||
783 | struct SignedEnumerationFieldTypeDescr | |
784 | { | |
785 | using Const = ConstSignedEnumerationField; | |
786 | using NonConst = SignedEnumerationField; | |
787 | }; | |
788 | ||
789 | template <> | |
790 | struct TypeDescr<SignedEnumerationField> : public SignedEnumerationFieldTypeDescr | |
791 | { | |
792 | }; | |
793 | ||
794 | template <> | |
795 | struct TypeDescr<ConstSignedEnumerationField> : public SignedEnumerationFieldTypeDescr | |
796 | { | |
797 | }; | |
798 | ||
799 | } /* namespace internal */ | |
800 | ||
a1e31878 PP |
801 | template <typename LibObjT> |
802 | class CommonSinglePrecisionRealField final : public CommonField<LibObjT> | |
803 | { | |
804 | private: | |
a1e31878 PP |
805 | using typename CommonField<LibObjT>::_ThisCommonField; |
806 | ||
807 | public: | |
d246c457 | 808 | using typename CommonField<LibObjT>::LibObjPtr; |
a1e31878 PP |
809 | using Value = float; |
810 | ||
d246c457 | 811 | explicit CommonSinglePrecisionRealField(const LibObjPtr libObjPtr) noexcept : |
a1e31878 PP |
812 | _ThisCommonField {libObjPtr} |
813 | { | |
814 | BT_ASSERT_DBG(this->isSinglePrecisionReal()); | |
815 | } | |
816 | ||
817 | template <typename OtherLibObjT> | |
100fa861 | 818 | CommonSinglePrecisionRealField(const CommonSinglePrecisionRealField<OtherLibObjT> val) noexcept |
a1e31878 PP |
819 | : |
820 | _ThisCommonField {val} | |
821 | { | |
822 | } | |
823 | ||
824 | template <typename OtherLibObjT> | |
ac30a470 | 825 | CommonSinglePrecisionRealField<LibObjT> |
100fa861 | 826 | operator=(const CommonSinglePrecisionRealField<OtherLibObjT> val) noexcept |
a1e31878 PP |
827 | { |
828 | _ThisCommonField::operator=(val); | |
829 | return *this; | |
830 | } | |
831 | ||
328a274a PP |
832 | CommonSinglePrecisionRealField<const bt_field> asConst() const noexcept |
833 | { | |
834 | return CommonSinglePrecisionRealField<const bt_field> {*this}; | |
835 | } | |
836 | ||
7f7fbdb3 PP |
837 | RawValueProxy<CommonSinglePrecisionRealField> operator*() const noexcept |
838 | { | |
839 | return RawValueProxy<CommonSinglePrecisionRealField> {*this}; | |
840 | } | |
841 | ||
2a24eba8 | 842 | CommonSinglePrecisionRealField value(const Value val) const noexcept |
a1e31878 | 843 | { |
5c895f64 PP |
844 | static_assert(!std::is_const<LibObjT>::value, |
845 | "Not available with `bt2::ConstSinglePrecisionRealField`."); | |
a1e31878 | 846 | |
341a67c4 | 847 | bt_field_real_single_precision_set_value(this->libObjPtr(), val); |
2a24eba8 | 848 | return *this; |
a1e31878 PP |
849 | } |
850 | ||
851 | Value value() const noexcept | |
852 | { | |
341a67c4 | 853 | return bt_field_real_single_precision_get_value(this->libObjPtr()); |
a1e31878 | 854 | } |
a1e31878 PP |
855 | }; |
856 | ||
857 | using SinglePrecisionRealField = CommonSinglePrecisionRealField<bt_field>; | |
858 | using ConstSinglePrecisionRealField = CommonSinglePrecisionRealField<const bt_field>; | |
859 | ||
4927bae7 PP |
860 | namespace internal { |
861 | ||
862 | struct SinglePrecisionRealFieldTypeDescr | |
863 | { | |
864 | using Const = ConstSinglePrecisionRealField; | |
865 | using NonConst = SinglePrecisionRealField; | |
866 | }; | |
867 | ||
868 | template <> | |
869 | struct TypeDescr<SinglePrecisionRealField> : public SinglePrecisionRealFieldTypeDescr | |
870 | { | |
871 | }; | |
872 | ||
873 | template <> | |
874 | struct TypeDescr<ConstSinglePrecisionRealField> : public SinglePrecisionRealFieldTypeDescr | |
875 | { | |
876 | }; | |
877 | ||
878 | } /* namespace internal */ | |
879 | ||
a1e31878 PP |
880 | template <typename LibObjT> |
881 | class CommonDoublePrecisionRealField final : public CommonField<LibObjT> | |
882 | { | |
883 | private: | |
a1e31878 PP |
884 | using typename CommonField<LibObjT>::_ThisCommonField; |
885 | ||
886 | public: | |
d246c457 | 887 | using typename CommonField<LibObjT>::LibObjPtr; |
a1e31878 PP |
888 | using Value = double; |
889 | ||
d246c457 | 890 | explicit CommonDoublePrecisionRealField(const LibObjPtr libObjPtr) noexcept : |
a1e31878 PP |
891 | _ThisCommonField {libObjPtr} |
892 | { | |
893 | BT_ASSERT_DBG(this->isDoublePrecisionReal()); | |
894 | } | |
895 | ||
896 | template <typename OtherLibObjT> | |
100fa861 | 897 | CommonDoublePrecisionRealField(const CommonDoublePrecisionRealField<OtherLibObjT> val) noexcept |
a1e31878 PP |
898 | : |
899 | _ThisCommonField {val} | |
900 | { | |
901 | } | |
902 | ||
903 | template <typename OtherLibObjT> | |
ac30a470 | 904 | CommonDoublePrecisionRealField<LibObjT> |
100fa861 | 905 | operator=(const CommonDoublePrecisionRealField<OtherLibObjT> val) noexcept |
a1e31878 PP |
906 | { |
907 | _ThisCommonField::operator=(val); | |
908 | return *this; | |
909 | } | |
910 | ||
328a274a PP |
911 | CommonDoublePrecisionRealField<const bt_field> asConst() const noexcept |
912 | { | |
913 | return CommonDoublePrecisionRealField<const bt_field> {*this}; | |
914 | } | |
915 | ||
7f7fbdb3 PP |
916 | RawValueProxy<CommonDoublePrecisionRealField> operator*() const noexcept |
917 | { | |
918 | return RawValueProxy<CommonDoublePrecisionRealField> {*this}; | |
919 | } | |
920 | ||
2a24eba8 | 921 | CommonDoublePrecisionRealField value(const Value val) const noexcept |
a1e31878 | 922 | { |
5c895f64 PP |
923 | static_assert(!std::is_const<LibObjT>::value, |
924 | "Not available with `bt2::ConstDoublePrecisionRealField`."); | |
a1e31878 | 925 | |
edfe13aa | 926 | bt_field_real_double_precision_set_value(this->libObjPtr(), val); |
2a24eba8 | 927 | return *this; |
a1e31878 PP |
928 | } |
929 | ||
930 | Value value() const noexcept | |
931 | { | |
edfe13aa | 932 | return bt_field_real_double_precision_get_value(this->libObjPtr()); |
a1e31878 | 933 | } |
a1e31878 PP |
934 | }; |
935 | ||
936 | using DoublePrecisionRealField = CommonDoublePrecisionRealField<bt_field>; | |
937 | using ConstDoublePrecisionRealField = CommonDoublePrecisionRealField<const bt_field>; | |
938 | ||
4927bae7 PP |
939 | namespace internal { |
940 | ||
941 | struct DoublePrecisionRealFieldTypeDescr | |
942 | { | |
943 | using Const = ConstDoublePrecisionRealField; | |
944 | using NonConst = DoublePrecisionRealField; | |
945 | }; | |
946 | ||
947 | template <> | |
948 | struct TypeDescr<DoublePrecisionRealField> : public DoublePrecisionRealFieldTypeDescr | |
949 | { | |
950 | }; | |
951 | ||
952 | template <> | |
953 | struct TypeDescr<ConstDoublePrecisionRealField> : public DoublePrecisionRealFieldTypeDescr | |
954 | { | |
955 | }; | |
956 | ||
957 | } /* namespace internal */ | |
958 | ||
a1e31878 PP |
959 | template <typename LibObjT> |
960 | class CommonStringField final : public CommonField<LibObjT> | |
961 | { | |
962 | private: | |
a1e31878 PP |
963 | using typename CommonField<LibObjT>::_ThisCommonField; |
964 | ||
965 | public: | |
d246c457 | 966 | using typename CommonField<LibObjT>::LibObjPtr; |
e7f0f07b | 967 | using Value = bt2c::CStringView; |
7f7fbdb3 | 968 | |
d246c457 | 969 | explicit CommonStringField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr} |
a1e31878 PP |
970 | { |
971 | BT_ASSERT_DBG(this->isString()); | |
972 | } | |
973 | ||
974 | template <typename OtherLibObjT> | |
100fa861 | 975 | CommonStringField(const CommonStringField<OtherLibObjT> val) noexcept : _ThisCommonField {val} |
a1e31878 PP |
976 | { |
977 | } | |
978 | ||
979 | template <typename OtherLibObjT> | |
ac30a470 | 980 | CommonStringField<LibObjT> operator=(const CommonStringField<OtherLibObjT> val) noexcept |
a1e31878 PP |
981 | { |
982 | _ThisCommonField::operator=(val); | |
983 | return *this; | |
984 | } | |
985 | ||
328a274a PP |
986 | CommonStringField<const bt_field> asConst() const noexcept |
987 | { | |
988 | return CommonStringField<const bt_field> {*this}; | |
989 | } | |
990 | ||
15030982 | 991 | RawValueProxy<CommonStringField> operator*() const noexcept |
7f7fbdb3 | 992 | { |
15030982 | 993 | return RawValueProxy<CommonStringField> {*this}; |
7f7fbdb3 PP |
994 | } |
995 | ||
2a24eba8 | 996 | CommonStringField value(const Value val) const |
a1e31878 | 997 | { |
5c895f64 PP |
998 | static_assert(!std::is_const<LibObjT>::value, |
999 | "Not available with `bt2::ConstStringField`."); | |
a1e31878 | 1000 | |
e7f0f07b | 1001 | const auto status = bt_field_string_set_value(this->libObjPtr(), *val); |
a1e31878 PP |
1002 | |
1003 | if (status == BT_FIELD_STRING_SET_VALUE_STATUS_MEMORY_ERROR) { | |
39278ebc | 1004 | throw MemoryError {}; |
a1e31878 | 1005 | } |
2a24eba8 SM |
1006 | |
1007 | return *this; | |
a1e31878 PP |
1008 | } |
1009 | ||
2a24eba8 | 1010 | CommonStringField append(const bt2c::CStringView begin, const std::uint64_t len) const |
8a79c777 | 1011 | { |
5c895f64 PP |
1012 | static_assert(!std::is_const<LibObjT>::value, |
1013 | "Not available with `bt2::ConstStringField`."); | |
8a79c777 FD |
1014 | |
1015 | const auto status = bt_field_string_append_with_length(this->libObjPtr(), begin, len); | |
1016 | ||
1017 | if (status == BT_FIELD_STRING_APPEND_STATUS_MEMORY_ERROR) { | |
1018 | throw MemoryError {}; | |
1019 | } | |
2a24eba8 SM |
1020 | |
1021 | return *this; | |
8a79c777 FD |
1022 | } |
1023 | ||
2a24eba8 | 1024 | CommonStringField append(const bt2c::CStringView val) const |
e7f0f07b | 1025 | { |
2a24eba8 | 1026 | return this->append(val, std::strlen(val)); |
e7f0f07b SM |
1027 | } |
1028 | ||
2a24eba8 | 1029 | CommonStringField append(const std::string& val) const |
8a79c777 | 1030 | { |
2a24eba8 | 1031 | return this->append(val.data(), val.size()); |
8a79c777 FD |
1032 | } |
1033 | ||
2a24eba8 | 1034 | CommonStringField clear() const noexcept |
a1e31878 | 1035 | { |
5c895f64 PP |
1036 | static_assert(!std::is_const<LibObjT>::value, |
1037 | "Not available with `bt2::ConstStringField`."); | |
a1e31878 | 1038 | |
341a67c4 | 1039 | bt_field_string_clear(this->libObjPtr()); |
2a24eba8 | 1040 | return *this; |
a1e31878 PP |
1041 | } |
1042 | ||
e7f0f07b | 1043 | Value value() const noexcept |
a1e31878 | 1044 | { |
341a67c4 | 1045 | return bt_field_string_get_value(this->libObjPtr()); |
a1e31878 | 1046 | } |
7b3d2ca6 SM |
1047 | |
1048 | std::uint64_t length() const noexcept | |
1049 | { | |
1050 | return bt_field_string_get_length(this->libObjPtr()); | |
1051 | } | |
a1e31878 PP |
1052 | }; |
1053 | ||
1054 | using StringField = CommonStringField<bt_field>; | |
1055 | using ConstStringField = CommonStringField<const bt_field>; | |
1056 | ||
1057 | namespace internal { | |
1058 | ||
4927bae7 PP |
1059 | struct StringFieldTypeDescr |
1060 | { | |
1061 | using Const = ConstStringField; | |
1062 | using NonConst = StringField; | |
1063 | }; | |
1064 | ||
1065 | template <> | |
1066 | struct TypeDescr<StringField> : public StringFieldTypeDescr | |
1067 | { | |
1068 | }; | |
1069 | ||
1070 | template <> | |
1071 | struct TypeDescr<ConstStringField> : public StringFieldTypeDescr | |
1072 | { | |
1073 | }; | |
1074 | ||
a613491d PP |
1075 | template <typename LibObjT> |
1076 | struct CommonBlobFieldSpec; | |
1077 | ||
1078 | template <> | |
1079 | struct CommonBlobFieldSpec<bt_field> final | |
1080 | { | |
1081 | using Data = std::uint8_t; | |
1082 | ||
1083 | static Data *data(bt_field * const libObjPtr) noexcept | |
1084 | { | |
1085 | return bt_field_blob_get_data(libObjPtr); | |
1086 | } | |
1087 | }; | |
1088 | ||
1089 | template <> | |
1090 | struct CommonBlobFieldSpec<const bt_field> final | |
1091 | { | |
1092 | using Data = const std::uint8_t; | |
1093 | ||
1094 | static Data *data(const bt_field * const libObjPtr) noexcept | |
1095 | { | |
1096 | return bt_field_blob_get_data_const(libObjPtr); | |
1097 | } | |
1098 | }; | |
1099 | ||
1100 | } /* namespace internal */ | |
1101 | ||
1102 | template <typename LibObjT> | |
1103 | class CommonBlobField : public CommonField<LibObjT> | |
1104 | { | |
1105 | private: | |
1106 | using typename CommonField<LibObjT>::_ThisCommonField; | |
1107 | ||
1108 | protected: | |
1109 | using _ThisCommonBlobField = CommonBlobField<LibObjT>; | |
1110 | ||
1111 | public: | |
1112 | using typename CommonField<LibObjT>::LibObjPtr; | |
1113 | ||
1114 | public: | |
1115 | explicit CommonBlobField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr} | |
1116 | { | |
1117 | BT_ASSERT_DBG(this->isBlob()); | |
1118 | } | |
1119 | ||
1120 | template <typename OtherLibObjT> | |
1121 | CommonBlobField(const CommonBlobField<OtherLibObjT> val) noexcept : _ThisCommonField {val} | |
1122 | { | |
1123 | } | |
1124 | ||
1125 | template <typename OtherLibObjT> | |
1126 | CommonBlobField operator=(const CommonBlobField<OtherLibObjT> val) noexcept | |
1127 | { | |
1128 | _ThisCommonField::operator=(val); | |
1129 | return *this; | |
1130 | } | |
1131 | ||
1132 | CommonBlobField<const bt_field> asConst() const noexcept | |
1133 | { | |
1134 | return CommonBlobField<const bt_field> {*this}; | |
1135 | } | |
1136 | ||
1137 | bt2s::span<typename internal::CommonBlobFieldSpec<LibObjT>::Data> data() const noexcept | |
1138 | { | |
1139 | return {internal::CommonBlobFieldSpec<LibObjT>::data(this->libObjPtr()), this->length()}; | |
1140 | } | |
1141 | ||
1142 | std::uint64_t length() const noexcept | |
1143 | { | |
1144 | return bt_field_blob_get_length(this->libObjPtr()); | |
1145 | } | |
1146 | }; | |
1147 | ||
1148 | using BlobField = CommonBlobField<bt_field>; | |
1149 | using ConstBlobField = CommonBlobField<const bt_field>; | |
1150 | ||
1151 | namespace internal { | |
1152 | ||
1153 | struct BlobFieldTypeDescr | |
1154 | { | |
1155 | using Const = ConstBlobField; | |
1156 | using NonConst = BlobField; | |
1157 | }; | |
1158 | ||
1159 | template <> | |
1160 | struct TypeDescr<BlobField> : public BlobFieldTypeDescr | |
1161 | { | |
1162 | }; | |
1163 | ||
1164 | template <> | |
1165 | struct TypeDescr<ConstBlobField> : public BlobFieldTypeDescr | |
1166 | { | |
1167 | }; | |
1168 | ||
1169 | } /* namespace internal */ | |
1170 | ||
1171 | template <typename LibObjT> | |
1172 | class CommonDynamicBlobField final : public CommonBlobField<LibObjT> | |
1173 | { | |
1174 | private: | |
1175 | using typename CommonBlobField<LibObjT>::_ThisCommonBlobField; | |
1176 | ||
1177 | public: | |
1178 | using typename CommonBlobField<LibObjT>::LibObjPtr; | |
1179 | ||
1180 | public: | |
1181 | explicit CommonDynamicBlobField(const LibObjPtr libObjPtr) noexcept : | |
1182 | _ThisCommonBlobField {libObjPtr} | |
1183 | { | |
1184 | BT_ASSERT_DBG(this->isDynamicBlob()); | |
1185 | } | |
1186 | ||
1187 | template <typename OtherLibObjT> | |
1188 | CommonDynamicBlobField(const CommonDynamicBlobField<OtherLibObjT> val) noexcept : | |
1189 | _ThisCommonBlobField {val} | |
1190 | { | |
1191 | } | |
1192 | ||
1193 | template <typename OtherLibObjT> | |
1194 | CommonDynamicBlobField operator=(const CommonDynamicBlobField<OtherLibObjT> val) noexcept | |
1195 | { | |
1196 | _ThisCommonBlobField::operator=(val); | |
1197 | return *this; | |
1198 | } | |
1199 | ||
1200 | std::uint64_t length() const noexcept | |
1201 | { | |
1202 | return _ThisCommonBlobField::length(); | |
1203 | } | |
1204 | ||
1205 | CommonDynamicBlobField length(const std::uint64_t length) const | |
1206 | { | |
1207 | static_assert(!std::is_const<LibObjT>::value, | |
1208 | "Not available with `bt2::ConstDynamicBlobField`."); | |
1209 | ||
1210 | if (bt_field_blob_dynamic_set_length(this->libObjPtr(), length) == | |
1211 | BT_FIELD_DYNAMIC_BLOB_SET_LENGTH_STATUS_MEMORY_ERROR) { | |
1212 | throw MemoryError {}; | |
1213 | } | |
1214 | ||
1215 | return *this; | |
1216 | } | |
1217 | }; | |
1218 | ||
1219 | using DynamicBlobField = CommonDynamicBlobField<bt_field>; | |
1220 | using ConstDynamicBlobField = CommonDynamicBlobField<const bt_field>; | |
1221 | ||
1222 | namespace internal { | |
1223 | ||
1224 | struct DynamicBlobFieldTypeDescr | |
1225 | { | |
1226 | using Const = ConstDynamicBlobField; | |
1227 | using NonConst = DynamicBlobField; | |
1228 | }; | |
1229 | ||
1230 | template <> | |
1231 | struct TypeDescr<DynamicBlobField> : public DynamicBlobFieldTypeDescr | |
1232 | { | |
1233 | }; | |
1234 | ||
1235 | template <> | |
1236 | struct TypeDescr<ConstDynamicBlobField> : public DynamicBlobFieldTypeDescr | |
1237 | { | |
1238 | }; | |
1239 | ||
a1e31878 PP |
1240 | template <typename LibObjT> |
1241 | struct CommonStructureFieldSpec; | |
1242 | ||
b5f55e9f | 1243 | /* Functions specific to mutable structure fields */ |
a1e31878 PP |
1244 | template <> |
1245 | struct CommonStructureFieldSpec<bt_field> final | |
1246 | { | |
1247 | static bt_field *memberFieldByIndex(bt_field * const libObjPtr, | |
1248 | const std::uint64_t index) noexcept | |
1249 | { | |
1250 | return bt_field_structure_borrow_member_field_by_index(libObjPtr, index); | |
1251 | } | |
1252 | ||
1253 | static bt_field *memberFieldByName(bt_field * const libObjPtr, const char * const name) noexcept | |
1254 | { | |
1255 | return bt_field_structure_borrow_member_field_by_name(libObjPtr, name); | |
1256 | } | |
1257 | }; | |
1258 | ||
b5f55e9f | 1259 | /* Functions specific to constant structure fields */ |
a1e31878 PP |
1260 | template <> |
1261 | struct CommonStructureFieldSpec<const bt_field> final | |
1262 | { | |
1263 | static const bt_field *memberFieldByIndex(const bt_field * const libObjPtr, | |
1264 | const std::uint64_t index) noexcept | |
1265 | { | |
1266 | return bt_field_structure_borrow_member_field_by_index_const(libObjPtr, index); | |
1267 | } | |
1268 | ||
1269 | static const bt_field *memberFieldByName(const bt_field * const libObjPtr, | |
1270 | const char * const name) noexcept | |
1271 | { | |
1272 | return bt_field_structure_borrow_member_field_by_name_const(libObjPtr, name); | |
1273 | } | |
1274 | }; | |
1275 | ||
b5f55e9f | 1276 | } /* namespace internal */ |
a1e31878 PP |
1277 | |
1278 | template <typename LibObjT> | |
1279 | class CommonStructureField final : public CommonField<LibObjT> | |
1280 | { | |
1281 | private: | |
a1e31878 PP |
1282 | using typename CommonField<LibObjT>::_ThisCommonField; |
1283 | using _Spec = internal::CommonStructureFieldSpec<LibObjT>; | |
1284 | ||
1285 | public: | |
d246c457 | 1286 | using typename CommonField<LibObjT>::LibObjPtr; |
8047a175 | 1287 | using Class = internal::DepType<LibObjT, StructureFieldClass, ConstStructureFieldClass>; |
a1e31878 | 1288 | |
d246c457 | 1289 | explicit CommonStructureField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr} |
a1e31878 PP |
1290 | { |
1291 | BT_ASSERT_DBG(this->isStructure()); | |
1292 | } | |
1293 | ||
1294 | template <typename OtherLibObjT> | |
100fa861 | 1295 | CommonStructureField(const CommonStructureField<OtherLibObjT> val) noexcept : |
a1e31878 PP |
1296 | _ThisCommonField {val} |
1297 | { | |
1298 | } | |
1299 | ||
1300 | template <typename OtherLibObjT> | |
ac30a470 | 1301 | CommonStructureField<LibObjT> operator=(const CommonStructureField<OtherLibObjT> val) noexcept |
a1e31878 PP |
1302 | { |
1303 | _ThisCommonField::operator=(val); | |
1304 | return *this; | |
1305 | } | |
1306 | ||
328a274a PP |
1307 | CommonStructureField<const bt_field> asConst() const noexcept |
1308 | { | |
1309 | return CommonStructureField<const bt_field> {*this}; | |
1310 | } | |
1311 | ||
dcb8ae9b | 1312 | Class cls() const noexcept |
a1e31878 | 1313 | { |
341a67c4 | 1314 | return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())}; |
a1e31878 PP |
1315 | } |
1316 | ||
c0b73c63 | 1317 | std::uint64_t length() const noexcept |
a1e31878 | 1318 | { |
c0b73c63 | 1319 | return this->cls().length(); |
a1e31878 PP |
1320 | } |
1321 | ||
dcb8ae9b | 1322 | CommonField<LibObjT> operator[](const std::uint64_t index) const noexcept |
a1e31878 | 1323 | { |
341a67c4 | 1324 | return CommonField<LibObjT> {_Spec::memberFieldByIndex(this->libObjPtr(), index)}; |
a1e31878 PP |
1325 | } |
1326 | ||
15030982 SM |
1327 | OptionalBorrowedObject<CommonField<LibObjT>> |
1328 | operator[](const bt2c::CStringView name) const noexcept | |
a1e31878 | 1329 | { |
ca61ecbc | 1330 | return _Spec::memberFieldByName(this->libObjPtr(), name); |
a1e31878 | 1331 | } |
a1e31878 PP |
1332 | }; |
1333 | ||
1334 | using StructureField = CommonStructureField<bt_field>; | |
1335 | using ConstStructureField = CommonStructureField<const bt_field>; | |
1336 | ||
1337 | namespace internal { | |
1338 | ||
4927bae7 PP |
1339 | struct StructureFieldTypeDescr |
1340 | { | |
1341 | using Const = ConstStructureField; | |
1342 | using NonConst = StructureField; | |
1343 | }; | |
1344 | ||
1345 | template <> | |
1346 | struct TypeDescr<StructureField> : public StructureFieldTypeDescr | |
1347 | { | |
1348 | }; | |
1349 | ||
1350 | template <> | |
1351 | struct TypeDescr<ConstStructureField> : public StructureFieldTypeDescr | |
1352 | { | |
1353 | }; | |
1354 | ||
a1e31878 PP |
1355 | template <typename LibObjT> |
1356 | struct CommonArrayFieldSpec; | |
1357 | ||
b5f55e9f | 1358 | /* Functions specific to mutable array fields */ |
a1e31878 PP |
1359 | template <> |
1360 | struct CommonArrayFieldSpec<bt_field> final | |
1361 | { | |
1362 | static bt_field *elementFieldByIndex(bt_field * const libObjPtr, | |
1363 | const std::uint64_t index) noexcept | |
1364 | { | |
1365 | return bt_field_array_borrow_element_field_by_index(libObjPtr, index); | |
1366 | } | |
1367 | }; | |
1368 | ||
b5f55e9f | 1369 | /* Functions specific to constant array fields */ |
a1e31878 PP |
1370 | template <> |
1371 | struct CommonArrayFieldSpec<const bt_field> final | |
1372 | { | |
1373 | static const bt_field *elementFieldByIndex(const bt_field * const libObjPtr, | |
1374 | const std::uint64_t index) noexcept | |
1375 | { | |
1376 | return bt_field_array_borrow_element_field_by_index_const(libObjPtr, index); | |
1377 | } | |
1378 | }; | |
1379 | ||
b5f55e9f | 1380 | } /* namespace internal */ |
a1e31878 PP |
1381 | |
1382 | template <typename LibObjT> | |
1383 | class CommonArrayField : public CommonField<LibObjT> | |
1384 | { | |
1385 | private: | |
1386 | using typename CommonField<LibObjT>::_ThisCommonField; | |
1387 | using _Spec = internal::CommonArrayFieldSpec<LibObjT>; | |
1388 | ||
1389 | protected: | |
a1e31878 PP |
1390 | using _ThisCommonArrayField = CommonArrayField<LibObjT>; |
1391 | ||
1392 | public: | |
d246c457 | 1393 | using typename CommonField<LibObjT>::LibObjPtr; |
8047a175 | 1394 | using Class = internal::DepType<LibObjT, ArrayFieldClass, ConstArrayFieldClass>; |
a1e31878 | 1395 | |
d246c457 | 1396 | explicit CommonArrayField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr} |
a1e31878 PP |
1397 | { |
1398 | BT_ASSERT_DBG(this->isArray()); | |
1399 | } | |
1400 | ||
1401 | template <typename OtherLibObjT> | |
100fa861 | 1402 | CommonArrayField(const CommonArrayField<OtherLibObjT> val) noexcept : _ThisCommonField {val} |
a1e31878 PP |
1403 | { |
1404 | } | |
1405 | ||
1406 | template <typename OtherLibObjT> | |
ac30a470 | 1407 | _ThisCommonArrayField operator=(const CommonArrayField<OtherLibObjT> val) noexcept |
a1e31878 PP |
1408 | { |
1409 | _ThisCommonField::operator=(val); | |
1410 | return *this; | |
1411 | } | |
1412 | ||
328a274a PP |
1413 | CommonArrayField<const bt_field> asConst() const noexcept |
1414 | { | |
1415 | return CommonArrayField<const bt_field> {*this}; | |
1416 | } | |
1417 | ||
dcb8ae9b | 1418 | Class cls() const noexcept |
a1e31878 | 1419 | { |
341a67c4 | 1420 | return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())}; |
a1e31878 PP |
1421 | } |
1422 | ||
1423 | std::uint64_t length() const noexcept | |
1424 | { | |
341a67c4 | 1425 | return bt_field_array_get_length(this->libObjPtr()); |
a1e31878 PP |
1426 | } |
1427 | ||
dcb8ae9b | 1428 | CommonField<LibObjT> operator[](const std::uint64_t index) const noexcept |
a1e31878 | 1429 | { |
341a67c4 | 1430 | return CommonField<LibObjT> {_Spec::elementFieldByIndex(this->libObjPtr(), index)}; |
a1e31878 PP |
1431 | } |
1432 | }; | |
1433 | ||
1434 | using ArrayField = CommonArrayField<bt_field>; | |
1435 | using ConstArrayField = CommonArrayField<const bt_field>; | |
1436 | ||
4927bae7 PP |
1437 | namespace internal { |
1438 | ||
1439 | struct ArrayFieldTypeDescr | |
1440 | { | |
1441 | using Const = ConstArrayField; | |
1442 | using NonConst = ArrayField; | |
1443 | }; | |
1444 | ||
1445 | template <> | |
1446 | struct TypeDescr<ArrayField> : public ArrayFieldTypeDescr | |
1447 | { | |
1448 | }; | |
1449 | ||
1450 | template <> | |
1451 | struct TypeDescr<ConstArrayField> : public ArrayFieldTypeDescr | |
1452 | { | |
1453 | }; | |
1454 | ||
1455 | } /* namespace internal */ | |
1456 | ||
a1e31878 PP |
1457 | template <typename LibObjT> |
1458 | class CommonDynamicArrayField : public CommonArrayField<LibObjT> | |
1459 | { | |
1460 | private: | |
a1e31878 PP |
1461 | using typename CommonArrayField<LibObjT>::_ThisCommonArrayField; |
1462 | ||
1463 | public: | |
d246c457 PP |
1464 | using typename CommonField<LibObjT>::LibObjPtr; |
1465 | ||
1466 | explicit CommonDynamicArrayField(const LibObjPtr libObjPtr) noexcept : | |
a1e31878 PP |
1467 | _ThisCommonArrayField {libObjPtr} |
1468 | { | |
1469 | BT_ASSERT_DBG(this->isDynamicArray()); | |
1470 | } | |
1471 | ||
1472 | template <typename OtherLibObjT> | |
100fa861 | 1473 | CommonDynamicArrayField(const CommonDynamicArrayField<OtherLibObjT> val) noexcept : |
a1e31878 PP |
1474 | _ThisCommonArrayField {val} |
1475 | { | |
1476 | } | |
1477 | ||
1478 | template <typename OtherLibObjT> | |
ac30a470 | 1479 | CommonDynamicArrayField<LibObjT> |
100fa861 | 1480 | operator=(const CommonDynamicArrayField<OtherLibObjT> val) noexcept |
a1e31878 PP |
1481 | { |
1482 | _ThisCommonArrayField::operator=(val); | |
1483 | return *this; | |
1484 | } | |
1485 | ||
328a274a PP |
1486 | CommonDynamicArrayField<const bt_field> asConst() const noexcept |
1487 | { | |
1488 | return CommonDynamicArrayField<const bt_field> {*this}; | |
1489 | } | |
1490 | ||
a1e31878 PP |
1491 | std::uint64_t length() const noexcept |
1492 | { | |
1493 | return _ThisCommonArrayField::length(); | |
1494 | } | |
1495 | ||
2a24eba8 | 1496 | CommonDynamicArrayField length(const std::uint64_t length) const |
a1e31878 | 1497 | { |
5c895f64 PP |
1498 | static_assert(!std::is_const<LibObjT>::value, |
1499 | "Not available with `bt2::ConstDynamicArrayField`."); | |
a1e31878 | 1500 | |
341a67c4 | 1501 | const auto status = bt_field_array_dynamic_set_length(this->libObjPtr(), length); |
a1e31878 PP |
1502 | |
1503 | if (status == BT_FIELD_DYNAMIC_ARRAY_SET_LENGTH_STATUS_MEMORY_ERROR) { | |
39278ebc | 1504 | throw MemoryError {}; |
a1e31878 | 1505 | } |
2a24eba8 SM |
1506 | |
1507 | return *this; | |
a1e31878 PP |
1508 | } |
1509 | }; | |
1510 | ||
1511 | using DynamicArrayField = CommonDynamicArrayField<bt_field>; | |
1512 | using ConstDynamicArrayField = CommonDynamicArrayField<const bt_field>; | |
1513 | ||
1514 | namespace internal { | |
1515 | ||
4927bae7 PP |
1516 | struct DynamicArrayFieldTypeDescr |
1517 | { | |
1518 | using Const = ConstDynamicArrayField; | |
1519 | using NonConst = DynamicArrayField; | |
1520 | }; | |
1521 | ||
1522 | template <> | |
1523 | struct TypeDescr<DynamicArrayField> : public DynamicArrayFieldTypeDescr | |
1524 | { | |
1525 | }; | |
1526 | ||
1527 | template <> | |
1528 | struct TypeDescr<ConstDynamicArrayField> : public DynamicArrayFieldTypeDescr | |
1529 | { | |
1530 | }; | |
1531 | ||
a1e31878 PP |
1532 | template <typename LibObjT> |
1533 | struct CommonOptionFieldSpec; | |
1534 | ||
b5f55e9f | 1535 | /* Functions specific to mutable option fields */ |
a1e31878 PP |
1536 | template <> |
1537 | struct CommonOptionFieldSpec<bt_field> final | |
1538 | { | |
1539 | static bt_field *field(bt_field * const libObjPtr) noexcept | |
1540 | { | |
1541 | return bt_field_option_borrow_field(libObjPtr); | |
1542 | } | |
1543 | }; | |
1544 | ||
b5f55e9f | 1545 | /* Functions specific to constant option fields */ |
a1e31878 PP |
1546 | template <> |
1547 | struct CommonOptionFieldSpec<const bt_field> final | |
1548 | { | |
1549 | static const bt_field *field(const bt_field * const libObjPtr) noexcept | |
1550 | { | |
1551 | return bt_field_option_borrow_field_const(libObjPtr); | |
1552 | } | |
1553 | }; | |
1554 | ||
b5f55e9f | 1555 | } /* namespace internal */ |
a1e31878 PP |
1556 | |
1557 | template <typename LibObjT> | |
1558 | class CommonOptionField : public CommonField<LibObjT> | |
1559 | { | |
1560 | private: | |
a1e31878 PP |
1561 | using typename CommonField<LibObjT>::_ThisCommonField; |
1562 | using _Spec = internal::CommonOptionFieldSpec<LibObjT>; | |
1563 | ||
1564 | public: | |
d246c457 | 1565 | using typename CommonField<LibObjT>::LibObjPtr; |
8047a175 | 1566 | using Class = internal::DepType<LibObjT, OptionFieldClass, ConstOptionFieldClass>; |
a1e31878 | 1567 | |
d246c457 | 1568 | explicit CommonOptionField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr} |
a1e31878 PP |
1569 | { |
1570 | BT_ASSERT_DBG(this->isOption()); | |
1571 | } | |
1572 | ||
1573 | template <typename OtherLibObjT> | |
100fa861 | 1574 | CommonOptionField(const CommonOptionField<OtherLibObjT> val) noexcept : _ThisCommonField {val} |
a1e31878 PP |
1575 | { |
1576 | } | |
1577 | ||
1578 | template <typename OtherLibObjT> | |
ac30a470 | 1579 | CommonOptionField<LibObjT> operator=(const CommonOptionField<OtherLibObjT> val) noexcept |
a1e31878 PP |
1580 | { |
1581 | _ThisCommonField::operator=(val); | |
1582 | return *this; | |
1583 | } | |
1584 | ||
328a274a PP |
1585 | CommonOptionField<const bt_field> asConst() const noexcept |
1586 | { | |
1587 | return CommonOptionField<const bt_field> {*this}; | |
1588 | } | |
1589 | ||
dcb8ae9b | 1590 | Class cls() const noexcept |
a1e31878 | 1591 | { |
341a67c4 | 1592 | return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())}; |
a1e31878 PP |
1593 | } |
1594 | ||
2a24eba8 | 1595 | CommonOptionField hasField(const bool hasField) const noexcept |
a1e31878 | 1596 | { |
5c895f64 PP |
1597 | static_assert(!std::is_const<LibObjT>::value, |
1598 | "Not available with `bt2::ConstOptionField`."); | |
a1e31878 | 1599 | |
341a67c4 | 1600 | bt_field_option_set_has_field(this->libObjPtr(), static_cast<bt_bool>(hasField)); |
2a24eba8 | 1601 | return *this; |
a1e31878 PP |
1602 | } |
1603 | ||
1604 | bool hasField() const noexcept | |
1605 | { | |
a804026d | 1606 | return this->field().hasObject(); |
a1e31878 PP |
1607 | } |
1608 | ||
ca61ecbc | 1609 | OptionalBorrowedObject<CommonField<LibObjT>> field() const noexcept |
a1e31878 | 1610 | { |
ca61ecbc | 1611 | return _Spec::field(this->libObjPtr()); |
a1e31878 PP |
1612 | } |
1613 | }; | |
1614 | ||
1615 | using OptionField = CommonOptionField<bt_field>; | |
1616 | using ConstOptionField = CommonOptionField<const bt_field>; | |
1617 | ||
1618 | namespace internal { | |
1619 | ||
4927bae7 PP |
1620 | struct OptionFieldTypeDescr |
1621 | { | |
1622 | using Const = ConstOptionField; | |
1623 | using NonConst = OptionField; | |
1624 | }; | |
1625 | ||
1626 | template <> | |
1627 | struct TypeDescr<OptionField> : public OptionFieldTypeDescr | |
1628 | { | |
1629 | }; | |
1630 | ||
1631 | template <> | |
1632 | struct TypeDescr<ConstOptionField> : public OptionFieldTypeDescr | |
1633 | { | |
1634 | }; | |
1635 | ||
a1e31878 PP |
1636 | template <typename LibObjT> |
1637 | struct CommonVariantFieldSpec; | |
1638 | ||
b5f55e9f | 1639 | /* Functions specific to mutable variant fields */ |
a1e31878 PP |
1640 | template <> |
1641 | struct CommonVariantFieldSpec<bt_field> final | |
1642 | { | |
1643 | static bt_field *selectedOptionField(bt_field * const libObjPtr) noexcept | |
1644 | { | |
1645 | return bt_field_variant_borrow_selected_option_field(libObjPtr); | |
1646 | } | |
1647 | }; | |
1648 | ||
b5f55e9f | 1649 | /* Functions specific to constant variant fields */ |
a1e31878 PP |
1650 | template <> |
1651 | struct CommonVariantFieldSpec<const bt_field> final | |
1652 | { | |
1653 | static const bt_field *selectedOptionField(const bt_field * const libObjPtr) noexcept | |
1654 | { | |
1655 | return bt_field_variant_borrow_selected_option_field_const(libObjPtr); | |
1656 | } | |
1657 | }; | |
1658 | ||
b5f55e9f | 1659 | } /* namespace internal */ |
a1e31878 PP |
1660 | |
1661 | template <typename LibObjT> | |
1662 | class CommonVariantField : public CommonField<LibObjT> | |
1663 | { | |
1664 | private: | |
a1e31878 PP |
1665 | using typename CommonField<LibObjT>::_ThisCommonField; |
1666 | using _Spec = internal::CommonVariantFieldSpec<LibObjT>; | |
1667 | ||
1668 | public: | |
d246c457 | 1669 | using typename CommonField<LibObjT>::LibObjPtr; |
8047a175 | 1670 | using Class = internal::DepType<LibObjT, VariantFieldClass, ConstVariantFieldClass>; |
a1e31878 | 1671 | |
d246c457 | 1672 | explicit CommonVariantField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr} |
a1e31878 PP |
1673 | { |
1674 | BT_ASSERT_DBG(this->isVariant()); | |
1675 | } | |
1676 | ||
1677 | template <typename OtherLibObjT> | |
100fa861 | 1678 | CommonVariantField(const CommonVariantField<OtherLibObjT> val) noexcept : _ThisCommonField {val} |
a1e31878 PP |
1679 | { |
1680 | } | |
1681 | ||
1682 | template <typename OtherLibObjT> | |
ac30a470 | 1683 | CommonVariantField<LibObjT> operator=(const CommonVariantField<OtherLibObjT> val) noexcept |
a1e31878 PP |
1684 | { |
1685 | _ThisCommonField::operator=(val); | |
1686 | return *this; | |
1687 | } | |
1688 | ||
328a274a PP |
1689 | CommonVariantField<const bt_field> asConst() const noexcept |
1690 | { | |
1691 | return CommonVariantField<const bt_field> {*this}; | |
1692 | } | |
1693 | ||
dcb8ae9b | 1694 | Class cls() const noexcept |
a1e31878 | 1695 | { |
341a67c4 | 1696 | return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())}; |
a1e31878 PP |
1697 | } |
1698 | ||
2a24eba8 | 1699 | CommonVariantField selectOption(const std::uint64_t index) const noexcept |
a1e31878 | 1700 | { |
5c895f64 PP |
1701 | static_assert(!std::is_const<LibObjT>::value, |
1702 | "Not available with `bt2::ConstVariantField`."); | |
a1e31878 | 1703 | |
b5cc976b SM |
1704 | const auto status = bt_field_variant_select_option_by_index(this->libObjPtr(), index); |
1705 | ||
1706 | BT_ASSERT_DBG(status == BT_FIELD_VARIANT_SELECT_OPTION_STATUS_OK); | |
2a24eba8 | 1707 | return *this; |
a1e31878 PP |
1708 | } |
1709 | ||
dcb8ae9b | 1710 | CommonField<LibObjT> selectedOptionField() const noexcept |
a1e31878 | 1711 | { |
341a67c4 | 1712 | return CommonField<LibObjT> {_Spec::selectedOptionField(this->libObjPtr())}; |
a1e31878 PP |
1713 | } |
1714 | ||
1715 | std::uint64_t selectedOptionIndex() const noexcept | |
1716 | { | |
341a67c4 | 1717 | return bt_field_variant_get_selected_option_index(this->libObjPtr()); |
a1e31878 PP |
1718 | } |
1719 | }; | |
1720 | ||
1721 | using VariantField = CommonVariantField<bt_field>; | |
1722 | using ConstVariantField = CommonVariantField<const bt_field>; | |
1723 | ||
4927bae7 PP |
1724 | namespace internal { |
1725 | ||
1726 | struct VariantFieldTypeDescr | |
1727 | { | |
1728 | using Const = ConstVariantField; | |
1729 | using NonConst = VariantField; | |
1730 | }; | |
1731 | ||
1732 | template <> | |
1733 | struct TypeDescr<VariantField> : public VariantFieldTypeDescr | |
1734 | { | |
1735 | }; | |
1736 | ||
1737 | template <> | |
1738 | struct TypeDescr<ConstVariantField> : public VariantFieldTypeDescr | |
1739 | { | |
1740 | }; | |
1741 | ||
1742 | } /* namespace internal */ | |
1743 | ||
a1e31878 PP |
1744 | template <typename LibObjT> |
1745 | CommonBoolField<LibObjT> CommonField<LibObjT>::asBool() const noexcept | |
1746 | { | |
341a67c4 | 1747 | return CommonBoolField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1748 | } |
1749 | ||
1750 | template <typename LibObjT> | |
1751 | CommonBitArrayField<LibObjT> CommonField<LibObjT>::asBitArray() const noexcept | |
1752 | { | |
341a67c4 | 1753 | return CommonBitArrayField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1754 | } |
1755 | ||
1756 | template <typename LibObjT> | |
1757 | CommonUnsignedIntegerField<LibObjT> CommonField<LibObjT>::asUnsignedInteger() const noexcept | |
1758 | { | |
341a67c4 | 1759 | return CommonUnsignedIntegerField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1760 | } |
1761 | ||
1762 | template <typename LibObjT> | |
1763 | CommonSignedIntegerField<LibObjT> CommonField<LibObjT>::asSignedInteger() const noexcept | |
1764 | { | |
341a67c4 | 1765 | return CommonSignedIntegerField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1766 | } |
1767 | ||
1768 | template <typename LibObjT> | |
1769 | CommonUnsignedEnumerationField<LibObjT> CommonField<LibObjT>::asUnsignedEnumeration() const noexcept | |
1770 | { | |
341a67c4 | 1771 | return CommonUnsignedEnumerationField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1772 | } |
1773 | ||
1774 | template <typename LibObjT> | |
1775 | CommonSignedEnumerationField<LibObjT> CommonField<LibObjT>::asSignedEnumeration() const noexcept | |
1776 | { | |
341a67c4 | 1777 | return CommonSignedEnumerationField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1778 | } |
1779 | ||
1780 | template <typename LibObjT> | |
1781 | CommonSinglePrecisionRealField<LibObjT> CommonField<LibObjT>::asSinglePrecisionReal() const noexcept | |
1782 | { | |
341a67c4 | 1783 | return CommonSinglePrecisionRealField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1784 | } |
1785 | ||
1786 | template <typename LibObjT> | |
1787 | CommonDoublePrecisionRealField<LibObjT> CommonField<LibObjT>::asDoublePrecisionReal() const noexcept | |
1788 | { | |
341a67c4 | 1789 | return CommonDoublePrecisionRealField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1790 | } |
1791 | ||
1792 | template <typename LibObjT> | |
1793 | CommonStringField<LibObjT> CommonField<LibObjT>::asString() const noexcept | |
1794 | { | |
341a67c4 | 1795 | return CommonStringField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1796 | } |
1797 | ||
a613491d PP |
1798 | template <typename LibObjT> |
1799 | CommonBlobField<LibObjT> CommonField<LibObjT>::asBlob() const noexcept | |
1800 | { | |
1801 | BT_ASSERT_DBG(this->isBlob()); | |
1802 | return CommonBlobField<LibObjT> {this->libObjPtr()}; | |
1803 | } | |
1804 | ||
1805 | template <typename LibObjT> | |
1806 | CommonDynamicBlobField<LibObjT> CommonField<LibObjT>::asDynamicBlob() const noexcept | |
1807 | { | |
1808 | BT_ASSERT_DBG(this->isDynamicBlob()); | |
1809 | return CommonDynamicBlobField<LibObjT> {this->libObjPtr()}; | |
1810 | } | |
1811 | ||
a1e31878 PP |
1812 | template <typename LibObjT> |
1813 | CommonStructureField<LibObjT> CommonField<LibObjT>::asStructure() const noexcept | |
1814 | { | |
341a67c4 | 1815 | return CommonStructureField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1816 | } |
1817 | ||
1818 | template <typename LibObjT> | |
1819 | CommonArrayField<LibObjT> CommonField<LibObjT>::asArray() const noexcept | |
1820 | { | |
341a67c4 | 1821 | return CommonArrayField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1822 | } |
1823 | ||
1824 | template <typename LibObjT> | |
1825 | CommonDynamicArrayField<LibObjT> CommonField<LibObjT>::asDynamicArray() const noexcept | |
1826 | { | |
341a67c4 | 1827 | return CommonDynamicArrayField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1828 | } |
1829 | ||
1830 | template <typename LibObjT> | |
1831 | CommonOptionField<LibObjT> CommonField<LibObjT>::asOption() const noexcept | |
1832 | { | |
341a67c4 | 1833 | return CommonOptionField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1834 | } |
1835 | ||
1836 | template <typename LibObjT> | |
1837 | CommonVariantField<LibObjT> CommonField<LibObjT>::asVariant() const noexcept | |
1838 | { | |
341a67c4 | 1839 | return CommonVariantField<LibObjT> {this->libObjPtr()}; |
a1e31878 PP |
1840 | } |
1841 | ||
b5f55e9f | 1842 | } /* namespace bt2 */ |
a1e31878 | 1843 | |
b5f55e9f | 1844 | #endif /* BABELTRACE_CPP_COMMON_BT2_FIELD_HPP */ |