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