cpp-common/bt2: use more specific static assertion messages
[babeltrace.git] / src / cpp-common / bt2 / field-class.hpp
CommitLineData
12435a68
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_CLASS_HPP
8#define BABELTRACE_CPP_COMMON_BT2_FIELD_CLASS_HPP
9
12435a68 10#include <cstdint>
c802cacb
SM
11#include <type_traits>
12
12435a68
PP
13#include <babeltrace2/babeltrace.h>
14
15#include "common/assert.h"
12435a68
PP
16#include "cpp-common/optional.hpp"
17#include "cpp-common/string_view.hpp"
c802cacb 18
0d218157 19#include "borrowed-object.hpp"
8aee46a3 20#include "common-iterator.hpp"
39278ebc 21#include "exc.hpp"
12435a68 22#include "field-path.hpp"
c802cacb 23#include "integer-range-set.hpp"
c802cacb 24#include "internal/utils.hpp"
7f5cdaf0 25#include "shared-object.hpp"
096c6be7 26#include "value.hpp"
12435a68
PP
27
28namespace bt2 {
12435a68
PP
29namespace internal {
30
31struct FieldClassRefFuncs final
32{
c677c492 33 static void get(const bt_field_class * const libObjPtr) noexcept
12435a68
PP
34 {
35 bt_field_class_get_ref(libObjPtr);
36 }
37
c677c492 38 static void put(const bt_field_class * const libObjPtr) noexcept
12435a68
PP
39 {
40 bt_field_class_put_ref(libObjPtr);
41 }
42};
43
12435a68
PP
44template <typename LibObjT>
45struct CommonFieldClassSpec;
46
b5f55e9f 47/* Functions specific to mutable field classes */
12435a68
PP
48template <>
49struct CommonFieldClassSpec<bt_field_class> final
50{
51 static bt_value *userAttributes(bt_field_class * const libObjPtr) noexcept
52 {
53 return bt_field_class_borrow_user_attributes(libObjPtr);
54 }
55};
56
b5f55e9f 57/* Functions specific to constant field classes */
12435a68
PP
58template <>
59struct CommonFieldClassSpec<const bt_field_class> final
60{
61 static const bt_value *userAttributes(const bt_field_class * const libObjPtr) noexcept
62 {
63 return bt_field_class_borrow_user_attributes_const(libObjPtr);
64 }
65};
66
b5f55e9f 67} /* namespace internal */
12435a68 68
26b9d24c 69template <typename ObjT, typename LibObjT>
7f5cdaf0 70using SharedFieldClass = SharedObject<ObjT, LibObjT, internal::FieldClassRefFuncs>;
26b9d24c 71
12435a68
PP
72template <typename LibObjT>
73class CommonBitArrayFieldClass;
74
75template <typename LibObjT>
76class CommonIntegerFieldClass;
77
78template <typename LibObjT>
79class ConstEnumerationFieldClassMapping;
80
be6aa636
FD
81template <typename LibObjT>
82class CommonBaseEnumerationFieldClass;
83
12435a68
PP
84template <typename LibObjT, typename MappingT>
85class CommonEnumerationFieldClass;
86
87template <typename LibObjT>
88class CommonStructureFieldClass;
89
90template <typename LibObjT>
91class CommonArrayFieldClass;
92
93template <typename LibObjT>
94class CommonStaticArrayFieldClass;
95
96template <typename LibObjT>
97class CommonDynamicArrayWithLengthFieldClass;
98
99template <typename LibObjT>
100class CommonOptionFieldClass;
101
102template <typename LibObjT>
103class CommonOptionWithSelectorFieldClass;
104
105template <typename LibObjT>
106class CommonOptionWithBoolSelectorFieldClass;
107
108template <typename LibObjT>
109class CommonVariantFieldClass;
110
111template <typename LibObjT, typename RangeSetT>
112class CommonOptionWithIntegerSelectorFieldClass;
113
114template <typename LibObjT>
115class CommonVariantWithoutSelectorFieldClass;
116
cefe03a2
FD
117template <typename LibObjT>
118class CommonVariantWithSelectorFieldClass;
119
12435a68
PP
120template <typename LibObjT>
121class ConstVariantWithIntegerSelectorFieldClassOption;
122
123template <typename LibObjT, typename RangeSetT>
124class CommonVariantWithIntegerSelectorFieldClass;
125
74fc764d
PP
126template <typename LibObjT>
127class CommonEventClass;
128
129template <typename LibObjT>
130class CommonStreamClass;
131
132template <typename LibObjT>
133class CommonTraceClass;
134
12435a68
PP
135enum class FieldClassType
136{
137 BOOL = BT_FIELD_CLASS_TYPE_BOOL,
138 BIT_ARRAY = BT_FIELD_CLASS_TYPE_BIT_ARRAY,
139 UNSIGNED_INTEGER = BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER,
140 SIGNED_INTEGER = BT_FIELD_CLASS_TYPE_SIGNED_INTEGER,
141 UNSIGNED_ENUMERATION = BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION,
142 SIGNED_ENUMERATION = BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION,
143 SINGLE_PRECISION_REAL = BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL,
144 DOUBLE_PRECISION_REAL = BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL,
145 STRING = BT_FIELD_CLASS_TYPE_STRING,
146 STRUCTURE = BT_FIELD_CLASS_TYPE_STRUCTURE,
147 STATIC_ARRAY = BT_FIELD_CLASS_TYPE_STATIC_ARRAY,
148 DYNAMIC_ARRAY_WITHOUT_LENGTH = BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD,
149 DYNAMIC_ARRAY_WITH_LENGTH = BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD,
150 OPTION_WITHOUT_SELECTOR = BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD,
151 OPTION_WITH_BOOL_SELECTOR = BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD,
152 OPTION_WITH_UNSIGNED_INTEGER_SELECTOR =
153 BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD,
154 OPTION_WITH_SIGNED_INTEGER_SELECTOR =
155 BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD,
156 VARIANT_WITHOUT_SELECTOR = BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD,
157 VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR =
158 BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD,
159 VARIANT_WITH_SIGNED_INTEGER_SELECTOR =
160 BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD,
161};
162
163template <typename LibObjT>
0d218157 164class CommonFieldClass : public BorrowedObject<LibObjT>
12435a68 165{
12435a68 166private:
0d218157 167 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
12435a68
PP
168
169protected:
0d218157 170 using typename BorrowedObject<LibObjT>::_LibObjPtr;
12435a68
PP
171 using _ThisCommonFieldClass = CommonFieldClass<LibObjT>;
172
173public:
26b9d24c 174 using Shared = SharedFieldClass<CommonFieldClass<LibObjT>, LibObjT>;
12435a68
PP
175
176 using UserAttributes =
177 typename std::conditional<std::is_const<LibObjT>::value, ConstMapValue, MapValue>::type;
178
0d218157 179 explicit CommonFieldClass(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
12435a68
PP
180 {
181 }
182
183 template <typename OtherLibObjT>
0d218157 184 CommonFieldClass(const CommonFieldClass<OtherLibObjT> fc) noexcept : _ThisBorrowedObject {fc}
12435a68
PP
185 {
186 }
187
188 template <typename OtherLibObjT>
100fa861 189 CommonFieldClass& operator=(const CommonFieldClass<OtherLibObjT> fc) noexcept
12435a68 190 {
0d218157 191 _ThisBorrowedObject::operator=(fc);
12435a68
PP
192 return *this;
193 }
194
328a274a
PP
195 CommonFieldClass<const bt_field_class> asConst() const noexcept
196 {
197 return CommonFieldClass<const bt_field_class> {*this};
198 }
199
12435a68
PP
200 FieldClassType type() const noexcept
201 {
341a67c4 202 return static_cast<FieldClassType>(bt_field_class_get_type(this->libObjPtr()));
12435a68
PP
203 }
204
205 bool isBool() const noexcept
206 {
207 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_BOOL);
208 }
209
210 bool isBitArray() const noexcept
211 {
212 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_BIT_ARRAY);
213 }
214
215 bool isInteger() const noexcept
216 {
217 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_INTEGER);
218 }
219
220 bool isUnsignedInteger() const noexcept
221 {
222 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER);
223 }
224
225 bool isSignedInteger() const noexcept
226 {
227 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_SIGNED_INTEGER);
228 }
229
230 bool isEnumeration() const noexcept
231 {
232 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_ENUMERATION);
233 }
234
235 bool isUnsignedEnumeration() const noexcept
236 {
237 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION);
238 }
239
240 bool isSignedEnumeration() const noexcept
241 {
242 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION);
243 }
244
ff620936
FD
245 bool isReal() const noexcept
246 {
247 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_REAL);
248 }
249
12435a68
PP
250 bool isSinglePrecisionReal() const noexcept
251 {
252 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL);
253 }
254
255 bool isDoublePrecisionReal() const noexcept
256 {
257 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL);
258 }
259
260 bool isString() const noexcept
261 {
262 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_STRING);
263 }
264
265 bool isStructure() const noexcept
266 {
267 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_STRUCTURE);
268 }
269
270 bool isArray() const noexcept
271 {
272 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_ARRAY);
273 }
274
275 bool isStaticArray() const noexcept
276 {
277 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_STATIC_ARRAY);
278 }
279
280 bool isDynamicArray() const noexcept
281 {
282 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY);
283 }
284
285 bool isDynamicArrayWithoutLength() const noexcept
286 {
287 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD);
288 }
289
290 bool isDynamicArrayWithLength() const noexcept
291 {
292 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD);
293 }
294
295 bool isOption() const noexcept
296 {
297 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_OPTION);
298 }
299
300 bool isOptionWithoutSelector() const noexcept
301 {
302 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD);
303 }
304
305 bool isOptionWithSelector() const noexcept
306 {
307 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_OPTION_WITH_SELECTOR_FIELD);
308 }
309
310 bool isOptionWithBoolSelector() const noexcept
311 {
312 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD);
313 }
314
315 bool isOptionWithIntegerSelector() const noexcept
316 {
317 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_OPTION_WITH_INTEGER_SELECTOR_FIELD);
318 }
319
320 bool isOptionWithUnsignedIntegerSelector() const noexcept
321 {
322 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD);
323 }
324
325 bool isOptionWithSignedIntegerSelector() const noexcept
326 {
327 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD);
328 }
329
330 bool isVariant() const noexcept
331 {
332 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_VARIANT);
333 }
334
335 bool isVariantWithoutSelector() const noexcept
336 {
337 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD);
338 }
339
340 bool isVariantWithSelector() const noexcept
341 {
342 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_VARIANT_WITH_SELECTOR_FIELD);
343 }
344
345 bool isVariantWithIntegerSelector() const noexcept
346 {
347 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_VARIANT_WITH_INTEGER_SELECTOR_FIELD);
348 }
349
350 bool isVariantWithUnsignedIntegerSelector() const noexcept
351 {
352 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD);
353 }
354
355 bool isVariantWithSignedIntegerSelector() const noexcept
356 {
357 return this->_libTypeIs(BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD);
358 }
359
45e0ded5
PP
360 template <typename FieldClassT>
361 FieldClassT as() const noexcept
362 {
363 return FieldClassT {this->libObjPtr()};
364 }
365
12435a68
PP
366 CommonBitArrayFieldClass<LibObjT> asBitArray() const noexcept;
367 CommonIntegerFieldClass<LibObjT> asInteger() const noexcept;
be6aa636 368 CommonBaseEnumerationFieldClass<LibObjT> asEnumeration() const noexcept;
12435a68
PP
369 CommonEnumerationFieldClass<LibObjT, ConstEnumerationFieldClassMapping<
370 const bt_field_class_enumeration_unsigned_mapping>>
371 asUnsignedEnumeration() const noexcept;
372
373 CommonEnumerationFieldClass<
374 LibObjT, ConstEnumerationFieldClassMapping<const bt_field_class_enumeration_signed_mapping>>
375 asSignedEnumeration() const noexcept;
376
377 CommonStructureFieldClass<LibObjT> asStructure() const noexcept;
378 CommonArrayFieldClass<LibObjT> asArray() const noexcept;
379 CommonStaticArrayFieldClass<LibObjT> asStaticArray() const noexcept;
380 CommonDynamicArrayWithLengthFieldClass<LibObjT> asDynamicArrayWithLength() const noexcept;
381 CommonOptionFieldClass<LibObjT> asOption() const noexcept;
382 CommonOptionWithSelectorFieldClass<LibObjT> asOptionWithSelector() const noexcept;
383 CommonOptionWithBoolSelectorFieldClass<LibObjT> asOptionWithBoolSelector() const noexcept;
384
385 CommonOptionWithIntegerSelectorFieldClass<LibObjT, ConstUnsignedIntegerRangeSet>
386 asOptionWithUnsignedIntegerSelector() const noexcept;
387
388 CommonOptionWithIntegerSelectorFieldClass<LibObjT, ConstSignedIntegerRangeSet>
389 asOptionWithSignedIntegerSelector() const noexcept;
390
391 CommonVariantFieldClass<LibObjT> asVariant() const noexcept;
392 CommonVariantWithoutSelectorFieldClass<LibObjT> asVariantWithoutSelector() const noexcept;
cefe03a2 393 CommonVariantWithSelectorFieldClass<LibObjT> asVariantWithSelector() const noexcept;
12435a68
PP
394
395 CommonVariantWithIntegerSelectorFieldClass<
396 LibObjT, ConstVariantWithIntegerSelectorFieldClassOption<
397 const bt_field_class_variant_with_selector_field_integer_unsigned_option>>
398 asVariantWithUnsignedIntegerSelector() const noexcept;
399
400 CommonVariantWithIntegerSelectorFieldClass<
401 LibObjT, ConstVariantWithIntegerSelectorFieldClassOption<
402 const bt_field_class_variant_with_selector_field_integer_signed_option>>
403 asVariantWithSignedIntegerSelector() const noexcept;
404
405 template <typename LibValT>
b7ffa6f0 406 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
12435a68 407 {
5c895f64 408 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstFieldClass`.");
12435a68 409
341a67c4 410 bt_field_class_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr());
12435a68
PP
411 }
412
dcb8ae9b 413 UserAttributes userAttributes() const noexcept
12435a68
PP
414 {
415 return UserAttributes {
341a67c4 416 internal::CommonFieldClassSpec<LibObjT>::userAttributes(this->libObjPtr())};
12435a68
PP
417 }
418
419 Shared shared() const noexcept
420 {
c9c0b6e2 421 return Shared::createWithRef(*this);
12435a68
PP
422 }
423
424protected:
425 bool _libTypeIs(const bt_field_class_type type) const noexcept
426 {
341a67c4 427 return bt_field_class_type_is(bt_field_class_get_type(this->libObjPtr()), type);
12435a68
PP
428 }
429};
430
431using FieldClass = CommonFieldClass<bt_field_class>;
432using ConstFieldClass = CommonFieldClass<const bt_field_class>;
433
4927bae7
PP
434namespace internal {
435
436struct FieldClassTypeDescr
437{
438 using Const = ConstFieldClass;
439 using NonConst = FieldClass;
440};
441
442template <>
443struct TypeDescr<FieldClass> : public FieldClassTypeDescr
444{
445};
446
447template <>
448struct TypeDescr<ConstFieldClass> : public FieldClassTypeDescr
449{
450};
451
452} /* namespace internal */
453
12435a68
PP
454template <typename LibObjT>
455class CommonBitArrayFieldClass final : public CommonFieldClass<LibObjT>
456{
457private:
458 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
459 using typename CommonFieldClass<LibObjT>::_ThisCommonFieldClass;
460
461public:
26b9d24c 462 using Shared = SharedFieldClass<CommonBitArrayFieldClass<LibObjT>, LibObjT>;
12435a68
PP
463
464 explicit CommonBitArrayFieldClass(const _LibObjPtr libObjPtr) noexcept :
465 _ThisCommonFieldClass {libObjPtr}
466 {
467 BT_ASSERT_DBG(this->isBitArray());
468 }
469
470 template <typename OtherLibObjT>
100fa861 471 CommonBitArrayFieldClass(const CommonBitArrayFieldClass<OtherLibObjT> fc) noexcept :
12435a68
PP
472 _ThisCommonFieldClass {fc}
473 {
474 }
475
476 template <typename OtherLibObjT>
477 CommonBitArrayFieldClass<LibObjT>&
100fa861 478 operator=(const CommonBitArrayFieldClass<OtherLibObjT> fc) noexcept
12435a68
PP
479 {
480 _ThisCommonFieldClass::operator=(fc);
481 return *this;
482 }
483
328a274a
PP
484 CommonBitArrayFieldClass<const bt_field_class> asConst() const noexcept
485 {
486 return CommonBitArrayFieldClass<const bt_field_class> {*this};
487 }
488
12435a68
PP
489 std::uint64_t length() const noexcept
490 {
341a67c4 491 return bt_field_class_bit_array_get_length(this->libObjPtr());
12435a68
PP
492 }
493
494 Shared shared() const noexcept
495 {
c9c0b6e2 496 return Shared::createWithRef(*this);
12435a68
PP
497 }
498};
499
500using BitArrayFieldClass = CommonBitArrayFieldClass<bt_field_class>;
501using ConstBitArrayFieldClass = CommonBitArrayFieldClass<const bt_field_class>;
502
4927bae7
PP
503namespace internal {
504
505struct BitArrayFieldClassTypeDescr
506{
507 using Const = ConstBitArrayFieldClass;
508 using NonConst = BitArrayFieldClass;
509};
510
511template <>
512struct TypeDescr<BitArrayFieldClass> : public BitArrayFieldClassTypeDescr
513{
514};
515
516template <>
517struct TypeDescr<ConstBitArrayFieldClass> : public BitArrayFieldClassTypeDescr
518{
519};
520
521} /* namespace internal */
522
12435a68
PP
523enum class DisplayBase
524{
525 BINARY = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_BINARY,
526 OCTAL = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_OCTAL,
527 DECIMAL = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL,
528 HEXADECIMAL = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_HEXADECIMAL,
529};
530
531template <typename LibObjT>
532class CommonIntegerFieldClass : public CommonFieldClass<LibObjT>
533{
534private:
535 using typename CommonFieldClass<LibObjT>::_ThisCommonFieldClass;
536
537protected:
538 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
539 using _ThisCommonIntegerFieldClass = CommonIntegerFieldClass<LibObjT>;
540
541public:
26b9d24c 542 using Shared = SharedFieldClass<CommonIntegerFieldClass<LibObjT>, LibObjT>;
12435a68
PP
543
544 explicit CommonIntegerFieldClass(const _LibObjPtr libObjPtr) noexcept :
545 _ThisCommonFieldClass {libObjPtr}
546 {
547 BT_ASSERT_DBG(this->isInteger());
548 }
549
550 template <typename OtherLibObjT>
100fa861 551 CommonIntegerFieldClass(const CommonIntegerFieldClass<OtherLibObjT> fc) noexcept :
12435a68
PP
552 _ThisCommonFieldClass {fc}
553 {
554 }
555
556 template <typename OtherLibObjT>
100fa861 557 CommonIntegerFieldClass& operator=(const CommonIntegerFieldClass<OtherLibObjT> fc) noexcept
12435a68
PP
558 {
559 _ThisCommonFieldClass::operator=(fc);
560 return *this;
561 }
562
328a274a
PP
563 CommonIntegerFieldClass<const bt_field_class> asConst() const noexcept
564 {
565 return CommonIntegerFieldClass<const bt_field_class> {*this};
566 }
567
dcb8ae9b 568 void fieldValueRange(const std::uint64_t n) const noexcept
12435a68 569 {
5c895f64
PP
570 static_assert(!std::is_const<LibObjT>::value,
571 "Not available with `bt2::ConstIntegerFieldClass`.");
12435a68 572
78017fef 573 bt_field_class_integer_set_field_value_range(this->libObjPtr(), n);
12435a68
PP
574 }
575
576 std::uint64_t fieldValueRange() const noexcept
577 {
341a67c4 578 return bt_field_class_integer_get_field_value_range(this->libObjPtr());
12435a68
PP
579 }
580
dcb8ae9b 581 void preferredDisplayBase(const DisplayBase base) const noexcept
12435a68 582 {
5c895f64
PP
583 static_assert(!std::is_const<LibObjT>::value,
584 "Not available with `bt2::ConstIntegerFieldClass`.");
12435a68
PP
585
586 bt_field_class_integer_set_preferred_display_base(
341a67c4 587 this->libObjPtr(), static_cast<bt_field_class_integer_preferred_display_base>(base));
12435a68
PP
588 }
589
590 DisplayBase preferredDisplayBase() const noexcept
591 {
592 return static_cast<DisplayBase>(
341a67c4 593 bt_field_class_integer_get_preferred_display_base(this->libObjPtr()));
12435a68
PP
594 }
595
596 Shared shared() const noexcept
597 {
c9c0b6e2 598 return Shared::createWithRef(*this);
12435a68
PP
599 }
600};
601
602using IntegerFieldClass = CommonIntegerFieldClass<bt_field_class>;
603using ConstIntegerFieldClass = CommonIntegerFieldClass<const bt_field_class>;
604
605namespace internal {
606
4927bae7
PP
607struct IntegerFieldClassTypeDescr
608{
609 using Const = ConstIntegerFieldClass;
610 using NonConst = IntegerFieldClass;
611};
612
613template <>
614struct TypeDescr<IntegerFieldClass> : public IntegerFieldClassTypeDescr
615{
616};
617
618template <>
619struct TypeDescr<ConstIntegerFieldClass> : public IntegerFieldClassTypeDescr
620{
621};
622
623} /* namespace internal */
624
625namespace internal {
626
12435a68
PP
627template <typename LibObjT>
628struct ConstEnumerationFieldClassMappingSpec;
629
b5f55e9f 630/* Functions specific to unsigned enumeration field class mappings */
12435a68
PP
631template <>
632struct ConstEnumerationFieldClassMappingSpec<const bt_field_class_enumeration_unsigned_mapping>
633 final
634{
635 static const bt_integer_range_set_unsigned *
636 ranges(const bt_field_class_enumeration_unsigned_mapping * const libObjPtr) noexcept
637 {
638 return bt_field_class_enumeration_unsigned_mapping_borrow_ranges_const(libObjPtr);
639 }
640
641 static const char *
642 label(const bt_field_class_enumeration_unsigned_mapping * const libObjPtr) noexcept
643 {
644 return bt_field_class_enumeration_mapping_get_label(
645 bt_field_class_enumeration_unsigned_mapping_as_mapping_const(libObjPtr));
646 }
647};
648
b5f55e9f 649/* Functions specific to signed enumeration field class mappings */
12435a68
PP
650template <>
651struct ConstEnumerationFieldClassMappingSpec<const bt_field_class_enumeration_signed_mapping> final
652{
653 static const bt_integer_range_set_signed *
654 ranges(const bt_field_class_enumeration_signed_mapping * const libObjPtr) noexcept
655 {
656 return bt_field_class_enumeration_signed_mapping_borrow_ranges_const(libObjPtr);
657 }
658
659 static const char *
660 label(const bt_field_class_enumeration_signed_mapping * const libObjPtr) noexcept
661 {
662 return bt_field_class_enumeration_mapping_get_label(
663 bt_field_class_enumeration_signed_mapping_as_mapping_const(libObjPtr));
664 }
665};
666
b5f55e9f 667} /* namespace internal */
12435a68
PP
668
669template <typename LibObjT>
0d218157 670class ConstEnumerationFieldClassMapping final : public BorrowedObject<LibObjT>
12435a68
PP
671{
672private:
0d218157
PP
673 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
674 using typename BorrowedObject<LibObjT>::_LibObjPtr;
12435a68
PP
675
676public:
677 using RangeSet = typename std::conditional<
678 std::is_same<LibObjT, const bt_field_class_enumeration_unsigned_mapping>::value,
679 ConstUnsignedIntegerRangeSet, ConstSignedIntegerRangeSet>::type;
680
681 explicit ConstEnumerationFieldClassMapping(const _LibObjPtr libObjPtr) noexcept :
0d218157 682 _ThisBorrowedObject {libObjPtr}
12435a68
PP
683 {
684 }
685
0d6ad4d8 686 ConstEnumerationFieldClassMapping(const ConstEnumerationFieldClassMapping& mapping) noexcept :
0d218157 687 _ThisBorrowedObject {mapping}
12435a68
PP
688 {
689 }
690
0d6ad4d8
FD
691 ConstEnumerationFieldClassMapping&
692 operator=(const ConstEnumerationFieldClassMapping& mapping) noexcept
12435a68 693 {
0d218157 694 _ThisBorrowedObject::operator=(mapping);
12435a68
PP
695 return *this;
696 }
697
698 RangeSet ranges() const noexcept
699 {
700 return RangeSet {
341a67c4 701 internal::ConstEnumerationFieldClassMappingSpec<LibObjT>::ranges(this->libObjPtr())};
12435a68
PP
702 }
703
704 bpstd::string_view label() const noexcept
705 {
341a67c4 706 return internal::ConstEnumerationFieldClassMappingSpec<LibObjT>::label(this->libObjPtr());
12435a68
PP
707 }
708};
709
710using ConstUnsignedEnumerationFieldClassMapping =
711 ConstEnumerationFieldClassMapping<const bt_field_class_enumeration_unsigned_mapping>;
712
713using ConstSignedEnumerationFieldClassMapping =
714 ConstEnumerationFieldClassMapping<const bt_field_class_enumeration_signed_mapping>;
715
716namespace internal {
717
718template <typename MappingT>
719struct CommonEnumerationFieldClassSpec;
720
b5f55e9f 721/* Functions specific to unsigned enumeration field classes */
12435a68
PP
722template <>
723struct CommonEnumerationFieldClassSpec<ConstUnsignedEnumerationFieldClassMapping> final
724{
725 static const bt_field_class_enumeration_unsigned_mapping *
726 mappingByIndex(const bt_field_class * const libObjPtr, const std::uint64_t index) noexcept
727 {
728 return bt_field_class_enumeration_unsigned_borrow_mapping_by_index_const(libObjPtr, index);
729 }
730
731 static const bt_field_class_enumeration_unsigned_mapping *
732 mappingByLabel(const bt_field_class * const libObjPtr, const char * const label) noexcept
733 {
734 return bt_field_class_enumeration_unsigned_borrow_mapping_by_label_const(libObjPtr, label);
735 }
5d6ccdae
PP
736
737 static bt_field_class_enumeration_add_mapping_status
738 addMapping(bt_field_class * const libObjPtr, const char * const label,
739 const bt_integer_range_set_unsigned * const libRanges) noexcept
740 {
741 return bt_field_class_enumeration_unsigned_add_mapping(libObjPtr, label, libRanges);
742 }
12435a68
PP
743};
744
b5f55e9f 745/* Functions specific to signed enumeration field classes */
12435a68
PP
746template <>
747struct CommonEnumerationFieldClassSpec<ConstSignedEnumerationFieldClassMapping> final
748{
749 static const bt_field_class_enumeration_signed_mapping *
750 mappingByIndex(const bt_field_class * const libObjPtr, const std::uint64_t index) noexcept
751 {
752 return bt_field_class_enumeration_signed_borrow_mapping_by_index_const(libObjPtr, index);
753 }
754
755 static const bt_field_class_enumeration_signed_mapping *
756 mappingByLabel(const bt_field_class * const libObjPtr, const char * const label) noexcept
757 {
758 return bt_field_class_enumeration_signed_borrow_mapping_by_label_const(libObjPtr, label);
759 }
5d6ccdae
PP
760
761 static bt_field_class_enumeration_add_mapping_status
762 addMapping(bt_field_class * const libObjPtr, const char * const label,
763 const bt_integer_range_set_signed * const libRanges) noexcept
764 {
765 return bt_field_class_enumeration_signed_add_mapping(libObjPtr, label, libRanges);
766 }
12435a68
PP
767};
768
b5f55e9f 769} /* namespace internal */
12435a68 770
be6aa636
FD
771template <typename LibObjT>
772class CommonBaseEnumerationFieldClass : public CommonIntegerFieldClass<LibObjT>
773{
774private:
775 using typename CommonIntegerFieldClass<LibObjT>::_ThisCommonIntegerFieldClass;
776
777protected:
778 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
779 using _ThisCommonBaseEnumerationFieldClass = CommonBaseEnumerationFieldClass<LibObjT>;
780
781public:
26b9d24c 782 using Shared = SharedFieldClass<_ThisCommonBaseEnumerationFieldClass, LibObjT>;
be6aa636
FD
783
784 explicit CommonBaseEnumerationFieldClass(const _LibObjPtr libObjPtr) noexcept :
785 _ThisCommonIntegerFieldClass {libObjPtr}
786 {
787 BT_ASSERT_DBG(this->isEnumeration());
788 }
789
790 template <typename OtherLibObjT>
100fa861
PP
791 CommonBaseEnumerationFieldClass(const CommonBaseEnumerationFieldClass<OtherLibObjT> fc) noexcept
792 :
be6aa636
FD
793 _ThisCommonIntegerFieldClass {fc}
794 {
795 }
796
797 template <typename OtherLibObjT>
0d6ad4d8 798 CommonBaseEnumerationFieldClass&
100fa861 799 operator=(const CommonBaseEnumerationFieldClass<OtherLibObjT> fc) noexcept
be6aa636
FD
800 {
801 _ThisCommonIntegerFieldClass::operator=(fc);
802 return *this;
803 }
804
328a274a
PP
805 CommonBaseEnumerationFieldClass<const bt_field_class> asConst() const noexcept
806 {
807 return CommonBaseEnumerationFieldClass<const bt_field_class> {*this};
808 }
809
c0b73c63 810 std::uint64_t length() const noexcept
be6aa636 811 {
341a67c4 812 return bt_field_class_enumeration_get_mapping_count(this->libObjPtr());
be6aa636
FD
813 }
814
815 Shared shared() const noexcept
816 {
c9c0b6e2 817 return Shared::createWithRef(*this);
be6aa636
FD
818 }
819};
820
12435a68 821template <typename LibObjT, typename MappingT>
be6aa636 822class CommonEnumerationFieldClass final : public CommonBaseEnumerationFieldClass<LibObjT>
12435a68
PP
823{
824private:
825 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
be6aa636 826 using typename CommonBaseEnumerationFieldClass<LibObjT>::_ThisCommonBaseEnumerationFieldClass;
12435a68
PP
827 using _ThisCommonEnumerationFieldClass = CommonEnumerationFieldClass<LibObjT, MappingT>;
828
829public:
26b9d24c 830 using Shared = SharedFieldClass<_ThisCommonEnumerationFieldClass, LibObjT>;
e5a8a7c4 831 using Iterator = CommonIterator<CommonEnumerationFieldClass, MappingT>;
12435a68
PP
832 using Mapping = MappingT;
833
834 explicit CommonEnumerationFieldClass(const _LibObjPtr libObjPtr) noexcept :
be6aa636 835 _ThisCommonBaseEnumerationFieldClass {libObjPtr}
12435a68
PP
836 {
837 BT_ASSERT_DBG(this->isEnumeration());
838 }
839
840 template <typename OtherLibObjT>
841 CommonEnumerationFieldClass(
100fa861 842 const CommonEnumerationFieldClass<OtherLibObjT, MappingT> fc) noexcept :
be6aa636 843 _ThisCommonEnumerationFieldClass {fc}
12435a68
PP
844 {
845 }
846
847 template <typename OtherLibObjT>
0d6ad4d8 848 CommonEnumerationFieldClass&
100fa861 849 operator=(const CommonEnumerationFieldClass<OtherLibObjT, MappingT> fc) noexcept
12435a68 850 {
be6aa636 851 _ThisCommonEnumerationFieldClass::operator=(fc);
12435a68
PP
852 return *this;
853 }
854
12435a68
PP
855 Mapping operator[](const std::uint64_t index) const noexcept
856 {
857 return Mapping {internal::CommonEnumerationFieldClassSpec<MappingT>::mappingByIndex(
341a67c4 858 this->libObjPtr(), index)};
12435a68
PP
859 }
860
861 nonstd::optional<Mapping> operator[](const char * const label) const noexcept
862 {
863 const auto libObjPtr = internal::CommonEnumerationFieldClassSpec<MappingT>::mappingByLabel(
341a67c4 864 this->libObjPtr(), label);
12435a68
PP
865
866 if (libObjPtr) {
867 return Mapping {libObjPtr};
868 }
869
870 return nonstd::nullopt;
871 }
872
873 nonstd::optional<Mapping> operator[](const std::string& label) const noexcept
874 {
875 return (*this)[label.data()];
876 }
877
dcb8ae9b 878 void addMapping(const char * const label, const typename Mapping::RangeSet ranges) const
5d6ccdae
PP
879 {
880 const auto status = internal::CommonEnumerationFieldClassSpec<MappingT>::addMapping(
881 this->libObjPtr(), label, ranges.libObjPtr());
882
883 if (status == BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_MEMORY_ERROR) {
39278ebc 884 throw MemoryError {};
5d6ccdae
PP
885 }
886 }
887
dcb8ae9b 888 void addMapping(const std::string& label, const typename Mapping::RangeSet ranges) const
5d6ccdae
PP
889 {
890 this->addMapping(label.data(), ranges);
891 }
892
e5a8a7c4
FD
893 Iterator begin() const noexcept
894 {
895 return Iterator {*this, 0};
896 }
897
898 Iterator end() const noexcept
899 {
c0b73c63 900 return Iterator {*this, this->length()};
e5a8a7c4
FD
901 }
902
12435a68
PP
903 Shared shared() const noexcept
904 {
c9c0b6e2 905 return Shared::createWithRef(*this);
12435a68
PP
906 }
907};
908
be6aa636
FD
909using EnumerationFieldClass = CommonBaseEnumerationFieldClass<bt_field_class>;
910using ConstEnumerationFieldClass = CommonBaseEnumerationFieldClass<const bt_field_class>;
911
12435a68
PP
912using UnsignedEnumerationFieldClass =
913 CommonEnumerationFieldClass<bt_field_class, ConstUnsignedEnumerationFieldClassMapping>;
914
915using ConstUnsignedEnumerationFieldClass =
916 CommonEnumerationFieldClass<const bt_field_class, ConstUnsignedEnumerationFieldClassMapping>;
917
918using SignedEnumerationFieldClass =
919 CommonEnumerationFieldClass<bt_field_class, ConstSignedEnumerationFieldClassMapping>;
920
921using ConstSignedEnumerationFieldClass =
922 CommonEnumerationFieldClass<const bt_field_class, ConstSignedEnumerationFieldClassMapping>;
923
924namespace internal {
925
4927bae7
PP
926struct UnsignedEnumerationFieldClassTypeDescr
927{
928 using Const = ConstUnsignedEnumerationFieldClass;
929 using NonConst = UnsignedEnumerationFieldClass;
930};
931
932template <>
933struct TypeDescr<UnsignedEnumerationFieldClass> : public UnsignedEnumerationFieldClassTypeDescr
934{
935};
936
937template <>
938struct TypeDescr<ConstUnsignedEnumerationFieldClass> : public UnsignedEnumerationFieldClassTypeDescr
939{
940};
941
942struct SignedEnumerationFieldClassTypeDescr
943{
944 using Const = ConstSignedEnumerationFieldClass;
945 using NonConst = SignedEnumerationFieldClass;
946};
947
948template <>
949struct TypeDescr<SignedEnumerationFieldClass> : public SignedEnumerationFieldClassTypeDescr
950{
951};
952
953template <>
954struct TypeDescr<ConstSignedEnumerationFieldClass> : public SignedEnumerationFieldClassTypeDescr
955{
956};
957
12435a68
PP
958template <typename LibObjT>
959struct CommonStructureFieldClassMemberSpec;
960
b5f55e9f 961/* Functions specific to mutable structure field class members */
12435a68
PP
962template <>
963struct CommonStructureFieldClassMemberSpec<bt_field_class_structure_member> final
964{
965 static bt_field_class *fieldClass(bt_field_class_structure_member * const libObjPtr) noexcept
966 {
967 return bt_field_class_structure_member_borrow_field_class(libObjPtr);
968 }
8e557120
PP
969
970 static bt_value *userAttributes(bt_field_class_structure_member * const libObjPtr) noexcept
971 {
972 return bt_field_class_structure_member_borrow_user_attributes(libObjPtr);
973 }
12435a68
PP
974};
975
b5f55e9f 976/* Functions specific to constant structure field class members */
12435a68
PP
977template <>
978struct CommonStructureFieldClassMemberSpec<const bt_field_class_structure_member> final
979{
980 static const bt_field_class *
981 fieldClass(const bt_field_class_structure_member * const libObjPtr) noexcept
982 {
983 return bt_field_class_structure_member_borrow_field_class_const(libObjPtr);
984 }
8e557120
PP
985
986 static const bt_value *
987 userAttributes(const bt_field_class_structure_member * const libObjPtr) noexcept
988 {
989 return bt_field_class_structure_member_borrow_user_attributes_const(libObjPtr);
990 }
12435a68
PP
991};
992
b5f55e9f 993} /* namespace internal */
12435a68
PP
994
995template <typename LibObjT>
0d218157 996class CommonStructureFieldClassMember final : public BorrowedObject<LibObjT>
12435a68
PP
997{
998private:
0d218157
PP
999 using typename BorrowedObject<LibObjT>::_LibObjPtr;
1000 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
12435a68
PP
1001
1002 using _FieldClass =
1003 typename std::conditional<std::is_const<LibObjT>::value, ConstFieldClass, FieldClass>::type;
1004
1005public:
8e557120
PP
1006 using UserAttributes =
1007 typename std::conditional<std::is_const<LibObjT>::value, ConstMapValue, MapValue>::type;
1008
12435a68 1009 explicit CommonStructureFieldClassMember(const _LibObjPtr libObjPtr) noexcept :
0d218157 1010 _ThisBorrowedObject {libObjPtr}
12435a68
PP
1011 {
1012 }
1013
1014 template <typename OtherLibObjT>
100fa861
PP
1015 CommonStructureFieldClassMember(const CommonStructureFieldClassMember<OtherLibObjT> fc) noexcept
1016 :
0d218157 1017 _ThisBorrowedObject {fc}
12435a68
PP
1018 {
1019 }
1020
1021 template <typename OtherLibObjT>
1022 CommonStructureFieldClassMember<LibObjT>&
100fa861 1023 operator=(const CommonStructureFieldClassMember<OtherLibObjT> fc) noexcept
12435a68 1024 {
0d218157 1025 _ThisBorrowedObject::operator=(fc);
12435a68
PP
1026 return *this;
1027 }
1028
328a274a
PP
1029 CommonStructureFieldClassMember<const bt_field_class_structure_member> asConst() const noexcept
1030 {
1031 return CommonStructureFieldClassMember<const bt_field_class_structure_member> {*this};
1032 }
1033
12435a68
PP
1034 bpstd::string_view name() const noexcept
1035 {
341a67c4 1036 return bt_field_class_structure_member_get_name(this->libObjPtr());
12435a68
PP
1037 }
1038
dcb8ae9b 1039 _FieldClass fieldClass() const noexcept
12435a68
PP
1040 {
1041 return _FieldClass {
341a67c4 1042 internal::CommonStructureFieldClassMemberSpec<LibObjT>::fieldClass(this->libObjPtr())};
12435a68 1043 }
8e557120
PP
1044
1045 template <typename LibValT>
b7ffa6f0 1046 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
8e557120 1047 {
5c895f64
PP
1048 static_assert(!std::is_const<LibObjT>::value,
1049 "Not available with `bt2::ConstStructureFieldClassMember`.");
8e557120
PP
1050
1051 bt_field_class_structure_member_set_user_attributes(this->libObjPtr(),
1052 userAttrs.libObjPtr());
1053 }
1054
dcb8ae9b 1055 UserAttributes userAttributes() const noexcept
8e557120
PP
1056 {
1057 return UserAttributes {
1058 internal::CommonStructureFieldClassMemberSpec<LibObjT>::userAttributes(
1059 this->libObjPtr())};
1060 }
12435a68
PP
1061};
1062
1063using StructureFieldClassMember = CommonStructureFieldClassMember<bt_field_class_structure_member>;
1064
1065using ConstStructureFieldClassMember =
1066 CommonStructureFieldClassMember<const bt_field_class_structure_member>;
1067
1068namespace internal {
1069
4927bae7
PP
1070struct StructureFieldClassMemberTypeDescr
1071{
1072 using Const = ConstStructureFieldClassMember;
1073 using NonConst = StructureFieldClassMember;
1074};
1075
1076template <>
1077struct TypeDescr<StructureFieldClassMember> : public StructureFieldClassMemberTypeDescr
1078{
1079};
1080
1081template <>
1082struct TypeDescr<ConstStructureFieldClassMember> : public StructureFieldClassMemberTypeDescr
1083{
1084};
1085
12435a68
PP
1086template <typename LibObjT>
1087struct CommonStructureFieldClassSpec;
1088
b5f55e9f 1089/* Functions specific to mutable structure field classes */
12435a68
PP
1090template <>
1091struct CommonStructureFieldClassSpec<bt_field_class> final
1092{
1093 static bt_field_class_structure_member *memberByIndex(bt_field_class * const libObjPtr,
1094 const std::uint64_t index) noexcept
1095 {
1096 return bt_field_class_structure_borrow_member_by_index(libObjPtr, index);
1097 }
1098
1099 static bt_field_class_structure_member *memberByName(bt_field_class * const libObjPtr,
1100 const char * const name) noexcept
1101 {
1102 return bt_field_class_structure_borrow_member_by_name(libObjPtr, name);
1103 }
1104};
1105
b5f55e9f 1106/* Functions specific to constant structure field classes */
12435a68
PP
1107template <>
1108struct CommonStructureFieldClassSpec<const bt_field_class> final
1109{
1110 static const bt_field_class_structure_member *
1111 memberByIndex(const bt_field_class * const libObjPtr, const std::uint64_t index) noexcept
1112 {
1113 return bt_field_class_structure_borrow_member_by_index_const(libObjPtr, index);
1114 }
1115
1116 static const bt_field_class_structure_member *
1117 memberByName(const bt_field_class * const libObjPtr, const char * const name) noexcept
1118 {
1119 return bt_field_class_structure_borrow_member_by_name_const(libObjPtr, name);
1120 }
1121};
1122
b5f55e9f 1123} /* namespace internal */
12435a68
PP
1124
1125template <typename LibObjT>
1126class CommonStructureFieldClass final : public CommonFieldClass<LibObjT>
1127{
1128private:
1129 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
1130 using typename CommonFieldClass<LibObjT>::_ThisCommonFieldClass;
1131
1132public:
26b9d24c 1133 using Shared = SharedFieldClass<CommonStructureFieldClass<LibObjT>, LibObjT>;
12435a68
PP
1134 using Member =
1135 typename std::conditional<std::is_const<LibObjT>::value, ConstStructureFieldClassMember,
1136 StructureFieldClassMember>::type;
1137
5046c776
FD
1138 using Iterator = CommonIterator<CommonStructureFieldClass<LibObjT>, Member>;
1139
12435a68
PP
1140 explicit CommonStructureFieldClass(const _LibObjPtr libObjPtr) noexcept :
1141 _ThisCommonFieldClass {libObjPtr}
1142 {
1143 BT_ASSERT_DBG(this->isStructure());
1144 }
1145
1146 template <typename OtherLibObjT>
100fa861 1147 CommonStructureFieldClass(const CommonStructureFieldClass<OtherLibObjT> fc) noexcept :
12435a68
PP
1148 _ThisCommonFieldClass {fc}
1149 {
1150 }
1151
1152 template <typename OtherLibObjT>
100fa861 1153 CommonStructureFieldClass& operator=(const CommonStructureFieldClass<OtherLibObjT> fc) noexcept
12435a68
PP
1154 {
1155 _ThisCommonFieldClass::operator=(fc);
1156 return *this;
1157 }
1158
328a274a
PP
1159 CommonStructureFieldClass<const bt_field_class> asConst() const noexcept
1160 {
1161 return CommonStructureFieldClass<const bt_field_class> {*this};
1162 }
1163
dcb8ae9b 1164 void appendMember(const char * const name, const FieldClass fc) const
12435a68 1165 {
5c895f64
PP
1166 static_assert(!std::is_const<LibObjT>::value,
1167 "Not available with `bt2::ConstStructureFieldClass`.");
12435a68
PP
1168
1169 const auto status =
341a67c4 1170 bt_field_class_structure_append_member(this->libObjPtr(), name, fc.libObjPtr());
12435a68
PP
1171
1172 if (status == BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_MEMORY_ERROR) {
39278ebc 1173 throw MemoryError {};
12435a68
PP
1174 }
1175 }
1176
dcb8ae9b 1177 void appendMember(const std::string& name, const FieldClass fc) const
12435a68
PP
1178 {
1179 this->appendMember(name.data(), fc);
1180 }
1181
c0b73c63 1182 std::uint64_t length() const noexcept
12435a68 1183 {
341a67c4 1184 return bt_field_class_structure_get_member_count(this->libObjPtr());
12435a68
PP
1185 }
1186
5046c776
FD
1187 Iterator begin() const noexcept
1188 {
1189 return Iterator {*this, 0};
1190 }
1191
1192 Iterator end() const noexcept
1193 {
c0b73c63 1194 return Iterator {*this, this->length()};
5046c776
FD
1195 }
1196
dcb8ae9b 1197 Member operator[](const std::uint64_t index) const noexcept
12435a68
PP
1198 {
1199 return Member {internal::CommonStructureFieldClassSpec<LibObjT>::memberByIndex(
341a67c4 1200 this->libObjPtr(), index)};
12435a68
PP
1201 }
1202
dcb8ae9b 1203 nonstd::optional<Member> operator[](const char * const name) const noexcept
12435a68 1204 {
341a67c4
FD
1205 const auto libObjPtr =
1206 internal::CommonStructureFieldClassSpec<LibObjT>::memberByName(this->libObjPtr(), name);
12435a68
PP
1207
1208 if (libObjPtr) {
1209 return Member {libObjPtr};
1210 }
1211
1212 return nonstd::nullopt;
1213 }
1214
dcb8ae9b 1215 nonstd::optional<Member> operator[](const std::string& name) const noexcept
12435a68
PP
1216 {
1217 return (*this)[name.data()];
1218 }
1219
1220 Shared shared() const noexcept
1221 {
c9c0b6e2 1222 return Shared::createWithRef(*this);
12435a68
PP
1223 }
1224};
1225
1226using StructureFieldClass = CommonStructureFieldClass<bt_field_class>;
1227using ConstStructureFieldClass = CommonStructureFieldClass<const bt_field_class>;
1228
1229namespace internal {
1230
4927bae7
PP
1231struct StructureFieldClassTypeDescr
1232{
1233 using Const = ConstStructureFieldClass;
1234 using NonConst = StructureFieldClass;
1235};
1236
1237template <>
1238struct TypeDescr<StructureFieldClass> : public StructureFieldClassTypeDescr
1239{
1240};
1241
1242template <>
1243struct TypeDescr<ConstStructureFieldClass> : public StructureFieldClassTypeDescr
1244{
1245};
1246
12435a68
PP
1247template <typename LibObjT>
1248struct CommonArrayFieldClassSpec;
1249
b5f55e9f 1250/* Functions specific to mutable array field classes */
12435a68
PP
1251template <>
1252struct CommonArrayFieldClassSpec<bt_field_class> final
1253{
1254 static bt_field_class *elementFieldClass(bt_field_class * const libObjPtr) noexcept
1255 {
1256 return bt_field_class_array_borrow_element_field_class(libObjPtr);
1257 }
1258};
1259
b5f55e9f 1260/* Functions specific to constant array field classes */
12435a68
PP
1261template <>
1262struct CommonArrayFieldClassSpec<const bt_field_class> final
1263{
1264 static const bt_field_class *elementFieldClass(const bt_field_class * const libObjPtr) noexcept
1265 {
1266 return bt_field_class_array_borrow_element_field_class_const(libObjPtr);
1267 }
1268};
1269
b5f55e9f 1270} /* namespace internal */
12435a68
PP
1271
1272template <typename LibObjT>
1273class CommonArrayFieldClass : public CommonFieldClass<LibObjT>
1274{
1275private:
1276 using typename CommonFieldClass<LibObjT>::_ThisCommonFieldClass;
1277
1278 using _FieldClass =
1279 typename std::conditional<std::is_const<LibObjT>::value, ConstFieldClass, FieldClass>::type;
1280
1281protected:
1282 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
1283 using _ThisCommonArrayFieldClass = CommonArrayFieldClass<LibObjT>;
1284
1285public:
26b9d24c 1286 using Shared = SharedFieldClass<CommonArrayFieldClass<LibObjT>, LibObjT>;
12435a68
PP
1287
1288 explicit CommonArrayFieldClass(const _LibObjPtr libObjPtr) noexcept :
1289 _ThisCommonFieldClass {libObjPtr}
1290 {
1291 BT_ASSERT_DBG(this->isArray());
1292 }
1293
1294 template <typename OtherLibObjT>
100fa861 1295 CommonArrayFieldClass(const CommonArrayFieldClass<OtherLibObjT> fc) noexcept :
12435a68
PP
1296 _ThisCommonFieldClass {fc}
1297 {
1298 }
1299
1300 template <typename OtherLibObjT>
100fa861 1301 CommonArrayFieldClass& operator=(const CommonArrayFieldClass<OtherLibObjT> fc) noexcept
12435a68
PP
1302 {
1303 _ThisCommonFieldClass::operator=(fc);
1304 return *this;
1305 }
1306
328a274a
PP
1307 CommonArrayFieldClass<const bt_field_class> asConst() const noexcept
1308 {
1309 return CommonArrayFieldClass<const bt_field_class> {*this};
1310 }
1311
dcb8ae9b 1312 _FieldClass elementFieldClass() const noexcept
12435a68
PP
1313 {
1314 return _FieldClass {
341a67c4 1315 internal::CommonArrayFieldClassSpec<LibObjT>::elementFieldClass(this->libObjPtr())};
12435a68
PP
1316 }
1317
1318 Shared shared() const noexcept
1319 {
c9c0b6e2 1320 return Shared::createWithRef(*this);
12435a68
PP
1321 }
1322};
1323
1324using ArrayFieldClass = CommonArrayFieldClass<bt_field_class>;
1325using ConstArrayFieldClass = CommonArrayFieldClass<const bt_field_class>;
1326
4927bae7
PP
1327namespace internal {
1328
1329struct ArrayFieldClassTypeDescr
1330{
1331 using Const = ConstArrayFieldClass;
1332 using NonConst = ArrayFieldClass;
1333};
1334
1335template <>
1336struct TypeDescr<ArrayFieldClass> : public ArrayFieldClassTypeDescr
1337{
1338};
1339
1340template <>
1341struct TypeDescr<ConstArrayFieldClass> : public ArrayFieldClassTypeDescr
1342{
1343};
1344
1345} /* namespace internal */
1346
12435a68
PP
1347template <typename LibObjT>
1348class CommonStaticArrayFieldClass final : public CommonArrayFieldClass<LibObjT>
1349{
1350private:
1351 using typename CommonArrayFieldClass<LibObjT>::_ThisCommonArrayFieldClass;
1352 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
1353
1354public:
26b9d24c 1355 using Shared = SharedFieldClass<CommonStaticArrayFieldClass<LibObjT>, LibObjT>;
12435a68
PP
1356
1357 explicit CommonStaticArrayFieldClass(const _LibObjPtr libObjPtr) noexcept :
1358 _ThisCommonArrayFieldClass {libObjPtr}
1359 {
1360 BT_ASSERT_DBG(this->isStaticArray());
1361 }
1362
1363 template <typename OtherLibObjT>
100fa861 1364 CommonStaticArrayFieldClass(const CommonStaticArrayFieldClass<OtherLibObjT> fc) noexcept :
12435a68
PP
1365 _ThisCommonArrayFieldClass {fc}
1366 {
1367 }
1368
1369 template <typename OtherLibObjT>
0d6ad4d8 1370 CommonStaticArrayFieldClass&
100fa861 1371 operator=(const CommonStaticArrayFieldClass<OtherLibObjT> fc) noexcept
12435a68
PP
1372 {
1373 _ThisCommonArrayFieldClass::operator=(fc);
1374 return *this;
1375 }
1376
328a274a
PP
1377 CommonStaticArrayFieldClass<const bt_field_class> asConst() const noexcept
1378 {
1379 return CommonStaticArrayFieldClass<const bt_field_class> {*this};
1380 }
1381
12435a68
PP
1382 std::uint64_t length() const noexcept
1383 {
341a67c4 1384 return bt_field_class_array_static_get_length(this->libObjPtr());
12435a68
PP
1385 }
1386
1387 Shared shared() const noexcept
1388 {
c9c0b6e2 1389 return Shared::createWithRef(*this);
12435a68
PP
1390 }
1391};
1392
1393using StaticArrayFieldClass = CommonStaticArrayFieldClass<bt_field_class>;
1394using ConstStaticArrayFieldClass = CommonStaticArrayFieldClass<const bt_field_class>;
1395
4927bae7
PP
1396namespace internal {
1397
1398struct StaticArrayFieldClassTypeDescr
1399{
1400 using Const = ConstStaticArrayFieldClass;
1401 using NonConst = StaticArrayFieldClass;
1402};
1403
1404template <>
1405struct TypeDescr<StaticArrayFieldClass> : public StaticArrayFieldClassTypeDescr
1406{
1407};
1408
1409template <>
1410struct TypeDescr<ConstStaticArrayFieldClass> : public StaticArrayFieldClassTypeDescr
1411{
1412};
1413
1414} /* namespace internal */
1415
12435a68
PP
1416template <typename LibObjT>
1417class CommonDynamicArrayWithLengthFieldClass final : public CommonArrayFieldClass<LibObjT>
1418{
1419private:
1420 using typename CommonArrayFieldClass<LibObjT>::_ThisCommonArrayFieldClass;
1421 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
1422
1423public:
26b9d24c 1424 using Shared = SharedFieldClass<CommonDynamicArrayWithLengthFieldClass<LibObjT>, LibObjT>;
12435a68
PP
1425
1426 explicit CommonDynamicArrayWithLengthFieldClass(const _LibObjPtr libObjPtr) noexcept :
1427 _ThisCommonArrayFieldClass {libObjPtr}
1428 {
1429 BT_ASSERT_DBG(this->isDynamicArrayWithLength());
1430 }
1431
1432 template <typename OtherLibObjT>
1433 CommonDynamicArrayWithLengthFieldClass(
100fa861 1434 const CommonDynamicArrayWithLengthFieldClass<OtherLibObjT> fc) noexcept :
12435a68
PP
1435 _ThisCommonArrayFieldClass {fc}
1436 {
1437 }
1438
1439 template <typename OtherLibObjT>
0d6ad4d8 1440 CommonDynamicArrayWithLengthFieldClass&
100fa861 1441 operator=(const CommonDynamicArrayWithLengthFieldClass<OtherLibObjT> fc) noexcept
12435a68
PP
1442 {
1443 _ThisCommonArrayFieldClass::operator=(fc);
1444 return *this;
1445 }
1446
328a274a
PP
1447 CommonDynamicArrayWithLengthFieldClass<const bt_field_class> asConst() const noexcept
1448 {
1449 return CommonDynamicArrayWithLengthFieldClass<const bt_field_class> {*this};
1450 }
1451
12435a68
PP
1452 ConstFieldPath lengthFieldPath() const noexcept
1453 {
1454 return ConstFieldPath {
1455 bt_field_class_array_dynamic_with_length_field_borrow_length_field_path_const(
341a67c4 1456 this->libObjPtr())};
12435a68
PP
1457 }
1458
1459 Shared shared() const noexcept
1460 {
c9c0b6e2 1461 return Shared::createWithRef(*this);
12435a68
PP
1462 }
1463};
1464
1465using DynamicArrayWithLengthFieldClass = CommonDynamicArrayWithLengthFieldClass<bt_field_class>;
1466
1467using ConstDynamicArrayWithLengthFieldClass =
1468 CommonDynamicArrayWithLengthFieldClass<const bt_field_class>;
1469
1470namespace internal {
1471
4927bae7
PP
1472struct DynamicArrayWithLengthFieldClassTypeDescr
1473{
1474 using Const = ConstDynamicArrayWithLengthFieldClass;
1475 using NonConst = DynamicArrayWithLengthFieldClass;
1476};
1477
1478template <>
1479struct TypeDescr<DynamicArrayWithLengthFieldClass> :
1480 public DynamicArrayWithLengthFieldClassTypeDescr
1481{
1482};
1483
1484template <>
1485struct TypeDescr<ConstDynamicArrayWithLengthFieldClass> :
1486 public DynamicArrayWithLengthFieldClassTypeDescr
1487{
1488};
1489
12435a68
PP
1490template <typename LibObjT>
1491struct CommonOptionFieldClassSpec;
1492
b5f55e9f 1493/* Functions specific to mutable option field classes */
12435a68
PP
1494template <>
1495struct CommonOptionFieldClassSpec<bt_field_class> final
1496{
1497 static bt_field_class *fieldClass(bt_field_class * const libObjPtr) noexcept
1498 {
1499 return bt_field_class_option_borrow_field_class(libObjPtr);
1500 }
1501};
1502
b5f55e9f 1503/* Functions specific to constant option field classes */
12435a68
PP
1504template <>
1505struct CommonOptionFieldClassSpec<const bt_field_class> final
1506{
1507 static const bt_field_class *fieldClass(const bt_field_class * const libObjPtr) noexcept
1508 {
1509 return bt_field_class_option_borrow_field_class_const(libObjPtr);
1510 }
1511};
1512
b5f55e9f 1513} /* namespace internal */
12435a68
PP
1514
1515template <typename LibObjT>
1516class CommonOptionFieldClass : public CommonFieldClass<LibObjT>
1517{
1518private:
1519 using typename CommonFieldClass<LibObjT>::_ThisCommonFieldClass;
1520
1521 using _FieldClass =
1522 typename std::conditional<std::is_const<LibObjT>::value, ConstFieldClass, FieldClass>::type;
1523
1524protected:
1525 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
1526 using _ThisCommonOptionFieldClass = CommonOptionFieldClass<LibObjT>;
1527
1528public:
26b9d24c 1529 using Shared = SharedFieldClass<CommonOptionFieldClass<LibObjT>, LibObjT>;
12435a68
PP
1530
1531 explicit CommonOptionFieldClass(const _LibObjPtr libObjPtr) noexcept :
1532 _ThisCommonFieldClass {libObjPtr}
1533 {
1534 BT_ASSERT_DBG(this->isOption());
1535 }
1536
1537 template <typename OtherLibObjT>
100fa861 1538 CommonOptionFieldClass(const CommonOptionFieldClass<OtherLibObjT> fc) noexcept :
12435a68
PP
1539 _ThisCommonFieldClass {fc}
1540 {
1541 }
1542
1543 template <typename OtherLibObjT>
100fa861 1544 CommonOptionFieldClass& operator=(const CommonOptionFieldClass<OtherLibObjT> fc) noexcept
12435a68
PP
1545 {
1546 _ThisCommonFieldClass::operator=(fc);
1547 return *this;
1548 }
1549
328a274a
PP
1550 CommonOptionFieldClass<const bt_field_class> asConst() const noexcept
1551 {
1552 return CommonOptionFieldClass<const bt_field_class> {*this};
1553 }
1554
dcb8ae9b 1555 _FieldClass fieldClass() const noexcept
12435a68
PP
1556 {
1557 return _FieldClass {
341a67c4 1558 internal::CommonOptionFieldClassSpec<LibObjT>::fieldClass(this->libObjPtr())};
12435a68
PP
1559 }
1560
1561 Shared shared() const noexcept
1562 {
c9c0b6e2 1563 return Shared::createWithRef(*this);
12435a68
PP
1564 }
1565};
1566
1567using OptionFieldClass = CommonOptionFieldClass<bt_field_class>;
1568using ConstOptionFieldClass = CommonOptionFieldClass<const bt_field_class>;
1569
4927bae7
PP
1570namespace internal {
1571
1572struct OptionFieldClassTypeDescr
1573{
1574 using Const = ConstOptionFieldClass;
1575 using NonConst = OptionFieldClass;
1576};
1577
1578template <>
1579struct TypeDescr<OptionFieldClass> : public OptionFieldClassTypeDescr
1580{
1581};
1582
1583template <>
1584struct TypeDescr<ConstOptionFieldClass> : public OptionFieldClassTypeDescr
1585{
1586};
1587
1588} /* namespace internal */
1589
12435a68
PP
1590template <typename LibObjT>
1591class CommonOptionWithSelectorFieldClass : public CommonOptionFieldClass<LibObjT>
1592{
1593private:
1594 using typename CommonOptionFieldClass<LibObjT>::_ThisCommonOptionFieldClass;
1595
1596protected:
1597 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
1598 using _ThisCommonOptionWithSelectorFieldClass = CommonOptionWithSelectorFieldClass<LibObjT>;
1599
1600public:
26b9d24c 1601 using Shared = SharedFieldClass<CommonOptionWithSelectorFieldClass<LibObjT>, LibObjT>;
12435a68
PP
1602
1603 explicit CommonOptionWithSelectorFieldClass(const _LibObjPtr libObjPtr) noexcept :
1604 _ThisCommonOptionFieldClass {libObjPtr}
1605 {
1606 BT_ASSERT_DBG(this->isOptionWithSelector());
1607 }
1608
1609 template <typename OtherLibObjT>
1610 CommonOptionWithSelectorFieldClass(
100fa861 1611 const CommonOptionWithSelectorFieldClass<OtherLibObjT> fc) noexcept :
12435a68
PP
1612 _ThisCommonOptionFieldClass {fc}
1613 {
1614 }
1615
1616 template <typename OtherLibObjT>
0d6ad4d8 1617 CommonOptionWithSelectorFieldClass&
100fa861 1618 operator=(const CommonOptionWithSelectorFieldClass<OtherLibObjT> fc) noexcept
12435a68
PP
1619 {
1620 _ThisCommonOptionFieldClass::operator=(fc);
1621 return *this;
1622 }
1623
328a274a
PP
1624 CommonOptionWithSelectorFieldClass<const bt_field_class> asConst() const noexcept
1625 {
1626 return CommonOptionWithSelectorFieldClass<const bt_field_class> {*this};
1627 }
1628
12435a68
PP
1629 ConstFieldPath selectorFieldPath() const noexcept
1630 {
1631 return ConstFieldPath {
1632 bt_field_class_option_with_selector_field_borrow_selector_field_path_const(
341a67c4 1633 this->libObjPtr())};
12435a68
PP
1634 }
1635
1636 Shared shared() const noexcept
1637 {
c9c0b6e2 1638 return Shared::createWithRef(*this);
12435a68
PP
1639 }
1640};
1641
1642using OptionWithSelectorFieldClass = CommonOptionWithSelectorFieldClass<bt_field_class>;
1643using ConstOptionWithSelectorFieldClass = CommonOptionWithSelectorFieldClass<const bt_field_class>;
1644
4927bae7
PP
1645namespace internal {
1646
1647struct OptionWithSelectorFieldClassTypeDescr
1648{
1649 using Const = ConstOptionWithSelectorFieldClass;
1650 using NonConst = OptionWithSelectorFieldClass;
1651};
1652
1653template <>
1654struct TypeDescr<OptionWithSelectorFieldClass> : public OptionWithSelectorFieldClassTypeDescr
1655{
1656};
1657
1658template <>
1659struct TypeDescr<ConstOptionWithSelectorFieldClass> : public OptionWithSelectorFieldClassTypeDescr
1660{
1661};
1662
1663} /* namespace internal */
1664
12435a68
PP
1665template <typename LibObjT>
1666class CommonOptionWithBoolSelectorFieldClass : public CommonOptionWithSelectorFieldClass<LibObjT>
1667{
1668private:
1669 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
1670
1671 using typename CommonOptionWithSelectorFieldClass<
1672 LibObjT>::_ThisCommonOptionWithSelectorFieldClass;
1673
1674public:
26b9d24c 1675 using Shared = SharedFieldClass<CommonOptionWithBoolSelectorFieldClass<LibObjT>, LibObjT>;
12435a68
PP
1676
1677 explicit CommonOptionWithBoolSelectorFieldClass(const _LibObjPtr libObjPtr) noexcept :
1678 _ThisCommonOptionWithSelectorFieldClass {libObjPtr}
1679 {
1680 BT_ASSERT_DBG(this->isOptionWithBoolSelector());
1681 }
1682
1683 template <typename OtherLibObjT>
1684 CommonOptionWithBoolSelectorFieldClass(
100fa861 1685 const CommonOptionWithBoolSelectorFieldClass<OtherLibObjT> fc) noexcept :
12435a68
PP
1686 _ThisCommonOptionWithSelectorFieldClass {fc}
1687 {
1688 }
1689
1690 template <typename OtherLibObjT>
0d6ad4d8 1691 CommonOptionWithBoolSelectorFieldClass&
100fa861 1692 operator=(const CommonOptionWithBoolSelectorFieldClass<OtherLibObjT> fc) noexcept
12435a68
PP
1693 {
1694 _ThisCommonOptionWithSelectorFieldClass::operator=(fc);
1695 return *this;
1696 }
1697
328a274a
PP
1698 CommonOptionWithBoolSelectorFieldClass<const bt_field_class> asConst() const noexcept
1699 {
1700 return CommonOptionWithBoolSelectorFieldClass<const bt_field_class> {*this};
1701 }
1702
12435a68
PP
1703 bool selectorIsReversed() const noexcept
1704 {
1705 return bt_field_class_option_with_selector_field_bool_selector_is_reversed(
341a67c4 1706 this->libObjPtr());
12435a68
PP
1707 }
1708
1709 Shared shared() const noexcept
1710 {
c9c0b6e2 1711 return Shared::createWithRef(*this);
12435a68
PP
1712 }
1713};
1714
1715using OptionWithBoolSelectorFieldClass = CommonOptionWithBoolSelectorFieldClass<bt_field_class>;
1716
1717using ConstOptionWithBoolSelectorFieldClass =
1718 CommonOptionWithBoolSelectorFieldClass<const bt_field_class>;
1719
1720namespace internal {
1721
4927bae7
PP
1722struct OptionWithBoolSelectorFieldClassTypeDescr
1723{
1724 using Const = ConstOptionWithBoolSelectorFieldClass;
1725 using NonConst = OptionWithBoolSelectorFieldClass;
1726};
1727
1728template <>
1729struct TypeDescr<OptionWithBoolSelectorFieldClass> :
1730 public OptionWithBoolSelectorFieldClassTypeDescr
1731{
1732};
1733
1734template <>
1735struct TypeDescr<ConstOptionWithBoolSelectorFieldClass> :
1736 public OptionWithBoolSelectorFieldClassTypeDescr
1737{
1738};
1739
12435a68
PP
1740template <typename RangeSetT>
1741struct CommonOptionWithIntegerSelectorFieldClassSpec;
1742
b5f55e9f 1743/* Functions specific to option field classes with unsigned integer ranges */
12435a68
PP
1744template <>
1745struct CommonOptionWithIntegerSelectorFieldClassSpec<ConstUnsignedIntegerRangeSet> final
1746{
1747 static const bt_integer_range_set_unsigned *
1748 ranges(const bt_field_class * const libObjPtr) noexcept
1749 {
1750 return bt_field_class_option_with_selector_field_integer_unsigned_borrow_selector_ranges_const(
1751 libObjPtr);
1752 }
1753};
1754
b5f55e9f 1755/* Functions specific to option field classes with signed ranges */
12435a68
PP
1756template <>
1757struct CommonOptionWithIntegerSelectorFieldClassSpec<ConstSignedIntegerRangeSet> final
1758{
1759 static const bt_integer_range_set_signed *
1760 ranges(const bt_field_class * const libObjPtr) noexcept
1761 {
1762 return bt_field_class_option_with_selector_field_integer_signed_borrow_selector_ranges_const(
1763 libObjPtr);
1764 }
1765};
1766
b5f55e9f 1767} /* namespace internal */
12435a68
PP
1768
1769template <typename LibObjT, typename RangeSetT>
1770class CommonOptionWithIntegerSelectorFieldClass : public CommonOptionWithSelectorFieldClass<LibObjT>
1771{
1772private:
1773 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
1774
1775 using typename CommonOptionWithSelectorFieldClass<
1776 LibObjT>::_ThisCommonOptionWithSelectorFieldClass;
1777
1778 using _ThisCommonOptionWithIntegerSelectorFieldClass =
1779 CommonOptionWithIntegerSelectorFieldClass<LibObjT, RangeSetT>;
1780
1781public:
26b9d24c 1782 using Shared = SharedFieldClass<_ThisCommonOptionWithIntegerSelectorFieldClass, LibObjT>;
12435a68
PP
1783
1784 using RangeSet = RangeSetT;
1785
1786 explicit CommonOptionWithIntegerSelectorFieldClass(const _LibObjPtr libObjPtr) noexcept :
1787 _ThisCommonOptionWithSelectorFieldClass {libObjPtr}
1788 {
1789 BT_ASSERT_DBG(this->isOptionWithIntegerSelector());
1790 }
1791
1792 template <typename OtherLibObjT>
1793 CommonOptionWithIntegerSelectorFieldClass(
100fa861 1794 const CommonOptionWithIntegerSelectorFieldClass<OtherLibObjT, RangeSetT> fc) noexcept :
12435a68
PP
1795 _ThisCommonOptionWithSelectorFieldClass {fc}
1796 {
1797 }
1798
1799 template <typename OtherLibObjT>
0d6ad4d8 1800 CommonOptionWithIntegerSelectorFieldClass&
100fa861 1801 operator=(const CommonOptionWithIntegerSelectorFieldClass<OtherLibObjT, RangeSetT> fc) noexcept
12435a68
PP
1802 {
1803 _ThisCommonOptionWithSelectorFieldClass::operator=(fc);
1804 return *this;
1805 }
1806
1807 RangeSet ranges() const noexcept
1808 {
1809 return RangeSet {internal::CommonOptionWithIntegerSelectorFieldClassSpec<RangeSetT>::ranges(
341a67c4 1810 this->libObjPtr())};
12435a68
PP
1811 }
1812
1813 Shared shared() const noexcept
1814 {
c9c0b6e2 1815 return Shared::createWithRef(*this);
12435a68
PP
1816 }
1817};
1818
1819using OptionWithUnsignedIntegerSelectorFieldClass =
1820 CommonOptionWithIntegerSelectorFieldClass<bt_field_class, ConstUnsignedIntegerRangeSet>;
1821
1822using ConstOptionWithUnsignedIntegerSelectorFieldClass =
1823 CommonOptionWithIntegerSelectorFieldClass<const bt_field_class, ConstUnsignedIntegerRangeSet>;
1824
1825using OptionWithSignedIntegerSelectorFieldClass =
1826 CommonOptionWithIntegerSelectorFieldClass<bt_field_class, ConstSignedIntegerRangeSet>;
1827
1828using ConstOptionWithSignedIntegerSelectorFieldClass =
1829 CommonOptionWithIntegerSelectorFieldClass<const bt_field_class, ConstSignedIntegerRangeSet>;
1830
1831namespace internal {
1832
4927bae7
PP
1833struct OptionWithUnsignedIntegerSelectorFieldClassTypeDescr
1834{
1835 using Const = ConstOptionWithUnsignedIntegerSelectorFieldClass;
1836 using NonConst = OptionWithUnsignedIntegerSelectorFieldClass;
1837};
1838
1839template <>
1840struct TypeDescr<OptionWithUnsignedIntegerSelectorFieldClass> :
1841 public OptionWithUnsignedIntegerSelectorFieldClassTypeDescr
1842{
1843};
1844
1845template <>
1846struct TypeDescr<ConstOptionWithUnsignedIntegerSelectorFieldClass> :
1847 public OptionWithUnsignedIntegerSelectorFieldClassTypeDescr
1848{
1849};
1850
1851struct OptionWithSignedIntegerSelectorFieldClassTypeDescr
1852{
1853 using Const = ConstOptionWithSignedIntegerSelectorFieldClass;
1854 using NonConst = OptionWithSignedIntegerSelectorFieldClass;
1855};
1856
1857template <>
1858struct TypeDescr<OptionWithSignedIntegerSelectorFieldClass> :
1859 public OptionWithSignedIntegerSelectorFieldClassTypeDescr
1860{
1861};
1862
1863template <>
1864struct TypeDescr<ConstOptionWithSignedIntegerSelectorFieldClass> :
1865 public OptionWithSignedIntegerSelectorFieldClassTypeDescr
1866{
1867};
1868
12435a68
PP
1869template <typename LibObjT>
1870struct CommonVariantFieldClassOptionSpec;
1871
b5f55e9f 1872/* Functions specific to mutable variant field class options */
12435a68
PP
1873template <>
1874struct CommonVariantFieldClassOptionSpec<bt_field_class_variant_option> final
1875{
1876 static bt_field_class *fieldClass(bt_field_class_variant_option * const libObjPtr) noexcept
1877 {
1878 return bt_field_class_variant_option_borrow_field_class(libObjPtr);
1879 }
8e557120
PP
1880
1881 static bt_value *userAttributes(bt_field_class_variant_option * const libObjPtr) noexcept
1882 {
1883 return bt_field_class_variant_option_borrow_user_attributes(libObjPtr);
1884 }
12435a68
PP
1885};
1886
b5f55e9f 1887/* Functions specific to constant variant field class options */
12435a68
PP
1888template <>
1889struct CommonVariantFieldClassOptionSpec<const bt_field_class_variant_option> final
1890{
1891 static const bt_field_class *
1892 fieldClass(const bt_field_class_variant_option * const libObjPtr) noexcept
1893 {
1894 return bt_field_class_variant_option_borrow_field_class_const(libObjPtr);
1895 }
8e557120
PP
1896
1897 static const bt_value *
1898 userAttributes(const bt_field_class_variant_option * const libObjPtr) noexcept
1899 {
1900 return bt_field_class_variant_option_borrow_user_attributes_const(libObjPtr);
1901 }
12435a68
PP
1902};
1903
b5f55e9f 1904} /* namespace internal */
12435a68
PP
1905
1906template <typename LibObjT>
0d218157 1907class CommonVariantFieldClassOption : public BorrowedObject<LibObjT>
12435a68
PP
1908{
1909private:
0d218157
PP
1910 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
1911 using typename BorrowedObject<LibObjT>::_LibObjPtr;
12435a68
PP
1912
1913 using _FieldClass =
1914 typename std::conditional<std::is_const<LibObjT>::value, ConstFieldClass, FieldClass>::type;
1915
1916public:
8e557120
PP
1917 using UserAttributes =
1918 typename std::conditional<std::is_const<LibObjT>::value, ConstMapValue, MapValue>::type;
1919
12435a68 1920 explicit CommonVariantFieldClassOption(const _LibObjPtr libObjPtr) noexcept :
0d218157 1921 _ThisBorrowedObject {libObjPtr}
12435a68
PP
1922 {
1923 }
1924
1925 template <typename OtherLibObjT>
100fa861 1926 CommonVariantFieldClassOption(const CommonVariantFieldClassOption<OtherLibObjT> fc) noexcept :
0d218157 1927 _ThisBorrowedObject {fc}
12435a68
PP
1928 {
1929 }
1930
1931 template <typename OtherLibObjT>
0d6ad4d8 1932 CommonVariantFieldClassOption&
100fa861 1933 operator=(const CommonVariantFieldClassOption<OtherLibObjT> fc) noexcept
12435a68 1934 {
0d218157 1935 _ThisBorrowedObject::operator=(fc);
12435a68
PP
1936 return *this;
1937 }
1938
328a274a
PP
1939 CommonVariantFieldClassOption<const bt_field_class_variant_option> asConst() const noexcept
1940 {
1941 return CommonVariantFieldClassOption<const bt_field_class_variant_option> {*this};
1942 }
1943
41c4bedf 1944 nonstd::optional<bpstd::string_view> name() const noexcept
12435a68 1945 {
41c4bedf
PP
1946 const auto name = bt_field_class_variant_option_get_name(this->libObjPtr());
1947
1948 if (name) {
1949 return name;
1950 }
1951
1952 return nonstd::nullopt;
12435a68
PP
1953 }
1954
dcb8ae9b 1955 _FieldClass fieldClass() const noexcept
12435a68
PP
1956 {
1957 return _FieldClass {
341a67c4 1958 internal::CommonVariantFieldClassOptionSpec<LibObjT>::fieldClass(this->libObjPtr())};
12435a68 1959 }
8e557120
PP
1960
1961 template <typename LibValT>
b7ffa6f0 1962 void userAttributes(const CommonMapValue<LibValT> userAttrs) const noexcept
8e557120 1963 {
5c895f64
PP
1964 static_assert(!std::is_const<LibObjT>::value,
1965 "Not available with `bt2::ConstVariantFieldClassOption`.");
8e557120
PP
1966
1967 bt_field_class_variant_option_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr());
1968 }
1969
dcb8ae9b 1970 UserAttributes userAttributes() const noexcept
8e557120
PP
1971 {
1972 return UserAttributes {internal::CommonVariantFieldClassOptionSpec<LibObjT>::userAttributes(
1973 this->libObjPtr())};
1974 }
12435a68
PP
1975};
1976
1977using VariantFieldClassOption = CommonVariantFieldClassOption<bt_field_class_variant_option>;
1978
1979using ConstVariantFieldClassOption =
1980 CommonVariantFieldClassOption<const bt_field_class_variant_option>;
1981
1982namespace internal {
1983
4927bae7
PP
1984struct VariantFieldClassOptionTypeDescr
1985{
1986 using Const = ConstVariantFieldClassOption;
1987 using NonConst = VariantFieldClassOption;
1988};
1989
1990template <>
1991struct TypeDescr<VariantFieldClassOption> : public VariantFieldClassOptionTypeDescr
1992{
1993};
1994
1995template <>
1996struct TypeDescr<ConstVariantFieldClassOption> : public VariantFieldClassOptionTypeDescr
1997{
1998};
1999
12435a68
PP
2000template <typename LibObjT>
2001struct ConstVariantWithIntegerSelectorFieldClassOptionSpec;
2002
b5f55e9f 2003/* Functions specific to variant field class options with unsigned integer selector */
12435a68
PP
2004template <>
2005struct ConstVariantWithIntegerSelectorFieldClassOptionSpec<
2006 const bt_field_class_variant_with_selector_field_integer_unsigned_option>
2007 final
2008{
2009 static const bt_integer_range_set_unsigned *
2010 ranges(const bt_field_class_variant_with_selector_field_integer_unsigned_option
2011 * const libObjPtr) noexcept
2012 {
2013 return bt_field_class_variant_with_selector_field_integer_unsigned_option_borrow_ranges_const(
2014 libObjPtr);
2015 }
2016
2017 static const bt_field_class_variant_option *
2018 asBaseOption(const bt_field_class_variant_with_selector_field_integer_unsigned_option
2019 * const libObjPtr) noexcept
2020 {
2021 return bt_field_class_variant_with_selector_field_integer_unsigned_option_as_option_const(
2022 libObjPtr);
2023 }
2024};
2025
b5f55e9f 2026/* Functions specific to variant field class options with signed integer selector */
12435a68
PP
2027template <>
2028struct ConstVariantWithIntegerSelectorFieldClassOptionSpec<
2029 const bt_field_class_variant_with_selector_field_integer_signed_option>
2030 final
2031{
2032 static const bt_integer_range_set_signed *
2033 ranges(const bt_field_class_variant_with_selector_field_integer_signed_option
2034 * const libObjPtr) noexcept
2035 {
2036 return bt_field_class_variant_with_selector_field_integer_signed_option_borrow_ranges_const(
2037 libObjPtr);
2038 }
2039
2040 static const bt_field_class_variant_option *
2041 asBaseOption(const bt_field_class_variant_with_selector_field_integer_signed_option
2042 * const libObjPtr) noexcept
2043 {
2044 return bt_field_class_variant_with_selector_field_integer_signed_option_as_option_const(
2045 libObjPtr);
2046 }
2047};
2048
b5f55e9f 2049} /* namespace internal */
12435a68
PP
2050
2051template <typename LibObjT>
0d218157 2052class ConstVariantWithIntegerSelectorFieldClassOption : public BorrowedObject<LibObjT>
12435a68
PP
2053{
2054private:
0d218157
PP
2055 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
2056 using typename BorrowedObject<LibObjT>::_LibObjPtr;
12435a68
PP
2057 using _Spec = internal::ConstVariantWithIntegerSelectorFieldClassOptionSpec<LibObjT>;
2058
2059public:
2060 using RangeSet = typename std::conditional<
2061 std::is_same<
2062 LibObjT,
2063 const bt_field_class_variant_with_selector_field_integer_unsigned_option>::value,
2064 ConstUnsignedIntegerRangeSet, ConstSignedIntegerRangeSet>::type;
2065
2066 explicit ConstVariantWithIntegerSelectorFieldClassOption(const _LibObjPtr libObjPtr) noexcept :
0d218157 2067 _ThisBorrowedObject {libObjPtr}
12435a68
PP
2068 {
2069 }
2070
2071 template <typename OtherLibObjT>
2072 ConstVariantWithIntegerSelectorFieldClassOption(
100fa861 2073 const ConstVariantWithIntegerSelectorFieldClassOption<OtherLibObjT> fc) noexcept :
0d218157 2074 _ThisBorrowedObject {fc}
12435a68
PP
2075 {
2076 }
2077
2078 template <typename OtherLibObjT>
0d6ad4d8 2079 ConstVariantWithIntegerSelectorFieldClassOption&
100fa861 2080 operator=(const ConstVariantWithIntegerSelectorFieldClassOption<OtherLibObjT> fc) noexcept
12435a68 2081 {
0d218157 2082 _ThisBorrowedObject::operator=(fc);
12435a68
PP
2083 return *this;
2084 }
2085
2086 ConstVariantFieldClassOption asBaseOption() const noexcept
2087 {
341a67c4 2088 return ConstVariantFieldClassOption {_Spec::asBaseOption(this->libObjPtr())};
12435a68
PP
2089 }
2090
41c4bedf 2091 nonstd::optional<bpstd::string_view> name() const noexcept
12435a68
PP
2092 {
2093 return this->asBaseOption().name();
2094 }
2095
2096 ConstFieldClass fieldClass() const noexcept
2097 {
2098 return this->asBaseOption().fieldClass();
2099 }
2100
2101 RangeSet ranges() const noexcept
2102 {
341a67c4 2103 return RangeSet {_Spec::ranges(this->libObjPtr())};
12435a68
PP
2104 }
2105};
2106
2107using ConstVariantWithUnsignedIntegerSelectorFieldClassOption =
2108 ConstVariantWithIntegerSelectorFieldClassOption<
2109 const bt_field_class_variant_with_selector_field_integer_unsigned_option>;
2110
2111using ConstVariantWithSignedIntegerSelectorFieldClassOption =
2112 ConstVariantWithIntegerSelectorFieldClassOption<
2113 const bt_field_class_variant_with_selector_field_integer_signed_option>;
2114
2115namespace internal {
2116
2117template <typename LibObjT>
2118struct CommonVariantFieldClassSpec;
2119
b5f55e9f 2120/* Functions specific to mutable variant field classes */
12435a68
PP
2121template <>
2122struct CommonVariantFieldClassSpec<bt_field_class> final
2123{
2124 static bt_field_class_variant_option *optionByIndex(bt_field_class * const libObjPtr,
2125 const std::uint64_t index) noexcept
2126 {
2127 return bt_field_class_variant_borrow_option_by_index(libObjPtr, index);
2128 }
2129
2130 static bt_field_class_variant_option *optionByName(bt_field_class * const libObjPtr,
2131 const char * const name) noexcept
2132 {
2133 return bt_field_class_variant_borrow_option_by_name(libObjPtr, name);
2134 }
2135};
2136
b5f55e9f 2137/* Functions specific to constant variant field classes */
12435a68
PP
2138template <>
2139struct CommonVariantFieldClassSpec<const bt_field_class> final
2140{
2141 static const bt_field_class_variant_option *
2142 optionByIndex(const bt_field_class * const libObjPtr, const std::uint64_t index) noexcept
2143 {
2144 return bt_field_class_variant_borrow_option_by_index_const(libObjPtr, index);
2145 }
2146
2147 static const bt_field_class_variant_option *optionByName(const bt_field_class * const libObjPtr,
2148 const char * const name) noexcept
2149 {
2150 return bt_field_class_variant_borrow_option_by_name_const(libObjPtr, name);
2151 }
2152};
2153
b5f55e9f 2154} /* namespace internal */
12435a68
PP
2155
2156template <typename LibObjT>
2157class CommonVariantFieldClass : public CommonFieldClass<LibObjT>
2158{
2159private:
2160 using typename CommonFieldClass<LibObjT>::_ThisCommonFieldClass;
2161
2162protected:
2163 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
2164 using _ThisCommonVariantFieldClass = CommonVariantFieldClass<LibObjT>;
2165
2166public:
26b9d24c 2167 using Shared = SharedFieldClass<CommonVariantFieldClass<LibObjT>, LibObjT>;
12435a68
PP
2168
2169 using Option =
2170 typename std::conditional<std::is_const<LibObjT>::value, ConstVariantFieldClassOption,
2171 VariantFieldClassOption>::type;
2172
3c02a7cb 2173 using Iterator = CommonIterator<CommonVariantFieldClass, Option>;
5046c776 2174
12435a68
PP
2175 explicit CommonVariantFieldClass(const _LibObjPtr libObjPtr) noexcept :
2176 _ThisCommonFieldClass {libObjPtr}
2177 {
2178 BT_ASSERT_DBG(this->isVariant());
2179 }
2180
2181 template <typename OtherLibObjT>
100fa861 2182 CommonVariantFieldClass(const CommonVariantFieldClass<OtherLibObjT> fc) noexcept :
12435a68
PP
2183 _ThisCommonFieldClass {fc}
2184 {
2185 }
2186
2187 template <typename OtherLibObjT>
100fa861 2188 CommonVariantFieldClass& operator=(const CommonVariantFieldClass<OtherLibObjT> fc) noexcept
12435a68
PP
2189 {
2190 _ThisCommonFieldClass::operator=(fc);
2191 return *this;
2192 }
2193
328a274a
PP
2194 CommonVariantFieldClass<const bt_field_class> asConst() const noexcept
2195 {
2196 return CommonVariantFieldClass<const bt_field_class> {*this};
2197 }
2198
c0b73c63 2199 std::uint64_t length() const noexcept
12435a68 2200 {
341a67c4 2201 return bt_field_class_variant_get_option_count(this->libObjPtr());
12435a68
PP
2202 }
2203
5046c776
FD
2204 Iterator begin() const noexcept
2205 {
2206 return Iterator {*this, 0};
2207 }
2208
2209 Iterator end() const noexcept
2210 {
c0b73c63 2211 return Iterator {*this, this->length()};
5046c776
FD
2212 }
2213
dcb8ae9b 2214 Option operator[](const std::uint64_t index) const noexcept
12435a68
PP
2215 {
2216 return Option {internal::CommonVariantFieldClassSpec<LibObjT>::optionByIndex(
341a67c4 2217 this->libObjPtr(), index)};
12435a68
PP
2218 }
2219
dcb8ae9b 2220 nonstd::optional<Option> operator[](const char * const name) const noexcept
12435a68
PP
2221 {
2222 const auto libObjPtr =
341a67c4 2223 internal::CommonVariantFieldClassSpec<LibObjT>::optionByName(this->libObjPtr(), name);
12435a68
PP
2224
2225 if (libObjPtr) {
2226 return Option {libObjPtr};
2227 }
2228
2229 return nonstd::nullopt;
2230 }
2231
dcb8ae9b 2232 nonstd::optional<Option> operator[](const std::string& name) const noexcept
12435a68
PP
2233 {
2234 return (*this)[name.data()];
2235 }
2236
2237 Shared shared() const noexcept
2238 {
c9c0b6e2 2239 return Shared::createWithRef(*this);
12435a68
PP
2240 }
2241};
2242
2243using VariantFieldClass = CommonVariantFieldClass<bt_field_class>;
2244using ConstVariantFieldClass = CommonVariantFieldClass<const bt_field_class>;
2245
4927bae7
PP
2246namespace internal {
2247
2248struct VariantFieldClassTypeDescr
2249{
2250 using Const = ConstVariantFieldClass;
2251 using NonConst = VariantFieldClass;
2252};
2253
2254template <>
2255struct TypeDescr<VariantFieldClass> : public VariantFieldClassTypeDescr
2256{
2257};
2258
2259template <>
2260struct TypeDescr<ConstVariantFieldClass> : public VariantFieldClassTypeDescr
2261{
2262};
2263
2264} /* namespace internal */
2265
12435a68
PP
2266template <typename LibObjT>
2267class CommonVariantWithoutSelectorFieldClass : public CommonVariantFieldClass<LibObjT>
2268{
2269private:
2270 using typename CommonVariantFieldClass<LibObjT>::_ThisCommonVariantFieldClass;
2271 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
2272
2273public:
26b9d24c 2274 using Shared = SharedFieldClass<CommonVariantWithoutSelectorFieldClass<LibObjT>, LibObjT>;
12435a68
PP
2275
2276 explicit CommonVariantWithoutSelectorFieldClass(const _LibObjPtr libObjPtr) noexcept :
2277 _ThisCommonVariantFieldClass {libObjPtr}
2278 {
2279 BT_ASSERT_DBG(this->isVariantWithoutSelector());
2280 }
2281
2282 template <typename OtherLibObjT>
2283 CommonVariantWithoutSelectorFieldClass(
100fa861 2284 const CommonVariantWithoutSelectorFieldClass<OtherLibObjT> fc) noexcept :
12435a68
PP
2285 _ThisCommonVariantFieldClass {fc}
2286 {
2287 }
2288
2289 template <typename OtherLibObjT>
0d6ad4d8 2290 CommonVariantWithoutSelectorFieldClass&
100fa861 2291 operator=(const CommonVariantWithoutSelectorFieldClass<OtherLibObjT> fc) noexcept
12435a68
PP
2292 {
2293 _ThisCommonVariantFieldClass::operator=(fc);
2294 return *this;
2295 }
2296
328a274a
PP
2297 CommonVariantWithoutSelectorFieldClass<const bt_field_class> asConst() const noexcept
2298 {
2299 return CommonVariantWithoutSelectorFieldClass<const bt_field_class> {*this};
2300 }
2301
dcb8ae9b 2302 void appendOption(const char * const name, const FieldClass fc) const
12435a68 2303 {
5c895f64
PP
2304 static_assert(!std::is_const<LibObjT>::value,
2305 "Not available with `bt2::ConstVariantWithoutSelectorFieldClass`.");
12435a68
PP
2306
2307 const auto status = bt_field_class_variant_without_selector_append_option(
341a67c4 2308 this->libObjPtr(), name, fc.libObjPtr());
12435a68
PP
2309
2310 if (status ==
2311 BT_FIELD_CLASS_VARIANT_WITHOUT_SELECTOR_FIELD_APPEND_OPTION_STATUS_MEMORY_ERROR) {
39278ebc 2312 throw MemoryError {};
12435a68
PP
2313 }
2314 }
2315
dcb8ae9b 2316 void appendOption(const nonstd::optional<std::string>& name, const FieldClass fc) const
12435a68 2317 {
41c4bedf 2318 this->appendOption(name ? name->data() : nullptr, fc);
12435a68
PP
2319 }
2320
2321 Shared shared() const noexcept
2322 {
c9c0b6e2 2323 return Shared::createWithRef(*this);
12435a68
PP
2324 }
2325};
2326
2327using VariantWithoutSelectorFieldClass = CommonVariantWithoutSelectorFieldClass<bt_field_class>;
2328using ConstVariantWithoutSelectorFieldClass =
2329 CommonVariantWithoutSelectorFieldClass<const bt_field_class>;
2330
2331namespace internal {
2332
4927bae7
PP
2333struct VariantWithoutSelectorFieldClassTypeDescr
2334{
2335 using Const = ConstVariantWithoutSelectorFieldClass;
2336 using NonConst = VariantWithoutSelectorFieldClass;
2337};
2338
2339template <>
2340struct TypeDescr<VariantWithoutSelectorFieldClass> :
2341 public VariantWithoutSelectorFieldClassTypeDescr
2342{
2343};
2344
2345template <>
2346struct TypeDescr<ConstVariantWithoutSelectorFieldClass> :
2347 public VariantWithoutSelectorFieldClassTypeDescr
2348{
2349};
2350
12435a68
PP
2351template <typename OptionT>
2352struct CommonVariantWithIntegerSelectorFieldClassSpec;
2353
b5f55e9f 2354/* Functions specific to variant field classes with unsigned integer selector */
12435a68
PP
2355template <>
2356struct CommonVariantWithIntegerSelectorFieldClassSpec<
2357 ConstVariantWithUnsignedIntegerSelectorFieldClassOption>
2358 final
2359{
2360 static const bt_field_class_variant_with_selector_field_integer_unsigned_option *
2361 optionByIndex(const bt_field_class * const libObjPtr, const std::uint64_t index) noexcept
2362 {
2363 return bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_index_const(
2364 libObjPtr, index);
2365 }
2366
2367 static const bt_field_class_variant_with_selector_field_integer_unsigned_option *
2368 optionByName(const bt_field_class * const libObjPtr, const char * const name) noexcept
2369 {
2370 return bt_field_class_variant_with_selector_field_integer_unsigned_borrow_option_by_name_const(
2371 libObjPtr, name);
2372 }
2373
2374 static bt_field_class_variant_with_selector_field_integer_append_option_status
2375 appendOption(bt_field_class * const libObjPtr, const char * const name,
2376 bt_field_class * const libOptFcPtr,
2377 const bt_integer_range_set_unsigned * const libRangesPtr)
2378 {
2379 return bt_field_class_variant_with_selector_field_integer_unsigned_append_option(
2380 libObjPtr, name, libOptFcPtr, libRangesPtr);
2381 }
2382};
2383
b5f55e9f 2384/* Functions specific to variant field classes with signed integer selector */
12435a68
PP
2385template <>
2386struct CommonVariantWithIntegerSelectorFieldClassSpec<
2387 ConstVariantWithSignedIntegerSelectorFieldClassOption>
2388 final
2389{
2390 static const bt_field_class_variant_with_selector_field_integer_signed_option *
2391 optionByIndex(const bt_field_class * const libObjPtr, const std::uint64_t index) noexcept
2392 {
2393 return bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_index_const(
2394 libObjPtr, index);
2395 }
2396
2397 static const bt_field_class_variant_with_selector_field_integer_signed_option *
2398 optionByName(const bt_field_class * const libObjPtr, const char * const name) noexcept
2399 {
2400 return bt_field_class_variant_with_selector_field_integer_signed_borrow_option_by_name_const(
2401 libObjPtr, name);
2402 }
2403
2404 static bt_field_class_variant_with_selector_field_integer_append_option_status
2405 appendOption(bt_field_class * const libObjPtr, const char * const name,
2406 bt_field_class * const libOptFcPtr,
2407 const bt_integer_range_set_signed * const libRangesPtr)
2408 {
2409 return bt_field_class_variant_with_selector_field_integer_signed_append_option(
2410 libObjPtr, name, libOptFcPtr, libRangesPtr);
2411 }
2412};
2413
b5f55e9f 2414} /* namespace internal */
12435a68 2415
cefe03a2
FD
2416template <typename LibObjT>
2417class CommonVariantWithSelectorFieldClass : public CommonVariantFieldClass<LibObjT>
12435a68
PP
2418{
2419private:
2420 using typename CommonVariantFieldClass<LibObjT>::_ThisCommonVariantFieldClass;
cefe03a2
FD
2421
2422protected:
12435a68 2423 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
cefe03a2
FD
2424 using _ThisCommonVariantWithSelectorFieldClass = CommonVariantWithSelectorFieldClass<LibObjT>;
2425
2426public:
26b9d24c 2427 using Shared = SharedFieldClass<_ThisCommonVariantWithSelectorFieldClass, LibObjT>;
cefe03a2
FD
2428
2429 explicit CommonVariantWithSelectorFieldClass(const _LibObjPtr libObjPtr) noexcept :
2430 _ThisCommonVariantFieldClass {libObjPtr}
2431 {
2432 BT_ASSERT_DBG(this->isVariantWithSelector());
2433 }
2434
2435 template <typename OtherLibObjT>
2436 CommonVariantWithSelectorFieldClass(
100fa861 2437 const CommonVariantWithSelectorFieldClass<OtherLibObjT> fc) noexcept :
cefe03a2
FD
2438 _ThisCommonVariantFieldClass {fc}
2439 {
2440 }
2441
2442 template <typename OtherLibObjT>
0d6ad4d8 2443 CommonVariantWithSelectorFieldClass&
100fa861 2444 operator=(const CommonVariantWithSelectorFieldClass<OtherLibObjT> fc) noexcept
cefe03a2
FD
2445 {
2446 _ThisCommonVariantFieldClass::operator=(fc);
2447 return *this;
2448 }
2449
328a274a
PP
2450 CommonVariantWithSelectorFieldClass<const bt_field_class> asConst() const noexcept
2451 {
2452 return CommonVariantWithSelectorFieldClass<const bt_field_class> {*this};
2453 }
2454
cefe03a2
FD
2455 ConstFieldPath selectorFieldPath() const noexcept
2456 {
2457 return ConstFieldPath {
2458 bt_field_class_variant_with_selector_field_borrow_selector_field_path_const(
341a67c4 2459 this->libObjPtr())};
cefe03a2
FD
2460 }
2461
2462 Shared shared() const noexcept
2463 {
c9c0b6e2 2464 return Shared::createWithRef(*this);
cefe03a2
FD
2465 }
2466};
12435a68 2467
3c02a7cb
FD
2468using VariantWithSelectorFieldClass = CommonVariantWithSelectorFieldClass<bt_field_class>;
2469using ConstVariantWithSelectorFieldClass =
2470 CommonVariantWithSelectorFieldClass<const bt_field_class>;
2471
cefe03a2
FD
2472template <typename LibObjT, typename OptionT>
2473class CommonVariantWithIntegerSelectorFieldClass :
2474 public CommonVariantWithSelectorFieldClass<LibObjT>
2475{
2476private:
2477 using typename CommonVariantWithSelectorFieldClass<
2478 LibObjT>::_ThisCommonVariantWithSelectorFieldClass;
2479 using typename CommonFieldClass<LibObjT>::_LibObjPtr;
12435a68
PP
2480 using _ThisCommonVariantWithIntegerSelectorFieldClass =
2481 CommonVariantWithIntegerSelectorFieldClass<LibObjT, OptionT>;
2482
2483 using _Spec = internal::CommonVariantWithIntegerSelectorFieldClassSpec<OptionT>;
2484
2485public:
26b9d24c 2486 using Shared = SharedFieldClass<_ThisCommonVariantWithIntegerSelectorFieldClass, LibObjT>;
12435a68
PP
2487
2488 using Option = OptionT;
3c02a7cb
FD
2489 using Iterator =
2490 CommonIterator<CommonVariantWithIntegerSelectorFieldClass<LibObjT, Option>, Option>;
12435a68
PP
2491
2492 explicit CommonVariantWithIntegerSelectorFieldClass(const _LibObjPtr libObjPtr) noexcept :
cefe03a2 2493 _ThisCommonVariantWithSelectorFieldClass {libObjPtr}
12435a68
PP
2494 {
2495 BT_ASSERT_DBG(this->isVariant());
2496 }
2497
2498 template <typename OtherLibObjT>
2499 CommonVariantWithIntegerSelectorFieldClass(
100fa861 2500 const CommonVariantWithIntegerSelectorFieldClass<OtherLibObjT, OptionT> fc) noexcept :
cefe03a2 2501 _ThisCommonVariantWithSelectorFieldClass {fc}
12435a68
PP
2502 {
2503 }
2504
2505 template <typename OtherLibObjT>
0d6ad4d8 2506 CommonVariantWithIntegerSelectorFieldClass&
100fa861 2507 operator=(const CommonVariantWithIntegerSelectorFieldClass<OtherLibObjT, OptionT> fc) noexcept
12435a68 2508 {
cefe03a2 2509 _ThisCommonVariantWithSelectorFieldClass::operator=(fc);
12435a68
PP
2510 return *this;
2511 }
2512
12435a68
PP
2513 Option operator[](const std::uint64_t index) const noexcept
2514 {
341a67c4 2515 return Option {_Spec::optionByIndex(this->libObjPtr(), index)};
12435a68
PP
2516 }
2517
2518 nonstd::optional<Option> operator[](const char * const name) const noexcept
2519 {
341a67c4 2520 const auto libObjPtr = _Spec::optionByName(this->libObjPtr(), name);
12435a68
PP
2521
2522 if (libObjPtr) {
2523 return Option {libObjPtr};
2524 }
2525
2526 return nonstd::nullopt;
2527 }
2528
2529 nonstd::optional<Option> operator[](const std::string& name) const noexcept
2530 {
2531 return (*this)[name.data()];
2532 }
2533
100fa861 2534 void appendOption(const char * const name, const FieldClass fc,
dcb8ae9b 2535 const typename Option::RangeSet ranges) const
12435a68 2536 {
5c895f64
PP
2537 static_assert(
2538 !std::is_const<LibObjT>::value,
2539 "Not available with `bt2::ConstVariantWithUnsignedIntegerSelectorFieldClass`.");
12435a68
PP
2540
2541 const auto status =
341a67c4 2542 _Spec::appendOption(this->libObjPtr(), name, fc.libObjPtr(), ranges.libObjPtr());
12435a68
PP
2543
2544 if (status ==
2545 BT_FIELD_CLASS_VARIANT_WITH_SELECTOR_FIELD_APPEND_OPTION_STATUS_MEMORY_ERROR) {
39278ebc 2546 throw MemoryError {};
12435a68
PP
2547 }
2548 }
2549
100fa861 2550 void appendOption(const nonstd::optional<std::string>& name, const FieldClass fc,
dcb8ae9b 2551 const typename Option::RangeSet ranges) const
12435a68 2552 {
41c4bedf 2553 this->appendOption(name ? name->data() : nullptr, fc, ranges);
12435a68
PP
2554 }
2555
3c02a7cb
FD
2556 Iterator begin() const noexcept
2557 {
2558 return Iterator {*this, 0};
2559 }
2560
2561 Iterator end() const noexcept
2562 {
c0b73c63 2563 return Iterator {*this, this->length()};
3c02a7cb
FD
2564 }
2565
12435a68
PP
2566 Shared shared() const noexcept
2567 {
c9c0b6e2 2568 return Shared::createWithRef(*this);
12435a68
PP
2569 }
2570};
2571
2572using VariantWithUnsignedIntegerSelectorFieldClass = CommonVariantWithIntegerSelectorFieldClass<
2573 bt_field_class, ConstVariantWithUnsignedIntegerSelectorFieldClassOption>;
2574
2575using ConstVariantWithUnsignedIntegerSelectorFieldClass =
2576 CommonVariantWithIntegerSelectorFieldClass<
2577 const bt_field_class, ConstVariantWithUnsignedIntegerSelectorFieldClassOption>;
2578
2579using VariantWithSignedIntegerSelectorFieldClass = CommonVariantWithIntegerSelectorFieldClass<
2580 bt_field_class, ConstVariantWithSignedIntegerSelectorFieldClassOption>;
2581
2582using ConstVariantWithSignedIntegerSelectorFieldClass = CommonVariantWithIntegerSelectorFieldClass<
2583 const bt_field_class, ConstVariantWithSignedIntegerSelectorFieldClassOption>;
2584
4927bae7
PP
2585namespace internal {
2586
2587struct VariantWithUnsignedIntegerSelectorFieldClassTypeDescr
2588{
2589 using Const = ConstVariantWithUnsignedIntegerSelectorFieldClass;
2590 using NonConst = VariantWithUnsignedIntegerSelectorFieldClass;
2591};
2592
2593template <>
2594struct TypeDescr<VariantWithUnsignedIntegerSelectorFieldClass> :
2595 public VariantWithUnsignedIntegerSelectorFieldClassTypeDescr
2596{
2597};
2598
2599template <>
2600struct TypeDescr<ConstVariantWithUnsignedIntegerSelectorFieldClass> :
2601 public VariantWithUnsignedIntegerSelectorFieldClassTypeDescr
2602{
2603};
2604
2605struct VariantWithSignedIntegerSelectorFieldClassTypeDescr
2606{
2607 using Const = ConstVariantWithSignedIntegerSelectorFieldClass;
2608 using NonConst = VariantWithSignedIntegerSelectorFieldClass;
2609};
2610
2611template <>
2612struct TypeDescr<VariantWithSignedIntegerSelectorFieldClass> :
2613 public VariantWithSignedIntegerSelectorFieldClassTypeDescr
2614{
2615};
2616
2617template <>
2618struct TypeDescr<ConstVariantWithSignedIntegerSelectorFieldClass> :
2619 public VariantWithSignedIntegerSelectorFieldClassTypeDescr
2620{
2621};
2622
2623} /* namespace internal */
2624
12435a68
PP
2625template <typename LibObjT>
2626CommonBitArrayFieldClass<LibObjT> CommonFieldClass<LibObjT>::asBitArray() const noexcept
2627{
2628 BT_ASSERT_DBG(this->isBitArray());
341a67c4 2629 return CommonBitArrayFieldClass<LibObjT> {this->libObjPtr()};
12435a68
PP
2630}
2631
2632template <typename LibObjT>
2633CommonIntegerFieldClass<LibObjT> CommonFieldClass<LibObjT>::asInteger() const noexcept
2634{
2635 BT_ASSERT_DBG(this->isInteger());
341a67c4 2636 return CommonIntegerFieldClass<LibObjT> {this->libObjPtr()};
12435a68
PP
2637}
2638
be6aa636
FD
2639template <typename LibObjT>
2640CommonBaseEnumerationFieldClass<LibObjT> CommonFieldClass<LibObjT>::asEnumeration() const noexcept
2641{
2642 BT_ASSERT_DBG(this->isEnumeration());
341a67c4 2643 return CommonBaseEnumerationFieldClass<LibObjT> {this->libObjPtr()};
be6aa636
FD
2644}
2645
12435a68
PP
2646template <typename LibObjT>
2647CommonEnumerationFieldClass<LibObjT, ConstUnsignedEnumerationFieldClassMapping>
2648CommonFieldClass<LibObjT>::asUnsignedEnumeration() const noexcept
2649{
2650 BT_ASSERT_DBG(this->isUnsignedEnumeration());
2651 return CommonEnumerationFieldClass<LibObjT, ConstUnsignedEnumerationFieldClassMapping> {
341a67c4 2652 this->libObjPtr()};
12435a68
PP
2653}
2654
2655template <typename LibObjT>
2656CommonEnumerationFieldClass<LibObjT, ConstSignedEnumerationFieldClassMapping>
2657CommonFieldClass<LibObjT>::asSignedEnumeration() const noexcept
2658{
2659 BT_ASSERT_DBG(this->isSignedEnumeration());
2660 return CommonEnumerationFieldClass<LibObjT, ConstSignedEnumerationFieldClassMapping> {
341a67c4 2661 this->libObjPtr()};
12435a68
PP
2662}
2663
2664template <typename LibObjT>
2665CommonStructureFieldClass<LibObjT> CommonFieldClass<LibObjT>::asStructure() const noexcept
2666{
2667 BT_ASSERT_DBG(this->isStructure());
341a67c4 2668 return CommonStructureFieldClass<LibObjT> {this->libObjPtr()};
12435a68
PP
2669}
2670
2671template <typename LibObjT>
2672CommonArrayFieldClass<LibObjT> CommonFieldClass<LibObjT>::asArray() const noexcept
2673{
2674 BT_ASSERT_DBG(this->isArray());
341a67c4 2675 return CommonArrayFieldClass<LibObjT> {this->libObjPtr()};
12435a68
PP
2676}
2677
2678template <typename LibObjT>
2679CommonStaticArrayFieldClass<LibObjT> CommonFieldClass<LibObjT>::asStaticArray() const noexcept
2680{
2681 BT_ASSERT_DBG(this->isStaticArray());
341a67c4 2682 return CommonStaticArrayFieldClass<LibObjT> {this->libObjPtr()};
12435a68
PP
2683}
2684
2685template <typename LibObjT>
2686CommonDynamicArrayWithLengthFieldClass<LibObjT>
2687CommonFieldClass<LibObjT>::asDynamicArrayWithLength() const noexcept
2688{
2689 BT_ASSERT_DBG(this->isDynamicArrayWithLength());
341a67c4 2690 return CommonDynamicArrayWithLengthFieldClass<LibObjT> {this->libObjPtr()};
12435a68
PP
2691}
2692
2693template <typename LibObjT>
2694CommonOptionFieldClass<LibObjT> CommonFieldClass<LibObjT>::asOption() const noexcept
2695{
2696 BT_ASSERT_DBG(this->isOption());
341a67c4 2697 return CommonOptionFieldClass<LibObjT> {this->libObjPtr()};
12435a68
PP
2698}
2699
2700template <typename LibObjT>
2701CommonOptionWithSelectorFieldClass<LibObjT>
2702CommonFieldClass<LibObjT>::asOptionWithSelector() const noexcept
2703{
2704 BT_ASSERT_DBG(this->isOptionWithSelector());
341a67c4 2705 return CommonOptionWithSelectorFieldClass<LibObjT> {this->libObjPtr()};
12435a68
PP
2706}
2707
2708template <typename LibObjT>
2709CommonOptionWithBoolSelectorFieldClass<LibObjT>
2710CommonFieldClass<LibObjT>::asOptionWithBoolSelector() const noexcept
2711{
2712 BT_ASSERT_DBG(this->isOptionWithBoolSelector());
341a67c4 2713 return CommonOptionWithBoolSelectorFieldClass<LibObjT> {this->libObjPtr()};
12435a68
PP
2714}
2715
2716template <typename LibObjT>
2717CommonOptionWithIntegerSelectorFieldClass<LibObjT, ConstUnsignedIntegerRangeSet>
2718CommonFieldClass<LibObjT>::asOptionWithUnsignedIntegerSelector() const noexcept
2719{
2720 BT_ASSERT_DBG(this->isOptionWithUnsignedIntegerSelector());
2721 return CommonOptionWithIntegerSelectorFieldClass<LibObjT, ConstUnsignedIntegerRangeSet> {
341a67c4 2722 this->libObjPtr()};
12435a68
PP
2723}
2724
2725template <typename LibObjT>
2726CommonOptionWithIntegerSelectorFieldClass<LibObjT, ConstSignedIntegerRangeSet>
2727CommonFieldClass<LibObjT>::asOptionWithSignedIntegerSelector() const noexcept
2728{
2729 BT_ASSERT_DBG(this->isOptionWithSignedIntegerSelector());
2730 return CommonOptionWithIntegerSelectorFieldClass<LibObjT, ConstSignedIntegerRangeSet> {
341a67c4 2731 this->libObjPtr()};
12435a68
PP
2732}
2733
2734template <typename LibObjT>
2735CommonVariantFieldClass<LibObjT> CommonFieldClass<LibObjT>::asVariant() const noexcept
2736{
2737 BT_ASSERT_DBG(this->isVariant());
341a67c4 2738 return CommonVariantFieldClass<LibObjT> {this->libObjPtr()};
12435a68
PP
2739}
2740
2741template <typename LibObjT>
2742CommonVariantWithoutSelectorFieldClass<LibObjT>
2743CommonFieldClass<LibObjT>::asVariantWithoutSelector() const noexcept
2744{
2745 BT_ASSERT_DBG(this->isVariantWithoutSelector());
341a67c4 2746 return CommonVariantWithoutSelectorFieldClass<LibObjT> {this->libObjPtr()};
12435a68
PP
2747}
2748
2749template <typename LibObjT>
cefe03a2
FD
2750CommonVariantWithSelectorFieldClass<LibObjT>
2751CommonFieldClass<LibObjT>::asVariantWithSelector() const noexcept
2752{
2753 BT_ASSERT_DBG(this->isVariantWithSelector());
341a67c4 2754 return CommonVariantWithSelectorFieldClass<LibObjT> {this->libObjPtr()};
cefe03a2
FD
2755}
2756
2757template <typename LibObjT>
12435a68
PP
2758CommonVariantWithIntegerSelectorFieldClass<LibObjT,
2759 ConstVariantWithUnsignedIntegerSelectorFieldClassOption>
2760CommonFieldClass<LibObjT>::asVariantWithUnsignedIntegerSelector() const noexcept
2761{
2762 BT_ASSERT_DBG(this->isVariantWithUnsignedIntegerSelector());
2763 return CommonVariantWithIntegerSelectorFieldClass<
341a67c4 2764 LibObjT, ConstVariantWithUnsignedIntegerSelectorFieldClassOption> {this->libObjPtr()};
12435a68
PP
2765}
2766
2767template <typename LibObjT>
2768CommonVariantWithIntegerSelectorFieldClass<LibObjT,
2769 ConstVariantWithSignedIntegerSelectorFieldClassOption>
2770CommonFieldClass<LibObjT>::asVariantWithSignedIntegerSelector() const noexcept
2771{
2772 BT_ASSERT_DBG(this->isVariantWithSignedIntegerSelector());
2773 return CommonVariantWithIntegerSelectorFieldClass<
341a67c4 2774 LibObjT, ConstVariantWithSignedIntegerSelectorFieldClassOption> {this->libObjPtr()};
12435a68
PP
2775}
2776
b5f55e9f 2777} /* namespace bt2 */
12435a68 2778
b5f55e9f 2779#endif /* BABELTRACE_CPP_COMMON_BT2_FIELD_CLASS_HPP */
This page took 0.154475 seconds and 4 git commands to generate.