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