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