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