2 * Copyright (c) 2020 Philippe Proulx <pproulx@efficios.com>
4 * SPDX-License-Identifier: MIT
7 #ifndef BABELTRACE_CPP_COMMON_BT2_FIELD_HPP
8 #define BABELTRACE_CPP_COMMON_BT2_FIELD_HPP
11 #include <type_traits>
13 #include <babeltrace2/babeltrace.h>
15 #include "common/assert.h"
16 #include "cpp-common/optional.hpp"
17 #include "cpp-common/string_view.hpp"
19 #include "borrowed-object.hpp"
20 #include "field-class.hpp"
21 #include "internal/utils.hpp"
22 #include "raw-value-proxy.hpp"
26 template <typename LibObjT>
27 class CommonBoolField;
29 template <typename LibObjT>
30 class CommonBitArrayField;
32 template <typename LibObjT>
33 class CommonUnsignedIntegerField;
35 template <typename LibObjT>
36 class CommonSignedIntegerField;
38 template <typename LibObjT>
39 class CommonUnsignedEnumerationField;
41 template <typename LibObjT>
42 class CommonSignedEnumerationField;
44 template <typename LibObjT>
45 class CommonSinglePrecisionRealField;
47 template <typename LibObjT>
48 class CommonDoublePrecisionRealField;
50 template <typename LibObjT>
51 class CommonStringField;
53 template <typename LibObjT>
54 class CommonStructureField;
56 template <typename LibObjT>
57 class CommonArrayField;
59 template <typename LibObjT>
60 class CommonDynamicArrayField;
62 template <typename LibObjT>
63 class CommonOptionField;
65 template <typename LibObjT>
66 class CommonVariantField;
70 template <typename LibObjT>
71 struct CommonFieldSpec;
73 /* Functions specific to mutable fields */
75 struct CommonFieldSpec<bt_field> final
77 static bt_field_class *cls(bt_field * const libObjPtr) noexcept
79 return bt_field_borrow_class(libObjPtr);
83 /* Functions specific to constant fields */
85 struct CommonFieldSpec<const bt_field> final
87 static const bt_field_class *cls(const bt_field * const libObjPtr) noexcept
89 return bt_field_borrow_class_const(libObjPtr);
93 } /* namespace internal */
95 template <typename LibObjT>
96 class CommonField : public BorrowedObject<LibObjT>
99 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
102 using typename BorrowedObject<LibObjT>::_LibObjPtr;
103 using _ThisCommonField = CommonField<LibObjT>;
106 using Class = internal::DepFc<LibObjT>;
108 explicit CommonField(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
112 template <typename OtherLibObjT>
113 CommonField(const CommonField<OtherLibObjT> val) noexcept : _ThisBorrowedObject {val}
117 template <typename OtherLibObjT>
118 _ThisCommonField& operator=(const CommonField<OtherLibObjT> val) noexcept
120 _ThisBorrowedObject::operator=(val);
124 CommonField<const bt_field> asConst() const noexcept
126 return CommonField<const bt_field> {*this};
129 FieldClassType classType() const noexcept
131 return static_cast<FieldClassType>(bt_field_get_class_type(this->libObjPtr()));
134 Class cls() const noexcept
136 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
139 bool isBool() const noexcept
141 return this->cls().isBool();
144 bool isBitArray() const noexcept
146 return this->cls().isBitArray();
149 bool isUnsignedInteger() const noexcept
151 return this->cls().isUnsignedInteger();
154 bool isSignedInteger() const noexcept
156 return this->cls().isSignedInteger();
159 bool isUnsignedEnumeration() const noexcept
161 return this->cls().isUnsignedEnumeration();
164 bool isSignedEnumeration() const noexcept
166 return this->cls().isSignedEnumeration();
169 bool isSinglePrecisionReal() const noexcept
171 return this->cls().isSinglePrecisionReal();
174 bool isDoublePrecisionReal() const noexcept
176 return this->cls().isDoublePrecisionReal();
179 bool isString() const noexcept
181 return this->cls().isString();
184 bool isStructure() const noexcept
186 return this->cls().isStructure();
189 bool isArray() const noexcept
191 return this->cls().isArray();
194 bool isDynamicArray() const noexcept
196 return this->cls().isDynamicArray();
199 bool isOption() const noexcept
201 return this->cls().isOption();
204 bool isVariant() const noexcept
206 return this->cls().isVariant();
209 template <typename FieldT>
210 FieldT as() const noexcept
212 return FieldT {this->libObjPtr()};
215 CommonBoolField<LibObjT> asBool() const noexcept;
216 CommonBitArrayField<LibObjT> asBitArray() const noexcept;
217 CommonUnsignedIntegerField<LibObjT> asUnsignedInteger() const noexcept;
218 CommonSignedIntegerField<LibObjT> asSignedInteger() const noexcept;
219 CommonUnsignedEnumerationField<LibObjT> asUnsignedEnumeration() const noexcept;
220 CommonSignedEnumerationField<LibObjT> asSignedEnumeration() const noexcept;
221 CommonSinglePrecisionRealField<LibObjT> asSinglePrecisionReal() const noexcept;
222 CommonDoublePrecisionRealField<LibObjT> asDoublePrecisionReal() const noexcept;
223 CommonStringField<LibObjT> asString() const noexcept;
224 CommonStructureField<LibObjT> asStructure() const noexcept;
225 CommonArrayField<LibObjT> asArray() const noexcept;
226 CommonDynamicArrayField<LibObjT> asDynamicArray() const noexcept;
227 CommonOptionField<LibObjT> asOption() const noexcept;
228 CommonVariantField<LibObjT> asVariant() const noexcept;
231 using Field = CommonField<bt_field>;
232 using ConstField = CommonField<const bt_field>;
236 struct FieldTypeDescr
238 using Const = ConstField;
239 using NonConst = Field;
243 struct TypeDescr<Field> : public FieldTypeDescr
248 struct TypeDescr<ConstField> : public FieldTypeDescr
252 } /* namespace internal */
254 template <typename LibObjT>
255 class CommonBoolField final : public CommonField<LibObjT>
258 using typename CommonField<LibObjT>::_LibObjPtr;
259 using typename CommonField<LibObjT>::_ThisCommonField;
264 explicit CommonBoolField(const _LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
266 BT_ASSERT_DBG(this->isBool());
269 template <typename OtherLibObjT>
270 CommonBoolField(const CommonBoolField<OtherLibObjT> val) noexcept : _ThisCommonField {val}
274 template <typename OtherLibObjT>
275 CommonBoolField<LibObjT>& operator=(const CommonBoolField<OtherLibObjT> val) noexcept
277 _ThisCommonField::operator=(val);
281 CommonBoolField<const bt_field> asConst() const noexcept
283 return CommonBoolField<const bt_field> {*this};
286 RawValueProxy<CommonBoolField> operator*() const noexcept
288 return RawValueProxy<CommonBoolField> {*this};
291 void value(const Value val) const noexcept
293 static_assert(!std::is_const<LibObjT>::value, "Not available with `bt2::ConstBoolField`.");
295 bt_field_bool_set_value(this->libObjPtr(), static_cast<bt_bool>(val));
298 Value value() const noexcept
300 return static_cast<Value>(bt_field_bool_get_value(this->libObjPtr()));
304 using BoolField = CommonBoolField<bt_field>;
305 using ConstBoolField = CommonBoolField<const bt_field>;
309 struct BoolFieldTypeDescr
311 using Const = ConstBoolField;
312 using NonConst = BoolField;
316 struct TypeDescr<BoolField> : public BoolFieldTypeDescr
321 struct TypeDescr<ConstBoolField> : public BoolFieldTypeDescr
325 } /* namespace internal */
327 template <typename LibObjT>
328 class CommonBitArrayField final : public CommonField<LibObjT>
331 using typename CommonField<LibObjT>::_LibObjPtr;
332 using typename CommonField<LibObjT>::_ThisCommonField;
335 using Class = internal::DepType<LibObjT, BitArrayFieldClass, ConstBitArrayFieldClass>;
337 explicit CommonBitArrayField(const _LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
339 BT_ASSERT_DBG(this->isBitArray());
342 template <typename OtherLibObjT>
343 CommonBitArrayField(const CommonBitArrayField<OtherLibObjT> val) noexcept :
344 _ThisCommonField {val}
348 template <typename OtherLibObjT>
349 CommonBitArrayField<LibObjT>& operator=(const CommonBitArrayField<OtherLibObjT> val) noexcept
351 _ThisCommonField::operator=(val);
355 CommonBitArrayField<const bt_field> asConst() const noexcept
357 return CommonBitArrayField<const bt_field> {*this};
360 ConstBitArrayFieldClass cls() const noexcept
362 return ConstBitArrayFieldClass {
363 internal::CommonFieldSpec<const bt_field>::cls(this->libObjPtr())};
368 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
371 void valueAsInteger(const std::uint64_t bits) const noexcept
373 static_assert(!std::is_const<LibObjT>::value,
374 "Not available with `bt2::ConstBitArrayField`.");
376 bt_field_bit_array_set_value_as_integer(this->libObjPtr(), bits);
379 std::uint64_t valueAsInteger() const noexcept
381 return bt_field_bit_array_get_value_as_integer(this->libObjPtr());
384 bool bitValue(const std::uint64_t index) const noexcept
386 BT_ASSERT_DBG(index < this->cls().length());
387 return static_cast<bool>(this->valueAsInteger() & (1ULL << index));
391 using BitArrayField = CommonBitArrayField<bt_field>;
392 using ConstBitArrayField = CommonBitArrayField<const bt_field>;
396 struct BitArrayFieldTypeDescr
398 using Const = ConstBitArrayField;
399 using NonConst = BitArrayField;
403 struct TypeDescr<BitArrayField> : public BitArrayFieldTypeDescr
408 struct TypeDescr<ConstBitArrayField> : public BitArrayFieldTypeDescr
412 } /* namespace internal */
414 template <typename LibObjT>
415 class CommonUnsignedIntegerField : public CommonField<LibObjT>
418 using typename CommonField<LibObjT>::_ThisCommonField;
421 using typename CommonField<LibObjT>::_LibObjPtr;
422 using _ThisCommonUnsignedIntegerField = CommonUnsignedIntegerField<LibObjT>;
425 using Value = std::uint64_t;
426 using Class = internal::DepType<LibObjT, IntegerFieldClass, ConstIntegerFieldClass>;
428 explicit CommonUnsignedIntegerField(const _LibObjPtr libObjPtr) noexcept :
429 _ThisCommonField {libObjPtr}
431 BT_ASSERT_DBG(this->isUnsignedInteger());
434 template <typename OtherLibObjT>
435 CommonUnsignedIntegerField(const CommonUnsignedIntegerField<OtherLibObjT> val) noexcept :
436 _ThisCommonField {val}
440 template <typename OtherLibObjT>
441 _ThisCommonUnsignedIntegerField&
442 operator=(const CommonUnsignedIntegerField<OtherLibObjT> val) noexcept
444 _ThisCommonField::operator=(val);
448 CommonUnsignedIntegerField<const bt_field> asConst() const noexcept
450 return CommonUnsignedIntegerField<const bt_field> {*this};
453 Class cls() const noexcept
455 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
458 RawValueProxy<CommonUnsignedIntegerField> operator*() const noexcept
460 return RawValueProxy<CommonUnsignedIntegerField> {*this};
463 void value(const Value val) const noexcept
465 static_assert(!std::is_const<LibObjT>::value,
466 "Not available with `bt2::ConstUnsignedIntegerField`.");
468 bt_field_integer_unsigned_set_value(this->libObjPtr(), val);
471 Value value() const noexcept
473 return bt_field_integer_unsigned_get_value(this->libObjPtr());
477 using UnsignedIntegerField = CommonUnsignedIntegerField<bt_field>;
478 using ConstUnsignedIntegerField = CommonUnsignedIntegerField<const bt_field>;
482 struct UnsignedIntegerFieldTypeDescr
484 using Const = ConstUnsignedIntegerField;
485 using NonConst = UnsignedIntegerField;
489 struct TypeDescr<UnsignedIntegerField> : public UnsignedIntegerFieldTypeDescr
494 struct TypeDescr<ConstUnsignedIntegerField> : public UnsignedIntegerFieldTypeDescr
498 } /* namespace internal */
500 template <typename LibObjT>
501 class CommonSignedIntegerField : public CommonField<LibObjT>
504 using typename CommonField<LibObjT>::_ThisCommonField;
507 using typename CommonField<LibObjT>::_LibObjPtr;
508 using _ThisCommonSignedIntegerField = CommonSignedIntegerField<LibObjT>;
511 using Value = std::int64_t;
512 using Class = internal::DepType<LibObjT, IntegerFieldClass, ConstIntegerFieldClass>;
514 explicit CommonSignedIntegerField(const _LibObjPtr libObjPtr) noexcept :
515 _ThisCommonField {libObjPtr}
517 BT_ASSERT_DBG(this->isSignedInteger());
520 template <typename OtherLibObjT>
521 CommonSignedIntegerField(const CommonSignedIntegerField<OtherLibObjT> val) noexcept :
522 _ThisCommonField {val}
526 template <typename OtherLibObjT>
527 _ThisCommonSignedIntegerField&
528 operator=(const CommonSignedIntegerField<OtherLibObjT> val) noexcept
530 _ThisCommonField::operator=(val);
534 CommonSignedIntegerField<const bt_field> asConst() const noexcept
536 return CommonSignedIntegerField<const bt_field> {*this};
539 Class cls() const noexcept
541 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
544 RawValueProxy<CommonSignedIntegerField> operator*() const noexcept
546 return RawValueProxy<CommonSignedIntegerField> {*this};
549 void value(const Value val) const noexcept
551 static_assert(!std::is_const<LibObjT>::value,
552 "Not available with `bt2::ConstSignedIntegerField`.");
554 bt_field_integer_signed_set_value(this->libObjPtr(), val);
557 Value value() const noexcept
559 return bt_field_integer_signed_get_value(this->libObjPtr());
563 using SignedIntegerField = CommonSignedIntegerField<bt_field>;
564 using ConstSignedIntegerField = CommonSignedIntegerField<const bt_field>;
568 struct SignedIntegerFieldTypeDescr
570 using Const = ConstSignedIntegerField;
571 using NonConst = SignedIntegerField;
575 struct TypeDescr<SignedIntegerField> : public SignedIntegerFieldTypeDescr
580 struct TypeDescr<ConstSignedIntegerField> : public SignedIntegerFieldTypeDescr
584 } /* namespace internal */
586 class EnumerationFieldClassMappingLabels
589 explicit EnumerationFieldClassMappingLabels(
590 const bt_field_class_enumeration_mapping_label_array labels, const std::uint64_t size) :
596 EnumerationFieldClassMappingLabels(const EnumerationFieldClassMappingLabels&) noexcept =
599 EnumerationFieldClassMappingLabels&
600 operator=(const EnumerationFieldClassMappingLabels&) noexcept = default;
602 std::uint64_t length() const noexcept
607 bpstd::string_view operator[](const std::uint64_t index) const noexcept
609 return _mLabels[index];
613 bt_field_class_enumeration_mapping_label_array _mLabels;
617 template <typename LibObjT>
618 class CommonUnsignedEnumerationField final : public CommonUnsignedIntegerField<LibObjT>
621 using typename CommonUnsignedIntegerField<LibObjT>::_ThisCommonUnsignedIntegerField;
622 using typename CommonField<LibObjT>::_LibObjPtr;
625 using Class = internal::DepType<LibObjT, UnsignedEnumerationFieldClass,
626 ConstUnsignedEnumerationFieldClass>;
628 explicit CommonUnsignedEnumerationField(const _LibObjPtr libObjPtr) noexcept :
629 _ThisCommonUnsignedIntegerField {libObjPtr}
631 BT_ASSERT_DBG(this->isUnsignedEnumeration());
634 template <typename OtherLibObjT>
635 CommonUnsignedEnumerationField(const CommonUnsignedEnumerationField<OtherLibObjT> val) noexcept
637 _ThisCommonUnsignedIntegerField {val}
641 template <typename OtherLibObjT>
642 CommonUnsignedEnumerationField<LibObjT>&
643 operator=(const CommonUnsignedEnumerationField<OtherLibObjT> val) noexcept
645 _ThisCommonUnsignedIntegerField::operator=(val);
649 CommonUnsignedEnumerationField<const bt_field> asConst() const noexcept
651 return CommonUnsignedEnumerationField<const bt_field> {*this};
654 Class cls() const noexcept
656 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
659 EnumerationFieldClassMappingLabels labels() const
661 bt_field_class_enumeration_mapping_label_array labelArray;
663 const auto status = bt_field_enumeration_unsigned_get_mapping_labels(this->libObjPtr(),
664 &labelArray, &count);
666 if (status == BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_MEMORY_ERROR) {
667 throw MemoryError {};
670 return EnumerationFieldClassMappingLabels {labelArray, count};
674 using UnsignedEnumerationField = CommonUnsignedEnumerationField<bt_field>;
675 using ConstUnsignedEnumerationField = CommonUnsignedEnumerationField<const bt_field>;
679 struct UnsignedEnumerationFieldTypeDescr
681 using Const = ConstUnsignedEnumerationField;
682 using NonConst = UnsignedEnumerationField;
686 struct TypeDescr<UnsignedEnumerationField> : public UnsignedEnumerationFieldTypeDescr
691 struct TypeDescr<ConstUnsignedEnumerationField> : public UnsignedEnumerationFieldTypeDescr
695 } /* namespace internal */
697 template <typename LibObjT>
698 class CommonSignedEnumerationField final : public CommonSignedIntegerField<LibObjT>
701 using typename CommonSignedIntegerField<LibObjT>::_ThisCommonSignedIntegerField;
702 using typename CommonField<LibObjT>::_LibObjPtr;
706 internal::DepType<LibObjT, SignedEnumerationFieldClass, ConstSignedEnumerationFieldClass>;
708 explicit CommonSignedEnumerationField(const _LibObjPtr libObjPtr) noexcept :
709 _ThisCommonSignedIntegerField {libObjPtr}
711 BT_ASSERT_DBG(this->isSignedEnumeration());
714 template <typename OtherLibObjT>
715 CommonSignedEnumerationField(const CommonSignedEnumerationField<OtherLibObjT> val) noexcept :
716 _ThisCommonSignedIntegerField {val}
720 template <typename OtherLibObjT>
721 CommonSignedEnumerationField<LibObjT>&
722 operator=(const CommonSignedEnumerationField<OtherLibObjT> val) noexcept
724 _ThisCommonSignedIntegerField::operator=(val);
728 CommonSignedEnumerationField<const bt_field> asConst() const noexcept
730 return CommonSignedEnumerationField<const bt_field> {*this};
733 Class cls() const noexcept
735 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
738 EnumerationFieldClassMappingLabels labels() const
740 bt_field_class_enumeration_mapping_label_array labelArray;
743 bt_field_enumeration_signed_get_mapping_labels(this->libObjPtr(), &labelArray, &count);
745 if (status == BT_FIELD_ENUMERATION_GET_MAPPING_LABELS_STATUS_MEMORY_ERROR) {
746 throw MemoryError {};
749 return EnumerationFieldClassMappingLabels {labelArray, count};
753 using SignedEnumerationField = CommonSignedEnumerationField<bt_field>;
754 using ConstSignedEnumerationField = CommonSignedEnumerationField<const bt_field>;
758 struct SignedEnumerationFieldTypeDescr
760 using Const = ConstSignedEnumerationField;
761 using NonConst = SignedEnumerationField;
765 struct TypeDescr<SignedEnumerationField> : public SignedEnumerationFieldTypeDescr
770 struct TypeDescr<ConstSignedEnumerationField> : public SignedEnumerationFieldTypeDescr
774 } /* namespace internal */
776 template <typename LibObjT>
777 class CommonSinglePrecisionRealField final : public CommonField<LibObjT>
780 using typename CommonField<LibObjT>::_LibObjPtr;
781 using typename CommonField<LibObjT>::_ThisCommonField;
786 explicit CommonSinglePrecisionRealField(const _LibObjPtr libObjPtr) noexcept :
787 _ThisCommonField {libObjPtr}
789 BT_ASSERT_DBG(this->isSinglePrecisionReal());
792 template <typename OtherLibObjT>
793 CommonSinglePrecisionRealField(const CommonSinglePrecisionRealField<OtherLibObjT> val) noexcept
795 _ThisCommonField {val}
799 template <typename OtherLibObjT>
800 CommonSinglePrecisionRealField<LibObjT>&
801 operator=(const CommonSinglePrecisionRealField<OtherLibObjT> val) noexcept
803 _ThisCommonField::operator=(val);
807 CommonSinglePrecisionRealField<const bt_field> asConst() const noexcept
809 return CommonSinglePrecisionRealField<const bt_field> {*this};
812 RawValueProxy<CommonSinglePrecisionRealField> operator*() const noexcept
814 return RawValueProxy<CommonSinglePrecisionRealField> {*this};
817 void value(const Value val) const noexcept
819 static_assert(!std::is_const<LibObjT>::value,
820 "Not available with `bt2::ConstSinglePrecisionRealField`.");
822 bt_field_real_single_precision_set_value(this->libObjPtr(), val);
825 Value value() const noexcept
827 return bt_field_real_single_precision_get_value(this->libObjPtr());
831 using SinglePrecisionRealField = CommonSinglePrecisionRealField<bt_field>;
832 using ConstSinglePrecisionRealField = CommonSinglePrecisionRealField<const bt_field>;
836 struct SinglePrecisionRealFieldTypeDescr
838 using Const = ConstSinglePrecisionRealField;
839 using NonConst = SinglePrecisionRealField;
843 struct TypeDescr<SinglePrecisionRealField> : public SinglePrecisionRealFieldTypeDescr
848 struct TypeDescr<ConstSinglePrecisionRealField> : public SinglePrecisionRealFieldTypeDescr
852 } /* namespace internal */
854 template <typename LibObjT>
855 class CommonDoublePrecisionRealField final : public CommonField<LibObjT>
858 using typename CommonField<LibObjT>::_LibObjPtr;
859 using typename CommonField<LibObjT>::_ThisCommonField;
862 using Value = double;
864 explicit CommonDoublePrecisionRealField(const _LibObjPtr libObjPtr) noexcept :
865 _ThisCommonField {libObjPtr}
867 BT_ASSERT_DBG(this->isDoublePrecisionReal());
870 template <typename OtherLibObjT>
871 CommonDoublePrecisionRealField(const CommonDoublePrecisionRealField<OtherLibObjT> val) noexcept
873 _ThisCommonField {val}
877 template <typename OtherLibObjT>
878 CommonDoublePrecisionRealField<LibObjT>&
879 operator=(const CommonDoublePrecisionRealField<OtherLibObjT> val) noexcept
881 _ThisCommonField::operator=(val);
885 CommonDoublePrecisionRealField<const bt_field> asConst() const noexcept
887 return CommonDoublePrecisionRealField<const bt_field> {*this};
890 RawValueProxy<CommonDoublePrecisionRealField> operator*() const noexcept
892 return RawValueProxy<CommonDoublePrecisionRealField> {*this};
895 void value(const Value val) const noexcept
897 static_assert(!std::is_const<LibObjT>::value,
898 "Not available with `bt2::ConstDoublePrecisionRealField`.");
900 bt_field_real_double_precision_set_value(this->libObjPtr(), val);
903 Value value() const noexcept
905 return bt_field_real_double_precision_get_value(this->libObjPtr());
909 using DoublePrecisionRealField = CommonDoublePrecisionRealField<bt_field>;
910 using ConstDoublePrecisionRealField = CommonDoublePrecisionRealField<const bt_field>;
914 struct DoublePrecisionRealFieldTypeDescr
916 using Const = ConstDoublePrecisionRealField;
917 using NonConst = DoublePrecisionRealField;
921 struct TypeDescr<DoublePrecisionRealField> : public DoublePrecisionRealFieldTypeDescr
926 struct TypeDescr<ConstDoublePrecisionRealField> : public DoublePrecisionRealFieldTypeDescr
930 } /* namespace internal */
932 template <typename LibObjT>
933 class CommonStringField final : public CommonField<LibObjT>
936 using typename CommonField<LibObjT>::_LibObjPtr;
937 using typename CommonField<LibObjT>::_ThisCommonField;
940 using Value = const char *;
942 explicit CommonStringField(const _LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
944 BT_ASSERT_DBG(this->isString());
947 template <typename OtherLibObjT>
948 CommonStringField(const CommonStringField<OtherLibObjT> val) noexcept : _ThisCommonField {val}
952 template <typename OtherLibObjT>
953 CommonStringField<LibObjT>& operator=(const CommonStringField<OtherLibObjT> val) noexcept
955 _ThisCommonField::operator=(val);
959 CommonStringField<const bt_field> asConst() const noexcept
961 return CommonStringField<const bt_field> {*this};
964 RawStringValueProxy<CommonStringField> operator*() const noexcept
966 return RawStringValueProxy<CommonStringField> {*this};
969 void value(const char * const val) const
971 static_assert(!std::is_const<LibObjT>::value,
972 "Not available with `bt2::ConstStringField`.");
974 const auto status = bt_field_string_set_value(this->libObjPtr(), val);
976 if (status == BT_FIELD_STRING_SET_VALUE_STATUS_MEMORY_ERROR) {
977 throw MemoryError {};
981 void value(const std::string& val) const
983 this->value(val.data());
986 void append(const char * const begin, const std::uint64_t len) const
988 static_assert(!std::is_const<LibObjT>::value,
989 "Not available with `bt2::ConstStringField`.");
991 const auto status = bt_field_string_append_with_length(this->libObjPtr(), begin, len);
993 if (status == BT_FIELD_STRING_APPEND_STATUS_MEMORY_ERROR) {
994 throw MemoryError {};
998 void append(const std::string& val) const
1000 this->append(val.data(), val.size());
1003 void clear() const noexcept
1005 static_assert(!std::is_const<LibObjT>::value,
1006 "Not available with `bt2::ConstStringField`.");
1008 bt_field_string_clear(this->libObjPtr());
1011 const char *value() const noexcept
1013 return bt_field_string_get_value(this->libObjPtr());
1017 using StringField = CommonStringField<bt_field>;
1018 using ConstStringField = CommonStringField<const bt_field>;
1020 namespace internal {
1022 struct StringFieldTypeDescr
1024 using Const = ConstStringField;
1025 using NonConst = StringField;
1029 struct TypeDescr<StringField> : public StringFieldTypeDescr
1034 struct TypeDescr<ConstStringField> : public StringFieldTypeDescr
1038 template <typename LibObjT>
1039 struct CommonStructureFieldSpec;
1041 /* Functions specific to mutable structure fields */
1043 struct CommonStructureFieldSpec<bt_field> final
1045 static bt_field *memberFieldByIndex(bt_field * const libObjPtr,
1046 const std::uint64_t index) noexcept
1048 return bt_field_structure_borrow_member_field_by_index(libObjPtr, index);
1051 static bt_field *memberFieldByName(bt_field * const libObjPtr, const char * const name) noexcept
1053 return bt_field_structure_borrow_member_field_by_name(libObjPtr, name);
1057 /* Functions specific to constant structure fields */
1059 struct CommonStructureFieldSpec<const bt_field> final
1061 static const bt_field *memberFieldByIndex(const bt_field * const libObjPtr,
1062 const std::uint64_t index) noexcept
1064 return bt_field_structure_borrow_member_field_by_index_const(libObjPtr, index);
1067 static const bt_field *memberFieldByName(const bt_field * const libObjPtr,
1068 const char * const name) noexcept
1070 return bt_field_structure_borrow_member_field_by_name_const(libObjPtr, name);
1074 } /* namespace internal */
1076 template <typename LibObjT>
1077 class CommonStructureField final : public CommonField<LibObjT>
1080 using typename CommonField<LibObjT>::_LibObjPtr;
1081 using typename CommonField<LibObjT>::_ThisCommonField;
1082 using _Spec = internal::CommonStructureFieldSpec<LibObjT>;
1085 using Class = internal::DepType<LibObjT, StructureFieldClass, ConstStructureFieldClass>;
1087 explicit CommonStructureField(const _LibObjPtr libObjPtr) noexcept :
1088 _ThisCommonField {libObjPtr}
1090 BT_ASSERT_DBG(this->isStructure());
1093 template <typename OtherLibObjT>
1094 CommonStructureField(const CommonStructureField<OtherLibObjT> val) noexcept :
1095 _ThisCommonField {val}
1099 template <typename OtherLibObjT>
1100 CommonStructureField<LibObjT>& operator=(const CommonStructureField<OtherLibObjT> val) noexcept
1102 _ThisCommonField::operator=(val);
1106 CommonStructureField<const bt_field> asConst() const noexcept
1108 return CommonStructureField<const bt_field> {*this};
1111 Class cls() const noexcept
1113 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
1116 std::uint64_t length() const noexcept
1118 return this->cls().length();
1121 CommonField<LibObjT> operator[](const std::uint64_t index) const noexcept
1123 return CommonField<LibObjT> {_Spec::memberFieldByIndex(this->libObjPtr(), index)};
1126 nonstd::optional<CommonField<LibObjT>> operator[](const char * const name) const noexcept
1128 const auto libObjPtr = _Spec::memberFieldByName(this->libObjPtr(), name);
1131 return CommonField<LibObjT> {libObjPtr};
1134 return nonstd::nullopt;
1137 nonstd::optional<CommonField<LibObjT>> operator[](const std::string& name) const noexcept
1139 return (*this)[name.data()];
1143 using StructureField = CommonStructureField<bt_field>;
1144 using ConstStructureField = CommonStructureField<const bt_field>;
1146 namespace internal {
1148 struct StructureFieldTypeDescr
1150 using Const = ConstStructureField;
1151 using NonConst = StructureField;
1155 struct TypeDescr<StructureField> : public StructureFieldTypeDescr
1160 struct TypeDescr<ConstStructureField> : public StructureFieldTypeDescr
1164 template <typename LibObjT>
1165 struct CommonArrayFieldSpec;
1167 /* Functions specific to mutable array fields */
1169 struct CommonArrayFieldSpec<bt_field> final
1171 static bt_field *elementFieldByIndex(bt_field * const libObjPtr,
1172 const std::uint64_t index) noexcept
1174 return bt_field_array_borrow_element_field_by_index(libObjPtr, index);
1178 /* Functions specific to constant array fields */
1180 struct CommonArrayFieldSpec<const bt_field> final
1182 static const bt_field *elementFieldByIndex(const bt_field * const libObjPtr,
1183 const std::uint64_t index) noexcept
1185 return bt_field_array_borrow_element_field_by_index_const(libObjPtr, index);
1189 } /* namespace internal */
1191 template <typename LibObjT>
1192 class CommonArrayField : public CommonField<LibObjT>
1195 using typename CommonField<LibObjT>::_ThisCommonField;
1196 using _Spec = internal::CommonArrayFieldSpec<LibObjT>;
1199 using typename CommonField<LibObjT>::_LibObjPtr;
1200 using _ThisCommonArrayField = CommonArrayField<LibObjT>;
1203 using Class = internal::DepType<LibObjT, ArrayFieldClass, ConstArrayFieldClass>;
1205 explicit CommonArrayField(const _LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
1207 BT_ASSERT_DBG(this->isArray());
1210 template <typename OtherLibObjT>
1211 CommonArrayField(const CommonArrayField<OtherLibObjT> val) noexcept : _ThisCommonField {val}
1215 template <typename OtherLibObjT>
1216 _ThisCommonArrayField& operator=(const CommonArrayField<OtherLibObjT> val) noexcept
1218 _ThisCommonField::operator=(val);
1222 CommonArrayField<const bt_field> asConst() const noexcept
1224 return CommonArrayField<const bt_field> {*this};
1227 Class cls() const noexcept
1229 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
1232 std::uint64_t length() const noexcept
1234 return bt_field_array_get_length(this->libObjPtr());
1237 CommonField<LibObjT> operator[](const std::uint64_t index) const noexcept
1239 return CommonField<LibObjT> {_Spec::elementFieldByIndex(this->libObjPtr(), index)};
1243 using ArrayField = CommonArrayField<bt_field>;
1244 using ConstArrayField = CommonArrayField<const bt_field>;
1246 namespace internal {
1248 struct ArrayFieldTypeDescr
1250 using Const = ConstArrayField;
1251 using NonConst = ArrayField;
1255 struct TypeDescr<ArrayField> : public ArrayFieldTypeDescr
1260 struct TypeDescr<ConstArrayField> : public ArrayFieldTypeDescr
1264 } /* namespace internal */
1266 template <typename LibObjT>
1267 class CommonDynamicArrayField : public CommonArrayField<LibObjT>
1270 using typename CommonField<LibObjT>::_LibObjPtr;
1271 using typename CommonArrayField<LibObjT>::_ThisCommonArrayField;
1274 explicit CommonDynamicArrayField(const _LibObjPtr libObjPtr) noexcept :
1275 _ThisCommonArrayField {libObjPtr}
1277 BT_ASSERT_DBG(this->isDynamicArray());
1280 template <typename OtherLibObjT>
1281 CommonDynamicArrayField(const CommonDynamicArrayField<OtherLibObjT> val) noexcept :
1282 _ThisCommonArrayField {val}
1286 template <typename OtherLibObjT>
1287 CommonDynamicArrayField<LibObjT>&
1288 operator=(const CommonDynamicArrayField<OtherLibObjT> val) noexcept
1290 _ThisCommonArrayField::operator=(val);
1294 CommonDynamicArrayField<const bt_field> asConst() const noexcept
1296 return CommonDynamicArrayField<const bt_field> {*this};
1299 std::uint64_t length() const noexcept
1301 return _ThisCommonArrayField::length();
1304 void length(const std::uint64_t length) const
1306 static_assert(!std::is_const<LibObjT>::value,
1307 "Not available with `bt2::ConstDynamicArrayField`.");
1309 const auto status = bt_field_array_dynamic_set_length(this->libObjPtr(), length);
1311 if (status == BT_FIELD_DYNAMIC_ARRAY_SET_LENGTH_STATUS_MEMORY_ERROR) {
1312 throw MemoryError {};
1317 using DynamicArrayField = CommonDynamicArrayField<bt_field>;
1318 using ConstDynamicArrayField = CommonDynamicArrayField<const bt_field>;
1320 namespace internal {
1322 struct DynamicArrayFieldTypeDescr
1324 using Const = ConstDynamicArrayField;
1325 using NonConst = DynamicArrayField;
1329 struct TypeDescr<DynamicArrayField> : public DynamicArrayFieldTypeDescr
1334 struct TypeDescr<ConstDynamicArrayField> : public DynamicArrayFieldTypeDescr
1338 template <typename LibObjT>
1339 struct CommonOptionFieldSpec;
1341 /* Functions specific to mutable option fields */
1343 struct CommonOptionFieldSpec<bt_field> final
1345 static bt_field *field(bt_field * const libObjPtr) noexcept
1347 return bt_field_option_borrow_field(libObjPtr);
1351 /* Functions specific to constant option fields */
1353 struct CommonOptionFieldSpec<const bt_field> final
1355 static const bt_field *field(const bt_field * const libObjPtr) noexcept
1357 return bt_field_option_borrow_field_const(libObjPtr);
1361 } /* namespace internal */
1363 template <typename LibObjT>
1364 class CommonOptionField : public CommonField<LibObjT>
1367 using typename CommonField<LibObjT>::_LibObjPtr;
1368 using typename CommonField<LibObjT>::_ThisCommonField;
1369 using _Spec = internal::CommonOptionFieldSpec<LibObjT>;
1372 using Class = internal::DepType<LibObjT, OptionFieldClass, ConstOptionFieldClass>;
1374 explicit CommonOptionField(const _LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
1376 BT_ASSERT_DBG(this->isOption());
1379 template <typename OtherLibObjT>
1380 CommonOptionField(const CommonOptionField<OtherLibObjT> val) noexcept : _ThisCommonField {val}
1384 template <typename OtherLibObjT>
1385 CommonOptionField<LibObjT>& operator=(const CommonOptionField<OtherLibObjT> val) noexcept
1387 _ThisCommonField::operator=(val);
1391 CommonOptionField<const bt_field> asConst() const noexcept
1393 return CommonOptionField<const bt_field> {*this};
1396 Class cls() const noexcept
1398 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
1401 void hasField(const bool hasField) const noexcept
1403 static_assert(!std::is_const<LibObjT>::value,
1404 "Not available with `bt2::ConstOptionField`.");
1406 bt_field_option_set_has_field(this->libObjPtr(), static_cast<bt_bool>(hasField));
1409 bool hasField() const noexcept
1411 return this->field().has_value();
1414 nonstd::optional<CommonField<LibObjT>> field() const noexcept
1416 const auto libObjPtr = _Spec::field(this->libObjPtr());
1419 return CommonField<LibObjT> {libObjPtr};
1422 return nonstd::nullopt;
1426 using OptionField = CommonOptionField<bt_field>;
1427 using ConstOptionField = CommonOptionField<const bt_field>;
1429 namespace internal {
1431 struct OptionFieldTypeDescr
1433 using Const = ConstOptionField;
1434 using NonConst = OptionField;
1438 struct TypeDescr<OptionField> : public OptionFieldTypeDescr
1443 struct TypeDescr<ConstOptionField> : public OptionFieldTypeDescr
1447 template <typename LibObjT>
1448 struct CommonVariantFieldSpec;
1450 /* Functions specific to mutable variant fields */
1452 struct CommonVariantFieldSpec<bt_field> final
1454 static bt_field *selectedOptionField(bt_field * const libObjPtr) noexcept
1456 return bt_field_variant_borrow_selected_option_field(libObjPtr);
1460 /* Functions specific to constant variant fields */
1462 struct CommonVariantFieldSpec<const bt_field> final
1464 static const bt_field *selectedOptionField(const bt_field * const libObjPtr) noexcept
1466 return bt_field_variant_borrow_selected_option_field_const(libObjPtr);
1470 } /* namespace internal */
1472 template <typename LibObjT>
1473 class CommonVariantField : public CommonField<LibObjT>
1476 using typename CommonField<LibObjT>::_LibObjPtr;
1477 using typename CommonField<LibObjT>::_ThisCommonField;
1478 using _Spec = internal::CommonVariantFieldSpec<LibObjT>;
1481 using Class = internal::DepType<LibObjT, VariantFieldClass, ConstVariantFieldClass>;
1483 explicit CommonVariantField(const _LibObjPtr libObjPtr) noexcept : _ThisCommonField {libObjPtr}
1485 BT_ASSERT_DBG(this->isVariant());
1488 template <typename OtherLibObjT>
1489 CommonVariantField(const CommonVariantField<OtherLibObjT> val) noexcept : _ThisCommonField {val}
1493 template <typename OtherLibObjT>
1494 CommonVariantField<LibObjT>& operator=(const CommonVariantField<OtherLibObjT> val) noexcept
1496 _ThisCommonField::operator=(val);
1500 CommonVariantField<const bt_field> asConst() const noexcept
1502 return CommonVariantField<const bt_field> {*this};
1505 Class cls() const noexcept
1507 return Class {internal::CommonFieldSpec<LibObjT>::cls(this->libObjPtr())};
1510 void selectOption(const std::uint64_t index) const noexcept
1512 static_assert(!std::is_const<LibObjT>::value,
1513 "Not available with `bt2::ConstVariantField`.");
1515 static_cast<void>(bt_field_variant_select_option_by_index(this->libObjPtr(), index));
1518 CommonField<LibObjT> selectedOptionField() const noexcept
1520 return CommonField<LibObjT> {_Spec::selectedOptionField(this->libObjPtr())};
1523 std::uint64_t selectedOptionIndex() const noexcept
1525 return bt_field_variant_get_selected_option_index(this->libObjPtr());
1529 using VariantField = CommonVariantField<bt_field>;
1530 using ConstVariantField = CommonVariantField<const bt_field>;
1532 namespace internal {
1534 struct VariantFieldTypeDescr
1536 using Const = ConstVariantField;
1537 using NonConst = VariantField;
1541 struct TypeDescr<VariantField> : public VariantFieldTypeDescr
1546 struct TypeDescr<ConstVariantField> : public VariantFieldTypeDescr
1550 } /* namespace internal */
1552 template <typename LibObjT>
1553 CommonBoolField<LibObjT> CommonField<LibObjT>::asBool() const noexcept
1555 BT_ASSERT_DBG(this->isBool());
1556 return CommonBoolField<LibObjT> {this->libObjPtr()};
1559 template <typename LibObjT>
1560 CommonBitArrayField<LibObjT> CommonField<LibObjT>::asBitArray() const noexcept
1562 BT_ASSERT_DBG(this->isBitArray());
1563 return CommonBitArrayField<LibObjT> {this->libObjPtr()};
1566 template <typename LibObjT>
1567 CommonUnsignedIntegerField<LibObjT> CommonField<LibObjT>::asUnsignedInteger() const noexcept
1569 BT_ASSERT_DBG(this->isUnsignedInteger());
1570 return CommonUnsignedIntegerField<LibObjT> {this->libObjPtr()};
1573 template <typename LibObjT>
1574 CommonSignedIntegerField<LibObjT> CommonField<LibObjT>::asSignedInteger() const noexcept
1576 BT_ASSERT_DBG(this->isSignedInteger());
1577 return CommonSignedIntegerField<LibObjT> {this->libObjPtr()};
1580 template <typename LibObjT>
1581 CommonUnsignedEnumerationField<LibObjT> CommonField<LibObjT>::asUnsignedEnumeration() const noexcept
1583 BT_ASSERT_DBG(this->isUnsignedEnumeration());
1584 return CommonUnsignedEnumerationField<LibObjT> {this->libObjPtr()};
1587 template <typename LibObjT>
1588 CommonSignedEnumerationField<LibObjT> CommonField<LibObjT>::asSignedEnumeration() const noexcept
1590 BT_ASSERT_DBG(this->isSignedEnumeration());
1591 return CommonSignedEnumerationField<LibObjT> {this->libObjPtr()};
1594 template <typename LibObjT>
1595 CommonSinglePrecisionRealField<LibObjT> CommonField<LibObjT>::asSinglePrecisionReal() const noexcept
1597 BT_ASSERT_DBG(this->isSinglePrecisionReal());
1598 return CommonSinglePrecisionRealField<LibObjT> {this->libObjPtr()};
1601 template <typename LibObjT>
1602 CommonDoublePrecisionRealField<LibObjT> CommonField<LibObjT>::asDoublePrecisionReal() const noexcept
1604 BT_ASSERT_DBG(this->isDoublePrecisionReal());
1605 return CommonDoublePrecisionRealField<LibObjT> {this->libObjPtr()};
1608 template <typename LibObjT>
1609 CommonStringField<LibObjT> CommonField<LibObjT>::asString() const noexcept
1611 BT_ASSERT_DBG(this->isString());
1612 return CommonStringField<LibObjT> {this->libObjPtr()};
1615 template <typename LibObjT>
1616 CommonStructureField<LibObjT> CommonField<LibObjT>::asStructure() const noexcept
1618 BT_ASSERT_DBG(this->isStructure());
1619 return CommonStructureField<LibObjT> {this->libObjPtr()};
1622 template <typename LibObjT>
1623 CommonArrayField<LibObjT> CommonField<LibObjT>::asArray() const noexcept
1625 BT_ASSERT_DBG(this->isArray());
1626 return CommonArrayField<LibObjT> {this->libObjPtr()};
1629 template <typename LibObjT>
1630 CommonDynamicArrayField<LibObjT> CommonField<LibObjT>::asDynamicArray() const noexcept
1632 BT_ASSERT_DBG(this->isDynamicArray());
1633 return CommonDynamicArrayField<LibObjT> {this->libObjPtr()};
1636 template <typename LibObjT>
1637 CommonOptionField<LibObjT> CommonField<LibObjT>::asOption() const noexcept
1639 BT_ASSERT_DBG(this->isOption());
1640 return CommonOptionField<LibObjT> {this->libObjPtr()};
1643 template <typename LibObjT>
1644 CommonVariantField<LibObjT> CommonField<LibObjT>::asVariant() const noexcept
1646 BT_ASSERT_DBG(this->isVariant());
1647 return CommonVariantField<LibObjT> {this->libObjPtr()};
1650 } /* namespace bt2 */
1652 #endif /* BABELTRACE_CPP_COMMON_BT2_FIELD_HPP */