cpp-common/bt2: make `bt2::BorrowedObject::LibObj` public
[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:
a1e31878
PP
101 using _ThisCommonField = CommonField<LibObjT>;
102
103public:
d246c457 104 using typename BorrowedObject<LibObjT>::LibObjPtr;
8047a175 105 using Class = internal::DepFc<LibObjT>;
a1e31878 106
d246c457 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:
a1e31878
PP
257 using typename CommonField<LibObjT>::_ThisCommonField;
258
259public:
d246c457 260 using typename CommonField<LibObjT>::LibObjPtr;
a1e31878
PP
261 using Value = bool;
262
d246c457 263 explicit CommonBoolField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
a1e31878
PP
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:
a1e31878
PP
330 using typename CommonField<LibObjT>::_ThisCommonField;
331
332public:
d246c457 333 using typename CommonField<LibObjT>::LibObjPtr;
8047a175 334 using Class = internal::DepType<LibObjT, BitArrayFieldClass, ConstBitArrayFieldClass>;
a1e31878 335
d246c457 336 explicit CommonBitArrayField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
a1e31878
PP
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:
a1e31878
PP
420 using _ThisCommonUnsignedIntegerField = CommonUnsignedIntegerField<LibObjT>;
421
422public:
d246c457 423 using typename CommonField<LibObjT>::LibObjPtr;
a1e31878 424 using Value = std::uint64_t;
8047a175 425 using Class = internal::DepType<LibObjT, IntegerFieldClass, ConstIntegerFieldClass>;
a1e31878 426
d246c457 427 explicit CommonUnsignedIntegerField(const LibObjPtr libObjPtr) noexcept :
a1e31878
PP
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:
a1e31878
PP
506 using _ThisCommonSignedIntegerField = CommonSignedIntegerField<LibObjT>;
507
508public:
d246c457 509 using typename CommonField<LibObjT>::LibObjPtr;
edfe13aa 510 using Value = std::int64_t;
8047a175 511 using Class = internal::DepType<LibObjT, IntegerFieldClass, ConstIntegerFieldClass>;
a1e31878 512
d246c457 513 explicit CommonSignedIntegerField(const LibObjPtr libObjPtr) noexcept :
a1e31878
PP
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;
a1e31878
PP
615
616public:
d246c457
PP
617 using typename CommonField<LibObjT>::LibObjPtr;
618
8047a175
PP
619 using Class = internal::DepType<LibObjT, UnsignedEnumerationFieldClass,
620 ConstUnsignedEnumerationFieldClass>;
a1e31878 621
d246c457 622 explicit CommonUnsignedEnumerationField(const LibObjPtr libObjPtr) noexcept :
a1e31878
PP
623 _ThisCommonUnsignedIntegerField {libObjPtr}
624 {
625 BT_ASSERT_DBG(this->isUnsignedEnumeration());
626 }
627
628 template <typename OtherLibObjT>
100fa861 629 CommonUnsignedEnumerationField(const CommonUnsignedEnumerationField<OtherLibObjT> val) noexcept
a1e31878
PP
630 :
631 _ThisCommonUnsignedIntegerField {val}
632 {
633 }
634
635 template <typename OtherLibObjT>
ac30a470 636 CommonUnsignedEnumerationField<LibObjT>
100fa861 637 operator=(const CommonUnsignedEnumerationField<OtherLibObjT> val) noexcept
a1e31878
PP
638 {
639 _ThisCommonUnsignedIntegerField::operator=(val);
640 return *this;
641 }
642
328a274a
PP
643 CommonUnsignedEnumerationField<const bt_field> asConst() const noexcept
644 {
645 return CommonUnsignedEnumerationField<const bt_field> {*this};
646 }
647
dcb8ae9b 648 Class cls() const noexcept
a1e31878 649 {
341a67c4 650 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
a1e31878
PP
651 }
652
653 EnumerationFieldClassMappingLabels labels() const
654 {
655 bt_field_class_enumeration_mapping_label_array labelArray;
656 std::uint64_t count;
341a67c4 657 const auto status = bt_field_enumeration_unsigned_get_mapping_labels(this->libObjPtr(),
a1e31878
PP
658 &labelArray, &count);
659
660 if (status == BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_MEMORY_ERROR) {
39278ebc 661 throw MemoryError {};
a1e31878
PP
662 }
663
664 return EnumerationFieldClassMappingLabels {labelArray, count};
665 }
666};
667
668using UnsignedEnumerationField = CommonUnsignedEnumerationField<bt_field>;
669using ConstUnsignedEnumerationField = CommonUnsignedEnumerationField<const bt_field>;
670
4927bae7
PP
671namespace internal {
672
673struct UnsignedEnumerationFieldTypeDescr
674{
675 using Const = ConstUnsignedEnumerationField;
676 using NonConst = UnsignedEnumerationField;
677};
678
679template <>
680struct TypeDescr<UnsignedEnumerationField> : public UnsignedEnumerationFieldTypeDescr
681{
682};
683
684template <>
685struct TypeDescr<ConstUnsignedEnumerationField> : public UnsignedEnumerationFieldTypeDescr
686{
687};
688
689} /* namespace internal */
690
a1e31878
PP
691template <typename LibObjT>
692class CommonSignedEnumerationField final : public CommonSignedIntegerField<LibObjT>
693{
694private:
695 using typename CommonSignedIntegerField<LibObjT>::_ThisCommonSignedIntegerField;
a1e31878
PP
696
697public:
d246c457
PP
698 using typename CommonField<LibObjT>::LibObjPtr;
699
a1e31878 700 using Class =
8047a175 701 internal::DepType<LibObjT, SignedEnumerationFieldClass, ConstSignedEnumerationFieldClass>;
a1e31878 702
d246c457 703 explicit CommonSignedEnumerationField(const LibObjPtr libObjPtr) noexcept :
a1e31878
PP
704 _ThisCommonSignedIntegerField {libObjPtr}
705 {
706 BT_ASSERT_DBG(this->isSignedEnumeration());
707 }
708
709 template <typename OtherLibObjT>
100fa861 710 CommonSignedEnumerationField(const CommonSignedEnumerationField<OtherLibObjT> val) noexcept :
a1e31878
PP
711 _ThisCommonSignedIntegerField {val}
712 {
713 }
714
715 template <typename OtherLibObjT>
ac30a470 716 CommonSignedEnumerationField<LibObjT>
100fa861 717 operator=(const CommonSignedEnumerationField<OtherLibObjT> val) noexcept
a1e31878
PP
718 {
719 _ThisCommonSignedIntegerField::operator=(val);
720 return *this;
721 }
722
328a274a
PP
723 CommonSignedEnumerationField<const bt_field> asConst() const noexcept
724 {
725 return CommonSignedEnumerationField<const bt_field> {*this};
726 }
727
dcb8ae9b 728 Class cls() const noexcept
a1e31878 729 {
341a67c4 730 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
a1e31878
PP
731 }
732
733 EnumerationFieldClassMappingLabels labels() const
734 {
735 bt_field_class_enumeration_mapping_label_array labelArray;
736 std::uint64_t count;
737 const auto status =
341a67c4 738 bt_field_enumeration_signed_get_mapping_labels(this->libObjPtr(), &labelArray, &count);
a1e31878
PP
739
740 if (status == BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_MEMORY_ERROR) {
39278ebc 741 throw MemoryError {};
a1e31878
PP
742 }
743
744 return EnumerationFieldClassMappingLabels {labelArray, count};
745 }
746};
747
748using SignedEnumerationField = CommonSignedEnumerationField<bt_field>;
749using ConstSignedEnumerationField = CommonSignedEnumerationField<const bt_field>;
750
4927bae7
PP
751namespace internal {
752
753struct SignedEnumerationFieldTypeDescr
754{
755 using Const = ConstSignedEnumerationField;
756 using NonConst = SignedEnumerationField;
757};
758
759template <>
760struct TypeDescr<SignedEnumerationField> : public SignedEnumerationFieldTypeDescr
761{
762};
763
764template <>
765struct TypeDescr<ConstSignedEnumerationField> : public SignedEnumerationFieldTypeDescr
766{
767};
768
769} /* namespace internal */
770
a1e31878
PP
771template <typename LibObjT>
772class CommonSinglePrecisionRealField final : public CommonField<LibObjT>
773{
774private:
a1e31878
PP
775 using typename CommonField<LibObjT>::_ThisCommonField;
776
777public:
d246c457 778 using typename CommonField<LibObjT>::LibObjPtr;
a1e31878
PP
779 using Value = float;
780
d246c457 781 explicit CommonSinglePrecisionRealField(const LibObjPtr libObjPtr) noexcept :
a1e31878
PP
782 _ThisCommonField {libObjPtr}
783 {
784 BT_ASSERT_DBG(this->isSinglePrecisionReal());
785 }
786
787 template <typename OtherLibObjT>
100fa861 788 CommonSinglePrecisionRealField(const CommonSinglePrecisionRealField<OtherLibObjT> val) noexcept
a1e31878
PP
789 :
790 _ThisCommonField {val}
791 {
792 }
793
794 template <typename OtherLibObjT>
ac30a470 795 CommonSinglePrecisionRealField<LibObjT>
100fa861 796 operator=(const CommonSinglePrecisionRealField<OtherLibObjT> val) noexcept
a1e31878
PP
797 {
798 _ThisCommonField::operator=(val);
799 return *this;
800 }
801
328a274a
PP
802 CommonSinglePrecisionRealField<const bt_field> asConst() const noexcept
803 {
804 return CommonSinglePrecisionRealField<const bt_field> {*this};
805 }
806
7f7fbdb3
PP
807 RawValueProxy<CommonSinglePrecisionRealField> operator*() const noexcept
808 {
809 return RawValueProxy<CommonSinglePrecisionRealField> {*this};
810 }
811
812 void value(const Value val) const noexcept
a1e31878 813 {
5c895f64
PP
814 static_assert(!std::is_const<LibObjT>::value,
815 "Not available with `bt2::ConstSinglePrecisionRealField`.");
a1e31878 816
341a67c4 817 bt_field_real_single_precision_set_value(this->libObjPtr(), val);
a1e31878
PP
818 }
819
820 Value value() const noexcept
821 {
341a67c4 822 return bt_field_real_single_precision_get_value(this->libObjPtr());
a1e31878 823 }
a1e31878
PP
824};
825
826using SinglePrecisionRealField = CommonSinglePrecisionRealField<bt_field>;
827using ConstSinglePrecisionRealField = CommonSinglePrecisionRealField<const bt_field>;
828
4927bae7
PP
829namespace internal {
830
831struct SinglePrecisionRealFieldTypeDescr
832{
833 using Const = ConstSinglePrecisionRealField;
834 using NonConst = SinglePrecisionRealField;
835};
836
837template <>
838struct TypeDescr<SinglePrecisionRealField> : public SinglePrecisionRealFieldTypeDescr
839{
840};
841
842template <>
843struct TypeDescr<ConstSinglePrecisionRealField> : public SinglePrecisionRealFieldTypeDescr
844{
845};
846
847} /* namespace internal */
848
a1e31878
PP
849template <typename LibObjT>
850class CommonDoublePrecisionRealField final : public CommonField<LibObjT>
851{
852private:
a1e31878
PP
853 using typename CommonField<LibObjT>::_ThisCommonField;
854
855public:
d246c457 856 using typename CommonField<LibObjT>::LibObjPtr;
a1e31878
PP
857 using Value = double;
858
d246c457 859 explicit CommonDoublePrecisionRealField(const LibObjPtr libObjPtr) noexcept :
a1e31878
PP
860 _ThisCommonField {libObjPtr}
861 {
862 BT_ASSERT_DBG(this->isDoublePrecisionReal());
863 }
864
865 template <typename OtherLibObjT>
100fa861 866 CommonDoublePrecisionRealField(const CommonDoublePrecisionRealField<OtherLibObjT> val) noexcept
a1e31878
PP
867 :
868 _ThisCommonField {val}
869 {
870 }
871
872 template <typename OtherLibObjT>
ac30a470 873 CommonDoublePrecisionRealField<LibObjT>
100fa861 874 operator=(const CommonDoublePrecisionRealField<OtherLibObjT> val) noexcept
a1e31878
PP
875 {
876 _ThisCommonField::operator=(val);
877 return *this;
878 }
879
328a274a
PP
880 CommonDoublePrecisionRealField<const bt_field> asConst() const noexcept
881 {
882 return CommonDoublePrecisionRealField<const bt_field> {*this};
883 }
884
7f7fbdb3
PP
885 RawValueProxy<CommonDoublePrecisionRealField> operator*() const noexcept
886 {
887 return RawValueProxy<CommonDoublePrecisionRealField> {*this};
888 }
889
890 void value(const Value val) const noexcept
a1e31878 891 {
5c895f64
PP
892 static_assert(!std::is_const<LibObjT>::value,
893 "Not available with `bt2::ConstDoublePrecisionRealField`.");
a1e31878 894
edfe13aa 895 bt_field_real_double_precision_set_value(this->libObjPtr(), val);
a1e31878
PP
896 }
897
898 Value value() const noexcept
899 {
edfe13aa 900 return bt_field_real_double_precision_get_value(this->libObjPtr());
a1e31878 901 }
a1e31878
PP
902};
903
904using DoublePrecisionRealField = CommonDoublePrecisionRealField<bt_field>;
905using ConstDoublePrecisionRealField = CommonDoublePrecisionRealField<const bt_field>;
906
4927bae7
PP
907namespace internal {
908
909struct DoublePrecisionRealFieldTypeDescr
910{
911 using Const = ConstDoublePrecisionRealField;
912 using NonConst = DoublePrecisionRealField;
913};
914
915template <>
916struct TypeDescr<DoublePrecisionRealField> : public DoublePrecisionRealFieldTypeDescr
917{
918};
919
920template <>
921struct TypeDescr<ConstDoublePrecisionRealField> : public DoublePrecisionRealFieldTypeDescr
922{
923};
924
925} /* namespace internal */
926
a1e31878
PP
927template <typename LibObjT>
928class CommonStringField final : public CommonField<LibObjT>
929{
930private:
a1e31878
PP
931 using typename CommonField<LibObjT>::_ThisCommonField;
932
933public:
d246c457 934 using typename CommonField<LibObjT>::LibObjPtr;
7f7fbdb3
PP
935 using Value = const char *;
936
d246c457 937 explicit CommonStringField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
a1e31878
PP
938 {
939 BT_ASSERT_DBG(this->isString());
940 }
941
942 template <typename OtherLibObjT>
100fa861 943 CommonStringField(const CommonStringField<OtherLibObjT> val) noexcept : _ThisCommonField {val}
a1e31878
PP
944 {
945 }
946
947 template <typename OtherLibObjT>
ac30a470 948 CommonStringField<LibObjT> operator=(const CommonStringField<OtherLibObjT> val) noexcept
a1e31878
PP
949 {
950 _ThisCommonField::operator=(val);
951 return *this;
952 }
953
328a274a
PP
954 CommonStringField<const bt_field> asConst() const noexcept
955 {
956 return CommonStringField<const bt_field> {*this};
957 }
958
7f7fbdb3
PP
959 RawStringValueProxy<CommonStringField> operator*() const noexcept
960 {
961 return RawStringValueProxy<CommonStringField> {*this};
962 }
963
964 void value(const char * const val) const
a1e31878 965 {
5c895f64
PP
966 static_assert(!std::is_const<LibObjT>::value,
967 "Not available with `bt2::ConstStringField`.");
a1e31878 968
341a67c4 969 const auto status = bt_field_string_set_value(this->libObjPtr(), val);
a1e31878
PP
970
971 if (status == BT_FIELD_STRING_SET_VALUE_STATUS_MEMORY_ERROR) {
39278ebc 972 throw MemoryError {};
a1e31878 973 }
a1e31878
PP
974 }
975
7f7fbdb3 976 void value(const std::string& val) const
a1e31878 977 {
7f7fbdb3 978 this->value(val.data());
a1e31878
PP
979 }
980
dcb8ae9b 981 void append(const char * const begin, const std::uint64_t len) const
8a79c777 982 {
5c895f64
PP
983 static_assert(!std::is_const<LibObjT>::value,
984 "Not available with `bt2::ConstStringField`.");
8a79c777
FD
985
986 const auto status = bt_field_string_append_with_length(this->libObjPtr(), begin, len);
987
988 if (status == BT_FIELD_STRING_APPEND_STATUS_MEMORY_ERROR) {
989 throw MemoryError {};
990 }
991 }
992
dcb8ae9b 993 void append(const std::string& val) const
8a79c777
FD
994 {
995 this->append(val.data(), val.size());
996 }
997
dcb8ae9b 998 void clear() const noexcept
a1e31878 999 {
5c895f64
PP
1000 static_assert(!std::is_const<LibObjT>::value,
1001 "Not available with `bt2::ConstStringField`.");
a1e31878 1002
341a67c4 1003 bt_field_string_clear(this->libObjPtr());
a1e31878
PP
1004 }
1005
7f7fbdb3 1006 const char *value() const noexcept
a1e31878 1007 {
341a67c4 1008 return bt_field_string_get_value(this->libObjPtr());
a1e31878
PP
1009 }
1010};
1011
1012using StringField = CommonStringField<bt_field>;
1013using ConstStringField = CommonStringField<const bt_field>;
1014
1015namespace internal {
1016
4927bae7
PP
1017struct StringFieldTypeDescr
1018{
1019 using Const = ConstStringField;
1020 using NonConst = StringField;
1021};
1022
1023template <>
1024struct TypeDescr<StringField> : public StringFieldTypeDescr
1025{
1026};
1027
1028template <>
1029struct TypeDescr<ConstStringField> : public StringFieldTypeDescr
1030{
1031};
1032
a1e31878
PP
1033template <typename LibObjT>
1034struct CommonStructureFieldSpec;
1035
b5f55e9f 1036/* Functions specific to mutable structure fields */
a1e31878
PP
1037template <>
1038struct CommonStructureFieldSpec<bt_field> final
1039{
1040 static bt_field *memberFieldByIndex(bt_field * const libObjPtr,
1041 const std::uint64_t index) noexcept
1042 {
1043 return bt_field_structure_borrow_member_field_by_index(libObjPtr, index);
1044 }
1045
1046 static bt_field *memberFieldByName(bt_field * const libObjPtr, const char * const name) noexcept
1047 {
1048 return bt_field_structure_borrow_member_field_by_name(libObjPtr, name);
1049 }
1050};
1051
b5f55e9f 1052/* Functions specific to constant structure fields */
a1e31878
PP
1053template <>
1054struct CommonStructureFieldSpec<const bt_field> final
1055{
1056 static const bt_field *memberFieldByIndex(const bt_field * const libObjPtr,
1057 const std::uint64_t index) noexcept
1058 {
1059 return bt_field_structure_borrow_member_field_by_index_const(libObjPtr, index);
1060 }
1061
1062 static const bt_field *memberFieldByName(const bt_field * const libObjPtr,
1063 const char * const name) noexcept
1064 {
1065 return bt_field_structure_borrow_member_field_by_name_const(libObjPtr, name);
1066 }
1067};
1068
b5f55e9f 1069} /* namespace internal */
a1e31878
PP
1070
1071template <typename LibObjT>
1072class CommonStructureField final : public CommonField<LibObjT>
1073{
1074private:
a1e31878
PP
1075 using typename CommonField<LibObjT>::_ThisCommonField;
1076 using _Spec = internal::CommonStructureFieldSpec<LibObjT>;
1077
1078public:
d246c457 1079 using typename CommonField<LibObjT>::LibObjPtr;
8047a175 1080 using Class = internal::DepType<LibObjT, StructureFieldClass, ConstStructureFieldClass>;
a1e31878 1081
d246c457 1082 explicit CommonStructureField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
a1e31878
PP
1083 {
1084 BT_ASSERT_DBG(this->isStructure());
1085 }
1086
1087 template <typename OtherLibObjT>
100fa861 1088 CommonStructureField(const CommonStructureField<OtherLibObjT> val) noexcept :
a1e31878
PP
1089 _ThisCommonField {val}
1090 {
1091 }
1092
1093 template <typename OtherLibObjT>
ac30a470 1094 CommonStructureField<LibObjT> operator=(const CommonStructureField<OtherLibObjT> val) noexcept
a1e31878
PP
1095 {
1096 _ThisCommonField::operator=(val);
1097 return *this;
1098 }
1099
328a274a
PP
1100 CommonStructureField<const bt_field> asConst() const noexcept
1101 {
1102 return CommonStructureField<const bt_field> {*this};
1103 }
1104
dcb8ae9b 1105 Class cls() const noexcept
a1e31878 1106 {
341a67c4 1107 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
a1e31878
PP
1108 }
1109
c0b73c63 1110 std::uint64_t length() const noexcept
a1e31878 1111 {
c0b73c63 1112 return this->cls().length();
a1e31878
PP
1113 }
1114
dcb8ae9b 1115 CommonField<LibObjT> operator[](const std::uint64_t index) const noexcept
a1e31878 1116 {
341a67c4 1117 return CommonField<LibObjT> {_Spec::memberFieldByIndex(this->libObjPtr(), index)};
a1e31878
PP
1118 }
1119
c022776a 1120 bt2s::optional<CommonField<LibObjT>> operator[](const char * const name) const noexcept
a1e31878 1121 {
341a67c4 1122 const auto libObjPtr = _Spec::memberFieldByName(this->libObjPtr(), name);
a1e31878
PP
1123
1124 if (libObjPtr) {
1125 return CommonField<LibObjT> {libObjPtr};
1126 }
1127
c022776a 1128 return bt2s::nullopt;
a1e31878
PP
1129 }
1130
c022776a 1131 bt2s::optional<CommonField<LibObjT>> operator[](const std::string& name) const noexcept
a1e31878
PP
1132 {
1133 return (*this)[name.data()];
1134 }
1135};
1136
1137using StructureField = CommonStructureField<bt_field>;
1138using ConstStructureField = CommonStructureField<const bt_field>;
1139
1140namespace internal {
1141
4927bae7
PP
1142struct StructureFieldTypeDescr
1143{
1144 using Const = ConstStructureField;
1145 using NonConst = StructureField;
1146};
1147
1148template <>
1149struct TypeDescr<StructureField> : public StructureFieldTypeDescr
1150{
1151};
1152
1153template <>
1154struct TypeDescr<ConstStructureField> : public StructureFieldTypeDescr
1155{
1156};
1157
a1e31878
PP
1158template <typename LibObjT>
1159struct CommonArrayFieldSpec;
1160
b5f55e9f 1161/* Functions specific to mutable array fields */
a1e31878
PP
1162template <>
1163struct CommonArrayFieldSpec<bt_field> final
1164{
1165 static bt_field *elementFieldByIndex(bt_field * const libObjPtr,
1166 const std::uint64_t index) noexcept
1167 {
1168 return bt_field_array_borrow_element_field_by_index(libObjPtr, index);
1169 }
1170};
1171
b5f55e9f 1172/* Functions specific to constant array fields */
a1e31878
PP
1173template <>
1174struct CommonArrayFieldSpec<const bt_field> final
1175{
1176 static const bt_field *elementFieldByIndex(const bt_field * const libObjPtr,
1177 const std::uint64_t index) noexcept
1178 {
1179 return bt_field_array_borrow_element_field_by_index_const(libObjPtr, index);
1180 }
1181};
1182
b5f55e9f 1183} /* namespace internal */
a1e31878
PP
1184
1185template <typename LibObjT>
1186class CommonArrayField : public CommonField<LibObjT>
1187{
1188private:
1189 using typename CommonField<LibObjT>::_ThisCommonField;
1190 using _Spec = internal::CommonArrayFieldSpec<LibObjT>;
1191
1192protected:
a1e31878
PP
1193 using _ThisCommonArrayField = CommonArrayField<LibObjT>;
1194
1195public:
d246c457 1196 using typename CommonField<LibObjT>::LibObjPtr;
8047a175 1197 using Class = internal::DepType<LibObjT, ArrayFieldClass, ConstArrayFieldClass>;
a1e31878 1198
d246c457 1199 explicit CommonArrayField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
a1e31878
PP
1200 {
1201 BT_ASSERT_DBG(this->isArray());
1202 }
1203
1204 template <typename OtherLibObjT>
100fa861 1205 CommonArrayField(const CommonArrayField<OtherLibObjT> val) noexcept : _ThisCommonField {val}
a1e31878
PP
1206 {
1207 }
1208
1209 template <typename OtherLibObjT>
ac30a470 1210 _ThisCommonArrayField operator=(const CommonArrayField<OtherLibObjT> val) noexcept
a1e31878
PP
1211 {
1212 _ThisCommonField::operator=(val);
1213 return *this;
1214 }
1215
328a274a
PP
1216 CommonArrayField<const bt_field> asConst() const noexcept
1217 {
1218 return CommonArrayField<const bt_field> {*this};
1219 }
1220
dcb8ae9b 1221 Class cls() const noexcept
a1e31878 1222 {
341a67c4 1223 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
a1e31878
PP
1224 }
1225
1226 std::uint64_t length() const noexcept
1227 {
341a67c4 1228 return bt_field_array_get_length(this->libObjPtr());
a1e31878
PP
1229 }
1230
dcb8ae9b 1231 CommonField<LibObjT> operator[](const std::uint64_t index) const noexcept
a1e31878 1232 {
341a67c4 1233 return CommonField<LibObjT> {_Spec::elementFieldByIndex(this->libObjPtr(), index)};
a1e31878
PP
1234 }
1235};
1236
1237using ArrayField = CommonArrayField<bt_field>;
1238using ConstArrayField = CommonArrayField<const bt_field>;
1239
4927bae7
PP
1240namespace internal {
1241
1242struct ArrayFieldTypeDescr
1243{
1244 using Const = ConstArrayField;
1245 using NonConst = ArrayField;
1246};
1247
1248template <>
1249struct TypeDescr<ArrayField> : public ArrayFieldTypeDescr
1250{
1251};
1252
1253template <>
1254struct TypeDescr<ConstArrayField> : public ArrayFieldTypeDescr
1255{
1256};
1257
1258} /* namespace internal */
1259
a1e31878
PP
1260template <typename LibObjT>
1261class CommonDynamicArrayField : public CommonArrayField<LibObjT>
1262{
1263private:
a1e31878
PP
1264 using typename CommonArrayField<LibObjT>::_ThisCommonArrayField;
1265
1266public:
d246c457
PP
1267 using typename CommonField<LibObjT>::LibObjPtr;
1268
1269 explicit CommonDynamicArrayField(const LibObjPtr libObjPtr) noexcept :
a1e31878
PP
1270 _ThisCommonArrayField {libObjPtr}
1271 {
1272 BT_ASSERT_DBG(this->isDynamicArray());
1273 }
1274
1275 template <typename OtherLibObjT>
100fa861 1276 CommonDynamicArrayField(const CommonDynamicArrayField<OtherLibObjT> val) noexcept :
a1e31878
PP
1277 _ThisCommonArrayField {val}
1278 {
1279 }
1280
1281 template <typename OtherLibObjT>
ac30a470 1282 CommonDynamicArrayField<LibObjT>
100fa861 1283 operator=(const CommonDynamicArrayField<OtherLibObjT> val) noexcept
a1e31878
PP
1284 {
1285 _ThisCommonArrayField::operator=(val);
1286 return *this;
1287 }
1288
328a274a
PP
1289 CommonDynamicArrayField<const bt_field> asConst() const noexcept
1290 {
1291 return CommonDynamicArrayField<const bt_field> {*this};
1292 }
1293
a1e31878
PP
1294 std::uint64_t length() const noexcept
1295 {
1296 return _ThisCommonArrayField::length();
1297 }
1298
dcb8ae9b 1299 void length(const std::uint64_t length) const
a1e31878 1300 {
5c895f64
PP
1301 static_assert(!std::is_const<LibObjT>::value,
1302 "Not available with `bt2::ConstDynamicArrayField`.");
a1e31878 1303
341a67c4 1304 const auto status = bt_field_array_dynamic_set_length(this->libObjPtr(), length);
a1e31878
PP
1305
1306 if (status == BT_FIELD_DYNAMIC_ARRAY_SET_LENGTH_STATUS_MEMORY_ERROR) {
39278ebc 1307 throw MemoryError {};
a1e31878
PP
1308 }
1309 }
1310};
1311
1312using DynamicArrayField = CommonDynamicArrayField<bt_field>;
1313using ConstDynamicArrayField = CommonDynamicArrayField<const bt_field>;
1314
1315namespace internal {
1316
4927bae7
PP
1317struct DynamicArrayFieldTypeDescr
1318{
1319 using Const = ConstDynamicArrayField;
1320 using NonConst = DynamicArrayField;
1321};
1322
1323template <>
1324struct TypeDescr<DynamicArrayField> : public DynamicArrayFieldTypeDescr
1325{
1326};
1327
1328template <>
1329struct TypeDescr<ConstDynamicArrayField> : public DynamicArrayFieldTypeDescr
1330{
1331};
1332
a1e31878
PP
1333template <typename LibObjT>
1334struct CommonOptionFieldSpec;
1335
b5f55e9f 1336/* Functions specific to mutable option fields */
a1e31878
PP
1337template <>
1338struct CommonOptionFieldSpec<bt_field> final
1339{
1340 static bt_field *field(bt_field * const libObjPtr) noexcept
1341 {
1342 return bt_field_option_borrow_field(libObjPtr);
1343 }
1344};
1345
b5f55e9f 1346/* Functions specific to constant option fields */
a1e31878
PP
1347template <>
1348struct CommonOptionFieldSpec<const bt_field> final
1349{
1350 static const bt_field *field(const bt_field * const libObjPtr) noexcept
1351 {
1352 return bt_field_option_borrow_field_const(libObjPtr);
1353 }
1354};
1355
b5f55e9f 1356} /* namespace internal */
a1e31878
PP
1357
1358template <typename LibObjT>
1359class CommonOptionField : public CommonField<LibObjT>
1360{
1361private:
a1e31878
PP
1362 using typename CommonField<LibObjT>::_ThisCommonField;
1363 using _Spec = internal::CommonOptionFieldSpec<LibObjT>;
1364
1365public:
d246c457 1366 using typename CommonField<LibObjT>::LibObjPtr;
8047a175 1367 using Class = internal::DepType<LibObjT, OptionFieldClass, ConstOptionFieldClass>;
a1e31878 1368
d246c457 1369 explicit CommonOptionField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
a1e31878
PP
1370 {
1371 BT_ASSERT_DBG(this->isOption());
1372 }
1373
1374 template <typename OtherLibObjT>
100fa861 1375 CommonOptionField(const CommonOptionField<OtherLibObjT> val) noexcept : _ThisCommonField {val}
a1e31878
PP
1376 {
1377 }
1378
1379 template <typename OtherLibObjT>
ac30a470 1380 CommonOptionField<LibObjT> operator=(const CommonOptionField<OtherLibObjT> val) noexcept
a1e31878
PP
1381 {
1382 _ThisCommonField::operator=(val);
1383 return *this;
1384 }
1385
328a274a
PP
1386 CommonOptionField<const bt_field> asConst() const noexcept
1387 {
1388 return CommonOptionField<const bt_field> {*this};
1389 }
1390
dcb8ae9b 1391 Class cls() const noexcept
a1e31878 1392 {
341a67c4 1393 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
a1e31878
PP
1394 }
1395
dcb8ae9b 1396 void hasField(const bool hasField) const noexcept
a1e31878 1397 {
5c895f64
PP
1398 static_assert(!std::is_const<LibObjT>::value,
1399 "Not available with `bt2::ConstOptionField`.");
a1e31878 1400
341a67c4 1401 bt_field_option_set_has_field(this->libObjPtr(), static_cast<bt_bool>(hasField));
a1e31878
PP
1402 }
1403
1404 bool hasField() const noexcept
1405 {
a5edf52d 1406 return this->field().has_value();
a1e31878
PP
1407 }
1408
c022776a 1409 bt2s::optional<CommonField<LibObjT>> field() const noexcept
a1e31878 1410 {
341a67c4 1411 const auto libObjPtr = _Spec::field(this->libObjPtr());
a1e31878
PP
1412
1413 if (libObjPtr) {
1414 return CommonField<LibObjT> {libObjPtr};
1415 }
1416
c022776a 1417 return bt2s::nullopt;
a1e31878
PP
1418 }
1419};
1420
1421using OptionField = CommonOptionField<bt_field>;
1422using ConstOptionField = CommonOptionField<const bt_field>;
1423
1424namespace internal {
1425
4927bae7
PP
1426struct OptionFieldTypeDescr
1427{
1428 using Const = ConstOptionField;
1429 using NonConst = OptionField;
1430};
1431
1432template <>
1433struct TypeDescr<OptionField> : public OptionFieldTypeDescr
1434{
1435};
1436
1437template <>
1438struct TypeDescr<ConstOptionField> : public OptionFieldTypeDescr
1439{
1440};
1441
a1e31878
PP
1442template <typename LibObjT>
1443struct CommonVariantFieldSpec;
1444
b5f55e9f 1445/* Functions specific to mutable variant fields */
a1e31878
PP
1446template <>
1447struct CommonVariantFieldSpec<bt_field> final
1448{
1449 static bt_field *selectedOptionField(bt_field * const libObjPtr) noexcept
1450 {
1451 return bt_field_variant_borrow_selected_option_field(libObjPtr);
1452 }
1453};
1454
b5f55e9f 1455/* Functions specific to constant variant fields */
a1e31878
PP
1456template <>
1457struct CommonVariantFieldSpec<const bt_field> final
1458{
1459 static const bt_field *selectedOptionField(const bt_field * const libObjPtr) noexcept
1460 {
1461 return bt_field_variant_borrow_selected_option_field_const(libObjPtr);
1462 }
1463};
1464
b5f55e9f 1465} /* namespace internal */
a1e31878
PP
1466
1467template <typename LibObjT>
1468class CommonVariantField : public CommonField<LibObjT>
1469{
1470private:
a1e31878
PP
1471 using typename CommonField<LibObjT>::_ThisCommonField;
1472 using _Spec = internal::CommonVariantFieldSpec<LibObjT>;
1473
1474public:
d246c457 1475 using typename CommonField<LibObjT>::LibObjPtr;
8047a175 1476 using Class = internal::DepType<LibObjT, VariantFieldClass, ConstVariantFieldClass>;
a1e31878 1477
d246c457 1478 explicit CommonVariantField(const LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
a1e31878
PP
1479 {
1480 BT_ASSERT_DBG(this->isVariant());
1481 }
1482
1483 template <typename OtherLibObjT>
100fa861 1484 CommonVariantField(const CommonVariantField<OtherLibObjT> val) noexcept : _ThisCommonField {val}
a1e31878
PP
1485 {
1486 }
1487
1488 template <typename OtherLibObjT>
ac30a470 1489 CommonVariantField<LibObjT> operator=(const CommonVariantField<OtherLibObjT> val) noexcept
a1e31878
PP
1490 {
1491 _ThisCommonField::operator=(val);
1492 return *this;
1493 }
1494
328a274a
PP
1495 CommonVariantField<const bt_field> asConst() const noexcept
1496 {
1497 return CommonVariantField<const bt_field> {*this};
1498 }
1499
dcb8ae9b 1500 Class cls() const noexcept
a1e31878 1501 {
341a67c4 1502 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
a1e31878
PP
1503 }
1504
dcb8ae9b 1505 void selectOption(const std::uint64_t index) const noexcept
a1e31878 1506 {
5c895f64
PP
1507 static_assert(!std::is_const<LibObjT>::value,
1508 "Not available with `bt2::ConstVariantField`.");
a1e31878 1509
341a67c4 1510 static_cast<void>(bt_field_variant_select_option_by_index(this->libObjPtr(), index));
a1e31878
PP
1511 }
1512
dcb8ae9b 1513 CommonField<LibObjT> selectedOptionField() const noexcept
a1e31878 1514 {
341a67c4 1515 return CommonField<LibObjT> {_Spec::selectedOptionField(this->libObjPtr())};
a1e31878
PP
1516 }
1517
1518 std::uint64_t selectedOptionIndex() const noexcept
1519 {
341a67c4 1520 return bt_field_variant_get_selected_option_index(this->libObjPtr());
a1e31878
PP
1521 }
1522};
1523
1524using VariantField = CommonVariantField<bt_field>;
1525using ConstVariantField = CommonVariantField<const bt_field>;
1526
4927bae7
PP
1527namespace internal {
1528
1529struct VariantFieldTypeDescr
1530{
1531 using Const = ConstVariantField;
1532 using NonConst = VariantField;
1533};
1534
1535template <>
1536struct TypeDescr<VariantField> : public VariantFieldTypeDescr
1537{
1538};
1539
1540template <>
1541struct TypeDescr<ConstVariantField> : public VariantFieldTypeDescr
1542{
1543};
1544
1545} /* namespace internal */
1546
a1e31878
PP
1547template <typename LibObjT>
1548CommonBoolField<LibObjT> CommonField<LibObjT>::asBool() const noexcept
1549{
1550 BT_ASSERT_DBG(this->isBool());
341a67c4 1551 return CommonBoolField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1552}
1553
1554template <typename LibObjT>
1555CommonBitArrayField<LibObjT> CommonField<LibObjT>::asBitArray() const noexcept
1556{
1557 BT_ASSERT_DBG(this->isBitArray());
341a67c4 1558 return CommonBitArrayField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1559}
1560
1561template <typename LibObjT>
1562CommonUnsignedIntegerField<LibObjT> CommonField<LibObjT>::asUnsignedInteger() const noexcept
1563{
1564 BT_ASSERT_DBG(this->isUnsignedInteger());
341a67c4 1565 return CommonUnsignedIntegerField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1566}
1567
1568template <typename LibObjT>
1569CommonSignedIntegerField<LibObjT> CommonField<LibObjT>::asSignedInteger() const noexcept
1570{
1571 BT_ASSERT_DBG(this->isSignedInteger());
341a67c4 1572 return CommonSignedIntegerField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1573}
1574
1575template <typename LibObjT>
1576CommonUnsignedEnumerationField<LibObjT> CommonField<LibObjT>::asUnsignedEnumeration() const noexcept
1577{
1578 BT_ASSERT_DBG(this->isUnsignedEnumeration());
341a67c4 1579 return CommonUnsignedEnumerationField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1580}
1581
1582template <typename LibObjT>
1583CommonSignedEnumerationField<LibObjT> CommonField<LibObjT>::asSignedEnumeration() const noexcept
1584{
1585 BT_ASSERT_DBG(this->isSignedEnumeration());
341a67c4 1586 return CommonSignedEnumerationField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1587}
1588
1589template <typename LibObjT>
1590CommonSinglePrecisionRealField<LibObjT> CommonField<LibObjT>::asSinglePrecisionReal() const noexcept
1591{
1592 BT_ASSERT_DBG(this->isSinglePrecisionReal());
341a67c4 1593 return CommonSinglePrecisionRealField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1594}
1595
1596template <typename LibObjT>
1597CommonDoublePrecisionRealField<LibObjT> CommonField<LibObjT>::asDoublePrecisionReal() const noexcept
1598{
1599 BT_ASSERT_DBG(this->isDoublePrecisionReal());
341a67c4 1600 return CommonDoublePrecisionRealField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1601}
1602
1603template <typename LibObjT>
1604CommonStringField<LibObjT> CommonField<LibObjT>::asString() const noexcept
1605{
1606 BT_ASSERT_DBG(this->isString());
341a67c4 1607 return CommonStringField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1608}
1609
1610template <typename LibObjT>
1611CommonStructureField<LibObjT> CommonField<LibObjT>::asStructure() const noexcept
1612{
1613 BT_ASSERT_DBG(this->isStructure());
341a67c4 1614 return CommonStructureField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1615}
1616
1617template <typename LibObjT>
1618CommonArrayField<LibObjT> CommonField<LibObjT>::asArray() const noexcept
1619{
1620 BT_ASSERT_DBG(this->isArray());
341a67c4 1621 return CommonArrayField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1622}
1623
1624template <typename LibObjT>
1625CommonDynamicArrayField<LibObjT> CommonField<LibObjT>::asDynamicArray() const noexcept
1626{
1627 BT_ASSERT_DBG(this->isDynamicArray());
341a67c4 1628 return CommonDynamicArrayField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1629}
1630
1631template <typename LibObjT>
1632CommonOptionField<LibObjT> CommonField<LibObjT>::asOption() const noexcept
1633{
1634 BT_ASSERT_DBG(this->isOption());
341a67c4 1635 return CommonOptionField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1636}
1637
1638template <typename LibObjT>
1639CommonVariantField<LibObjT> CommonField<LibObjT>::asVariant() const noexcept
1640{
1641 BT_ASSERT_DBG(this->isVariant());
341a67c4 1642 return CommonVariantField<LibObjT> {this->libObjPtr()};
a1e31878
PP
1643}
1644
b5f55e9f 1645} /* namespace bt2 */
a1e31878 1646
b5f55e9f 1647#endif /* BABELTRACE_CPP_COMMON_BT2_FIELD_HPP */
This page took 0.109898 seconds and 4 git commands to generate.