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