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