X-Git-Url: https://git.efficios.com/?a=blobdiff_plain;f=src%2Fcpp-common%2Fbt2%2Ffield-class.hpp;h=411cf6690a1798355b2bcc2341a5621f203acc01;hb=2a24eba8b45ab4bd62dfb2cd95f31e4c2a7a91a8;hp=4dbdee6057120b05d40d90d9b349799f7186ff6c;hpb=5d6ccdaeae400938ca68012cea84630f55687b6d;p=babeltrace.git diff --git a/src/cpp-common/bt2/field-class.hpp b/src/cpp-common/bt2/field-class.hpp index 4dbdee60..411cf669 100644 --- a/src/cpp-common/bt2/field-class.hpp +++ b/src/cpp-common/bt2/field-class.hpp @@ -7,41 +7,41 @@ #ifndef BABELTRACE_CPP_COMMON_BT2_FIELD_CLASS_HPP #define BABELTRACE_CPP_COMMON_BT2_FIELD_CLASS_HPP -#include #include +#include + #include #include "common/assert.h" -#include "internal/borrowed-obj.hpp" -#include "internal/shared-obj.hpp" -#include "cpp-common/optional.hpp" -#include "cpp-common/string_view.hpp" -#include "common-iter.hpp" -#include "lib-error.hpp" -#include "integer-range-set.hpp" +#include "cpp-common/bt2c/c-string-view.hpp" +#include "cpp-common/bt2s/optional.hpp" + +#include "borrowed-object-iterator.hpp" +#include "borrowed-object.hpp" +#include "exc.hpp" #include "field-path.hpp" +#include "integer-range-set.hpp" +#include "internal/utils.hpp" +#include "optional-borrowed-object.hpp" +#include "shared-object.hpp" #include "value.hpp" namespace bt2 { - namespace internal { struct FieldClassRefFuncs final { - static void get(const bt_field_class * const libObjPtr) + static void get(const bt_field_class * const libObjPtr) noexcept { bt_field_class_get_ref(libObjPtr); } - static void put(const bt_field_class * const libObjPtr) + static void put(const bt_field_class * const libObjPtr) noexcept { bt_field_class_put_ref(libObjPtr); } }; -template -using SharedFieldClass = internal::SharedObj; - template struct CommonFieldClassSpec; @@ -67,6 +67,9 @@ struct CommonFieldClassSpec final } /* namespace internal */ +template +using SharedFieldClass = SharedObject; + template class CommonBitArrayFieldClass; @@ -159,60 +162,40 @@ enum class FieldClassType }; template -class CommonFieldClass : public internal::BorrowedObj +class CommonFieldClass : public BorrowedObject { - /* Allow appendMember() to call `fc.libObjPtr()` */ - friend class CommonStructureFieldClass; - - /* Allow appendOption() to call `fc.libObjPtr()` */ - friend class CommonVariantWithoutSelectorFieldClass; - - friend class CommonVariantWithIntegerSelectorFieldClass< - bt_field_class, - ConstVariantWithIntegerSelectorFieldClassOption< - const bt_field_class_variant_with_selector_field_integer_unsigned_option>>; - - friend class CommonVariantWithIntegerSelectorFieldClass< - bt_field_class, - ConstVariantWithIntegerSelectorFieldClassOption< - const bt_field_class_variant_with_selector_field_integer_signed_option>>; - - /* Allow *FieldClass() to call `fc.libObjPtr()` */ - friend class CommonEventClass; - friend class CommonStreamClass; - - /* Allow create*FieldClass() to call `fc.libObjPtr()` */ - friend class CommonTraceClass; - private: - using typename internal::BorrowedObj::_ThisBorrowedObj; + using typename BorrowedObject::_ThisBorrowedObject; protected: - using typename internal::BorrowedObj::_LibObjPtr; using _ThisCommonFieldClass = CommonFieldClass; public: - using Shared = internal::SharedFieldClass, LibObjT>; + using typename BorrowedObject::LibObjPtr; + using Shared = SharedFieldClass, LibObjT>; + using UserAttributes = internal::DepUserAttrs; - using UserAttributes = - typename std::conditional::value, ConstMapValue, MapValue>::type; - - explicit CommonFieldClass(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObj {libObjPtr} + explicit CommonFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr} { } template - CommonFieldClass(const CommonFieldClass& fc) noexcept : _ThisBorrowedObj {fc} + CommonFieldClass(const CommonFieldClass fc) noexcept : _ThisBorrowedObject {fc} { } template - CommonFieldClass& operator=(const CommonFieldClass& fc) noexcept + CommonFieldClass operator=(const CommonFieldClass fc) noexcept { - _ThisBorrowedObj::operator=(fc); + _ThisBorrowedObject::operator=(fc); return *this; } + CommonFieldClass asConst() const noexcept + { + return CommonFieldClass {*this}; + } + FieldClassType type() const noexcept { return static_cast(bt_field_class_get_type(this->libObjPtr())); @@ -373,6 +356,12 @@ public: return this->_libTypeIs(BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD); } + template + FieldClassT as() const noexcept + { + return FieldClassT {this->libObjPtr()}; + } + CommonBitArrayFieldClass asBitArray() const noexcept; CommonIntegerFieldClass asInteger() const noexcept; CommonBaseEnumerationFieldClass asEnumeration() const noexcept; @@ -413,20 +402,15 @@ public: asVariantWithSignedIntegerSelector() const noexcept; template - void userAttributes(const CommonMapValue& userAttrs) + CommonFieldClass userAttributes(const CommonMapValue userAttrs) const noexcept { - static_assert(!std::is_const::value, "`LibObjT` must NOT be `const`."); + static_assert(!std::is_const::value, "Not available with `bt2::ConstFieldClass`."); bt_field_class_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr()); + return *this; } - ConstMapValue userAttributes() const noexcept - { - return ConstMapValue {internal::CommonFieldClassSpec::userAttributes( - this->libObjPtr())}; - } - - UserAttributes userAttributes() noexcept + UserAttributes userAttributes() const noexcept { return UserAttributes { internal::CommonFieldClassSpec::userAttributes(this->libObjPtr())}; @@ -434,7 +418,7 @@ public: Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } protected: @@ -447,36 +431,61 @@ protected: using FieldClass = CommonFieldClass; using ConstFieldClass = CommonFieldClass; +namespace internal { + +struct FieldClassTypeDescr +{ + using Const = ConstFieldClass; + using NonConst = FieldClass; +}; + +template <> +struct TypeDescr : public FieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : public FieldClassTypeDescr +{ +}; + +} /* namespace internal */ + template class CommonBitArrayFieldClass final : public CommonFieldClass { private: - using typename CommonFieldClass::_LibObjPtr; using typename CommonFieldClass::_ThisCommonFieldClass; public: - using Shared = internal::SharedFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass, LibObjT>; - explicit CommonBitArrayFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonBitArrayFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isBitArray()); } template - CommonBitArrayFieldClass(const CommonBitArrayFieldClass& fc) noexcept : + CommonBitArrayFieldClass(const CommonBitArrayFieldClass fc) noexcept : _ThisCommonFieldClass {fc} { } template - CommonBitArrayFieldClass& - operator=(const CommonBitArrayFieldClass& fc) noexcept + CommonBitArrayFieldClass + operator=(const CommonBitArrayFieldClass fc) noexcept { _ThisCommonFieldClass::operator=(fc); return *this; } + CommonBitArrayFieldClass asConst() const noexcept + { + return CommonBitArrayFieldClass {*this}; + } + std::uint64_t length() const noexcept { return bt_field_class_bit_array_get_length(this->libObjPtr()); @@ -484,13 +493,33 @@ public: Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } }; using BitArrayFieldClass = CommonBitArrayFieldClass; using ConstBitArrayFieldClass = CommonBitArrayFieldClass; +namespace internal { + +struct BitArrayFieldClassTypeDescr +{ + using Const = ConstBitArrayFieldClass; + using NonConst = BitArrayFieldClass; +}; + +template <> +struct TypeDescr : public BitArrayFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : public BitArrayFieldClassTypeDescr +{ +}; + +} /* namespace internal */ + enum class DisplayBase { BINARY = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_BINARY, @@ -506,36 +535,43 @@ private: using typename CommonFieldClass::_ThisCommonFieldClass; protected: - using typename CommonFieldClass::_LibObjPtr; using _ThisCommonIntegerFieldClass = CommonIntegerFieldClass; public: - using Shared = internal::SharedFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass, LibObjT>; - explicit CommonIntegerFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonIntegerFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isInteger()); } template - CommonIntegerFieldClass(const CommonIntegerFieldClass& fc) noexcept : + CommonIntegerFieldClass(const CommonIntegerFieldClass fc) noexcept : _ThisCommonFieldClass {fc} { } template - CommonIntegerFieldClass& operator=(const CommonIntegerFieldClass& fc) noexcept + CommonIntegerFieldClass operator=(const CommonIntegerFieldClass fc) noexcept { _ThisCommonFieldClass::operator=(fc); return *this; } - void fieldValueRange(const std::uint64_t n) noexcept + CommonIntegerFieldClass asConst() const noexcept + { + return CommonIntegerFieldClass {*this}; + } + + CommonIntegerFieldClass fieldValueRange(const std::uint64_t n) const noexcept { - static_assert(!std::is_const::value, "`LibObjT` must NOT be `const`."); + static_assert(!std::is_const::value, + "Not available with `bt2::ConstIntegerFieldClass`."); bt_field_class_integer_set_field_value_range(this->libObjPtr(), n); + return *this; } std::uint64_t fieldValueRange() const noexcept @@ -543,12 +579,14 @@ public: return bt_field_class_integer_get_field_value_range(this->libObjPtr()); } - void preferredDisplayBase(const DisplayBase base) noexcept + CommonIntegerFieldClass preferredDisplayBase(const DisplayBase base) const noexcept { - static_assert(!std::is_const::value, "`LibObjT` must NOT be `const`."); + static_assert(!std::is_const::value, + "Not available with `bt2::ConstIntegerFieldClass`."); bt_field_class_integer_set_preferred_display_base( this->libObjPtr(), static_cast(base)); + return *this; } DisplayBase preferredDisplayBase() const noexcept @@ -559,7 +597,7 @@ public: Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } }; @@ -568,6 +606,22 @@ using ConstIntegerFieldClass = CommonIntegerFieldClass; namespace internal { +struct IntegerFieldClassTypeDescr +{ + using Const = ConstIntegerFieldClass; + using NonConst = IntegerFieldClass; +}; + +template <> +struct TypeDescr : public IntegerFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : public IntegerFieldClassTypeDescr +{ +}; + template struct ConstEnumerationFieldClassMappingSpec; @@ -611,31 +665,32 @@ struct ConstEnumerationFieldClassMappingSpec -class ConstEnumerationFieldClassMapping final : public internal::BorrowedObj +class ConstEnumerationFieldClassMapping final : public BorrowedObject { private: - using typename internal::BorrowedObj::_ThisBorrowedObj; - using typename internal::BorrowedObj::_LibObjPtr; + using typename BorrowedObject::_ThisBorrowedObject; public: + using typename BorrowedObject::LibObjPtr; + using RangeSet = typename std::conditional< std::is_same::value, ConstUnsignedIntegerRangeSet, ConstSignedIntegerRangeSet>::type; - explicit ConstEnumerationFieldClassMapping(const _LibObjPtr libObjPtr) noexcept : - _ThisBorrowedObj {libObjPtr} + explicit ConstEnumerationFieldClassMapping(const LibObjPtr libObjPtr) noexcept : + _ThisBorrowedObject {libObjPtr} { } ConstEnumerationFieldClassMapping(const ConstEnumerationFieldClassMapping& mapping) noexcept : - _ThisBorrowedObj {mapping} + _ThisBorrowedObject {mapping} { } - ConstEnumerationFieldClassMapping& + ConstEnumerationFieldClassMapping operator=(const ConstEnumerationFieldClassMapping& mapping) noexcept { - _ThisBorrowedObj::operator=(mapping); + _ThisBorrowedObject::operator=(mapping); return *this; } @@ -645,7 +700,7 @@ public: internal::ConstEnumerationFieldClassMappingSpec::ranges(this->libObjPtr())}; } - bpstd::string_view label() const noexcept + bt2c::CStringView label() const noexcept { return internal::ConstEnumerationFieldClassMappingSpec::label(this->libObjPtr()); } @@ -719,41 +774,46 @@ private: using typename CommonIntegerFieldClass::_ThisCommonIntegerFieldClass; protected: - using typename CommonFieldClass::_LibObjPtr; using _ThisCommonBaseEnumerationFieldClass = CommonBaseEnumerationFieldClass; public: - using Shared = internal::SharedFieldClass<_ThisCommonBaseEnumerationFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass<_ThisCommonBaseEnumerationFieldClass, LibObjT>; - explicit CommonBaseEnumerationFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonBaseEnumerationFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonIntegerFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isEnumeration()); } template - CommonBaseEnumerationFieldClass( - const CommonBaseEnumerationFieldClass& fc) noexcept : + CommonBaseEnumerationFieldClass(const CommonBaseEnumerationFieldClass fc) noexcept + : _ThisCommonIntegerFieldClass {fc} { } template - CommonBaseEnumerationFieldClass& - operator=(const CommonBaseEnumerationFieldClass& fc) noexcept + CommonBaseEnumerationFieldClass + operator=(const CommonBaseEnumerationFieldClass fc) noexcept { _ThisCommonIntegerFieldClass::operator=(fc); return *this; } - std::uint64_t size() const noexcept + CommonBaseEnumerationFieldClass asConst() const noexcept + { + return CommonBaseEnumerationFieldClass {*this}; + } + + std::uint64_t length() const noexcept { return bt_field_class_enumeration_get_mapping_count(this->libObjPtr()); } Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } }; @@ -761,15 +821,15 @@ template class CommonEnumerationFieldClass final : public CommonBaseEnumerationFieldClass { private: - using typename CommonFieldClass::_LibObjPtr; using typename CommonBaseEnumerationFieldClass::_ThisCommonBaseEnumerationFieldClass; - using _ThisCommonEnumerationFieldClass = CommonEnumerationFieldClass; public: - using Shared = internal::SharedFieldClass<_ThisCommonEnumerationFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass; + using Iterator = BorrowedObjectIterator; using Mapping = MappingT; - explicit CommonEnumerationFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonEnumerationFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonBaseEnumerationFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isEnumeration()); @@ -777,16 +837,16 @@ public: template CommonEnumerationFieldClass( - const CommonEnumerationFieldClass& fc) noexcept : - _ThisCommonEnumerationFieldClass {fc} + const CommonEnumerationFieldClass fc) noexcept : + CommonEnumerationFieldClass {fc} { } template - CommonEnumerationFieldClass& - operator=(const CommonEnumerationFieldClass& fc) noexcept + CommonEnumerationFieldClass + operator=(const CommonEnumerationFieldClass fc) noexcept { - _ThisCommonEnumerationFieldClass::operator=(fc); + CommonEnumerationFieldClass::operator=(fc); return *this; } @@ -796,41 +856,38 @@ public: this->libObjPtr(), index)}; } - nonstd::optional operator[](const char * const label) const noexcept + OptionalBorrowedObject operator[](const bt2c::CStringView label) const noexcept { - const auto libObjPtr = internal::CommonEnumerationFieldClassSpec::mappingByLabel( + return internal::CommonEnumerationFieldClassSpec::mappingByLabel( this->libObjPtr(), label); - - if (libObjPtr) { - return Mapping {libObjPtr}; - } - - return nonstd::nullopt; } - nonstd::optional operator[](const std::string& label) const noexcept - { - return (*this)[label.data()]; - } - - void addMapping(const char * const label, const typename Mapping::RangeSet ranges) + CommonEnumerationFieldClass addMapping(const bt2c::CStringView label, + const typename Mapping::RangeSet ranges) const { const auto status = internal::CommonEnumerationFieldClassSpec::addMapping( this->libObjPtr(), label, ranges.libObjPtr()); if (status == BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_MEMORY_ERROR) { - throw LibMemoryError {}; + throw MemoryError {}; } + + return *this; + } + + Iterator begin() const noexcept + { + return Iterator {*this, 0}; } - void addMapping(const std::string& label, const typename Mapping::RangeSet ranges) + Iterator end() const noexcept { - this->addMapping(label.data(), ranges); + return Iterator {*this, this->length()}; } Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } }; @@ -851,6 +908,38 @@ using ConstSignedEnumerationFieldClass = namespace internal { +struct UnsignedEnumerationFieldClassTypeDescr +{ + using Const = ConstUnsignedEnumerationFieldClass; + using NonConst = UnsignedEnumerationFieldClass; +}; + +template <> +struct TypeDescr : public UnsignedEnumerationFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : public UnsignedEnumerationFieldClassTypeDescr +{ +}; + +struct SignedEnumerationFieldClassTypeDescr +{ + using Const = ConstSignedEnumerationFieldClass; + using NonConst = SignedEnumerationFieldClass; +}; + +template <> +struct TypeDescr : public SignedEnumerationFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : public SignedEnumerationFieldClassTypeDescr +{ +}; + template struct CommonStructureFieldClassMemberSpec; @@ -862,6 +951,11 @@ struct CommonStructureFieldClassMemberSpec fina { return bt_field_class_structure_member_borrow_field_class(libObjPtr); } + + static bt_value *userAttributes(bt_field_class_structure_member * const libObjPtr) noexcept + { + return bt_field_class_structure_member_borrow_user_attributes(libObjPtr); + } }; /* Functions specific to constant structure field class members */ @@ -873,57 +967,81 @@ struct CommonStructureFieldClassMemberSpec -class CommonStructureFieldClassMember final : public internal::BorrowedObj +class CommonStructureFieldClassMember final : public BorrowedObject { private: - using typename internal::BorrowedObj::_LibObjPtr; - using typename internal::BorrowedObj::_ThisBorrowedObj; - - using _FieldClass = - typename std::conditional::value, ConstFieldClass, FieldClass>::type; + using typename BorrowedObject::_ThisBorrowedObject; + using _FieldClass = internal::DepFc; public: - explicit CommonStructureFieldClassMember(const _LibObjPtr libObjPtr) noexcept : - _ThisBorrowedObj {libObjPtr} + using typename BorrowedObject::LibObjPtr; + using UserAttributes = internal::DepUserAttrs; + + explicit CommonStructureFieldClassMember(const LibObjPtr libObjPtr) noexcept : + _ThisBorrowedObject {libObjPtr} { } template - CommonStructureFieldClassMember( - const CommonStructureFieldClassMember& fc) noexcept : - _ThisBorrowedObj {fc} + CommonStructureFieldClassMember(const CommonStructureFieldClassMember fc) noexcept + : + _ThisBorrowedObject {fc} { } template - CommonStructureFieldClassMember& - operator=(const CommonStructureFieldClassMember& fc) noexcept + CommonStructureFieldClassMember + operator=(const CommonStructureFieldClassMember fc) noexcept { - _ThisBorrowedObj::operator=(fc); + _ThisBorrowedObject::operator=(fc); return *this; } - bpstd::string_view name() const noexcept + CommonStructureFieldClassMember asConst() const noexcept { - return bt_field_class_structure_member_get_name(this->libObjPtr()); + return CommonStructureFieldClassMember {*this}; } - ConstFieldClass fieldClass() const noexcept + bt2c::CStringView name() const noexcept { - return ConstFieldClass {internal::CommonStructureFieldClassMemberSpec< - const bt_field_class_structure_member>::fieldClass(this->libObjPtr())}; + return bt_field_class_structure_member_get_name(this->libObjPtr()); } - _FieldClass fieldClass() noexcept + _FieldClass fieldClass() const noexcept { return _FieldClass { internal::CommonStructureFieldClassMemberSpec::fieldClass(this->libObjPtr())}; } + + template + CommonStructureFieldClassMember + userAttributes(const CommonMapValue userAttrs) const noexcept + { + static_assert(!std::is_const::value, + "Not available with `bt2::ConstStructureFieldClassMember`."); + + bt_field_class_structure_member_set_user_attributes(this->libObjPtr(), + userAttrs.libObjPtr()); + return *this; + } + + UserAttributes userAttributes() const noexcept + { + return UserAttributes { + internal::CommonStructureFieldClassMemberSpec::userAttributes( + this->libObjPtr())}; + } }; using StructureFieldClassMember = CommonStructureFieldClassMember; @@ -933,6 +1051,22 @@ using ConstStructureFieldClassMember = namespace internal { +struct StructureFieldClassMemberTypeDescr +{ + using Const = ConstStructureFieldClassMember; + using NonConst = StructureFieldClassMember; +}; + +template <> +struct TypeDescr : public StructureFieldClassMemberTypeDescr +{ +}; + +template <> +struct TypeDescr : public StructureFieldClassMemberTypeDescr +{ +}; + template struct CommonStructureFieldClassSpec; @@ -976,54 +1110,56 @@ template class CommonStructureFieldClass final : public CommonFieldClass { private: - using typename CommonFieldClass::_LibObjPtr; using typename CommonFieldClass::_ThisCommonFieldClass; public: - using Shared = internal::SharedFieldClass, LibObjT>; - using Member = - typename std::conditional::value, ConstStructureFieldClassMember, - StructureFieldClassMember>::type; + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass, LibObjT>; + using Iterator = BorrowedObjectIterator>; - using Iterator = CommonIterator, Member>; + using Member = + internal::DepType; - explicit CommonStructureFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonStructureFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isStructure()); } template - CommonStructureFieldClass(const CommonStructureFieldClass& fc) noexcept : + CommonStructureFieldClass(const CommonStructureFieldClass fc) noexcept : _ThisCommonFieldClass {fc} { } template - CommonStructureFieldClass& operator=(const CommonStructureFieldClass& fc) noexcept + CommonStructureFieldClass operator=(const CommonStructureFieldClass fc) noexcept { _ThisCommonFieldClass::operator=(fc); return *this; } - void appendMember(const char * const name, const FieldClass& fc) + CommonStructureFieldClass asConst() const noexcept + { + return CommonStructureFieldClass {*this}; + } + + CommonStructureFieldClass appendMember(const bt2c::CStringView name, const FieldClass fc) const { - static_assert(!std::is_const::value, "`LibObjT` must NOT be `const`."); + static_assert(!std::is_const::value, + "Not available with `bt2::ConstStructureFieldClass`."); const auto status = bt_field_class_structure_append_member(this->libObjPtr(), name, fc.libObjPtr()); if (status == BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_MEMORY_ERROR) { - throw LibMemoryError {}; + throw MemoryError {}; } - } - void appendMember(const std::string& name, const FieldClass& fc) - { - this->appendMember(name.data(), fc); + return *this; } - std::uint64_t size() const noexcept + std::uint64_t length() const noexcept { return bt_field_class_structure_get_member_count(this->libObjPtr()); } @@ -1035,62 +1171,24 @@ public: Iterator end() const noexcept { - return Iterator {*this, this->size()}; - } - - ConstStructureFieldClassMember operator[](const std::uint64_t index) const noexcept - { - return ConstStructureFieldClassMember { - internal::CommonStructureFieldClassSpec::memberByIndex( - this->libObjPtr(), index)}; + return Iterator {*this, this->length()}; } - Member operator[](const std::uint64_t index) noexcept + Member operator[](const std::uint64_t index) const noexcept { return Member {internal::CommonStructureFieldClassSpec::memberByIndex( this->libObjPtr(), index)}; } - nonstd::optional - operator[](const char * const name) const noexcept - { - const auto libObjPtr = - internal::CommonStructureFieldClassSpec::memberByName( - this->libObjPtr(), name); - - if (libObjPtr) { - return ConstStructureFieldClassMember {libObjPtr}; - } - - return nonstd::nullopt; - } - - nonstd::optional - operator[](const std::string& name) const noexcept - { - return (*this)[name.data()]; - } - - nonstd::optional operator[](const char * const name) noexcept - { - const auto libObjPtr = - internal::CommonStructureFieldClassSpec::memberByName(this->libObjPtr(), name); - - if (libObjPtr) { - return Member {libObjPtr}; - } - - return nonstd::nullopt; - } - - nonstd::optional operator[](const std::string& name) noexcept + OptionalBorrowedObject operator[](const bt2c::CStringView name) const noexcept { - return (*this)[name.data()]; + return internal::CommonStructureFieldClassSpec::memberByName(this->libObjPtr(), + name); } Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } }; @@ -1099,6 +1197,22 @@ using ConstStructureFieldClass = CommonStructureFieldClass namespace internal { +struct StructureFieldClassTypeDescr +{ + using Const = ConstStructureFieldClass; + using NonConst = StructureFieldClass; +}; + +template <> +struct TypeDescr : public StructureFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : public StructureFieldClassTypeDescr +{ +}; + template struct CommonArrayFieldClassSpec; @@ -1129,44 +1243,40 @@ class CommonArrayFieldClass : public CommonFieldClass { private: using typename CommonFieldClass::_ThisCommonFieldClass; - - using _FieldClass = - typename std::conditional::value, ConstFieldClass, FieldClass>::type; + using _FieldClass = internal::DepFc; protected: - using typename CommonFieldClass::_LibObjPtr; using _ThisCommonArrayFieldClass = CommonArrayFieldClass; public: - using Shared = internal::SharedFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass, LibObjT>; - explicit CommonArrayFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonArrayFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isArray()); } template - CommonArrayFieldClass(const CommonArrayFieldClass& fc) noexcept : + CommonArrayFieldClass(const CommonArrayFieldClass fc) noexcept : _ThisCommonFieldClass {fc} { } template - CommonArrayFieldClass& operator=(const CommonArrayFieldClass& fc) noexcept + CommonArrayFieldClass operator=(const CommonArrayFieldClass fc) noexcept { _ThisCommonFieldClass::operator=(fc); return *this; } - ConstFieldClass elementFieldClass() const noexcept + CommonArrayFieldClass asConst() const noexcept { - return ConstFieldClass { - internal::CommonArrayFieldClassSpec::elementFieldClass( - this->libObjPtr())}; + return CommonArrayFieldClass {*this}; } - _FieldClass elementFieldClass() noexcept + _FieldClass elementFieldClass() const noexcept { return _FieldClass { internal::CommonArrayFieldClassSpec::elementFieldClass(this->libObjPtr())}; @@ -1174,43 +1284,68 @@ public: Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } }; using ArrayFieldClass = CommonArrayFieldClass; using ConstArrayFieldClass = CommonArrayFieldClass; +namespace internal { + +struct ArrayFieldClassTypeDescr +{ + using Const = ConstArrayFieldClass; + using NonConst = ArrayFieldClass; +}; + +template <> +struct TypeDescr : public ArrayFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : public ArrayFieldClassTypeDescr +{ +}; + +} /* namespace internal */ + template class CommonStaticArrayFieldClass final : public CommonArrayFieldClass { private: using typename CommonArrayFieldClass::_ThisCommonArrayFieldClass; - using typename CommonFieldClass::_LibObjPtr; public: - using Shared = internal::SharedFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass, LibObjT>; - explicit CommonStaticArrayFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonStaticArrayFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonArrayFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isStaticArray()); } template - CommonStaticArrayFieldClass(const CommonStaticArrayFieldClass& fc) noexcept : + CommonStaticArrayFieldClass(const CommonStaticArrayFieldClass fc) noexcept : _ThisCommonArrayFieldClass {fc} { } template - CommonStaticArrayFieldClass& - operator=(const CommonStaticArrayFieldClass& fc) noexcept + CommonStaticArrayFieldClass + operator=(const CommonStaticArrayFieldClass fc) noexcept { _ThisCommonArrayFieldClass::operator=(fc); return *this; } + CommonStaticArrayFieldClass asConst() const noexcept + { + return CommonStaticArrayFieldClass {*this}; + } + std::uint64_t length() const noexcept { return bt_field_class_array_static_get_length(this->libObjPtr()); @@ -1218,25 +1353,44 @@ public: Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } }; using StaticArrayFieldClass = CommonStaticArrayFieldClass; using ConstStaticArrayFieldClass = CommonStaticArrayFieldClass; +namespace internal { + +struct StaticArrayFieldClassTypeDescr +{ + using Const = ConstStaticArrayFieldClass; + using NonConst = StaticArrayFieldClass; +}; + +template <> +struct TypeDescr : public StaticArrayFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : public StaticArrayFieldClassTypeDescr +{ +}; + +} /* namespace internal */ + template class CommonDynamicArrayWithLengthFieldClass final : public CommonArrayFieldClass { private: using typename CommonArrayFieldClass::_ThisCommonArrayFieldClass; - using typename CommonFieldClass::_LibObjPtr; public: - using Shared = - internal::SharedFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass, LibObjT>; - explicit CommonDynamicArrayWithLengthFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonDynamicArrayWithLengthFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonArrayFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isDynamicArrayWithLength()); @@ -1244,19 +1398,24 @@ public: template CommonDynamicArrayWithLengthFieldClass( - const CommonDynamicArrayWithLengthFieldClass& fc) noexcept : + const CommonDynamicArrayWithLengthFieldClass fc) noexcept : _ThisCommonArrayFieldClass {fc} { } template - CommonDynamicArrayWithLengthFieldClass& - operator=(const CommonDynamicArrayWithLengthFieldClass& fc) noexcept + CommonDynamicArrayWithLengthFieldClass + operator=(const CommonDynamicArrayWithLengthFieldClass fc) noexcept { _ThisCommonArrayFieldClass::operator=(fc); return *this; } + CommonDynamicArrayWithLengthFieldClass asConst() const noexcept + { + return CommonDynamicArrayWithLengthFieldClass {*this}; + } + ConstFieldPath lengthFieldPath() const noexcept { return ConstFieldPath { @@ -1266,7 +1425,7 @@ public: Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } }; @@ -1277,6 +1436,24 @@ using ConstDynamicArrayWithLengthFieldClass = namespace internal { +struct DynamicArrayWithLengthFieldClassTypeDescr +{ + using Const = ConstDynamicArrayWithLengthFieldClass; + using NonConst = DynamicArrayWithLengthFieldClass; +}; + +template <> +struct TypeDescr : + public DynamicArrayWithLengthFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : + public DynamicArrayWithLengthFieldClassTypeDescr +{ +}; + template struct CommonOptionFieldClassSpec; @@ -1307,44 +1484,40 @@ class CommonOptionFieldClass : public CommonFieldClass { private: using typename CommonFieldClass::_ThisCommonFieldClass; - - using _FieldClass = - typename std::conditional::value, ConstFieldClass, FieldClass>::type; + using _FieldClass = internal::DepFc; protected: - using typename CommonFieldClass::_LibObjPtr; using _ThisCommonOptionFieldClass = CommonOptionFieldClass; public: - using Shared = internal::SharedFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass, LibObjT>; - explicit CommonOptionFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonOptionFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isOption()); } template - CommonOptionFieldClass(const CommonOptionFieldClass& fc) noexcept : + CommonOptionFieldClass(const CommonOptionFieldClass fc) noexcept : _ThisCommonFieldClass {fc} { } template - CommonOptionFieldClass& operator=(const CommonOptionFieldClass& fc) noexcept + CommonOptionFieldClass operator=(const CommonOptionFieldClass fc) noexcept { _ThisCommonFieldClass::operator=(fc); return *this; } - ConstFieldClass fieldClass() const noexcept + CommonOptionFieldClass asConst() const noexcept { - return ConstFieldClass { - internal::CommonOptionFieldClassSpec::fieldClass( - this->libObjPtr())}; + return CommonOptionFieldClass {*this}; } - _FieldClass fieldClass() noexcept + _FieldClass fieldClass() const noexcept { return _FieldClass { internal::CommonOptionFieldClassSpec::fieldClass(this->libObjPtr())}; @@ -1352,13 +1525,33 @@ public: Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } }; using OptionFieldClass = CommonOptionFieldClass; using ConstOptionFieldClass = CommonOptionFieldClass; +namespace internal { + +struct OptionFieldClassTypeDescr +{ + using Const = ConstOptionFieldClass; + using NonConst = OptionFieldClass; +}; + +template <> +struct TypeDescr : public OptionFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : public OptionFieldClassTypeDescr +{ +}; + +} /* namespace internal */ + template class CommonOptionWithSelectorFieldClass : public CommonOptionFieldClass { @@ -1366,13 +1559,13 @@ private: using typename CommonOptionFieldClass::_ThisCommonOptionFieldClass; protected: - using typename CommonFieldClass::_LibObjPtr; using _ThisCommonOptionWithSelectorFieldClass = CommonOptionWithSelectorFieldClass; public: - using Shared = internal::SharedFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass, LibObjT>; - explicit CommonOptionWithSelectorFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonOptionWithSelectorFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonOptionFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isOptionWithSelector()); @@ -1380,19 +1573,24 @@ public: template CommonOptionWithSelectorFieldClass( - const CommonOptionWithSelectorFieldClass& fc) noexcept : + const CommonOptionWithSelectorFieldClass fc) noexcept : _ThisCommonOptionFieldClass {fc} { } template - CommonOptionWithSelectorFieldClass& - operator=(const CommonOptionWithSelectorFieldClass& fc) noexcept + CommonOptionWithSelectorFieldClass + operator=(const CommonOptionWithSelectorFieldClass fc) noexcept { _ThisCommonOptionFieldClass::operator=(fc); return *this; } + CommonOptionWithSelectorFieldClass asConst() const noexcept + { + return CommonOptionWithSelectorFieldClass {*this}; + } + ConstFieldPath selectorFieldPath() const noexcept { return ConstFieldPath { @@ -1402,27 +1600,45 @@ public: Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } }; using OptionWithSelectorFieldClass = CommonOptionWithSelectorFieldClass; using ConstOptionWithSelectorFieldClass = CommonOptionWithSelectorFieldClass; +namespace internal { + +struct OptionWithSelectorFieldClassTypeDescr +{ + using Const = ConstOptionWithSelectorFieldClass; + using NonConst = OptionWithSelectorFieldClass; +}; + +template <> +struct TypeDescr : public OptionWithSelectorFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : public OptionWithSelectorFieldClassTypeDescr +{ +}; + +} /* namespace internal */ + template class CommonOptionWithBoolSelectorFieldClass : public CommonOptionWithSelectorFieldClass { private: - using typename CommonFieldClass::_LibObjPtr; - using typename CommonOptionWithSelectorFieldClass< LibObjT>::_ThisCommonOptionWithSelectorFieldClass; public: - using Shared = - internal::SharedFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass, LibObjT>; - explicit CommonOptionWithBoolSelectorFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonOptionWithBoolSelectorFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonOptionWithSelectorFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isOptionWithBoolSelector()); @@ -1430,19 +1646,24 @@ public: template CommonOptionWithBoolSelectorFieldClass( - const CommonOptionWithBoolSelectorFieldClass& fc) noexcept : + const CommonOptionWithBoolSelectorFieldClass fc) noexcept : _ThisCommonOptionWithSelectorFieldClass {fc} { } template - CommonOptionWithBoolSelectorFieldClass& - operator=(const CommonOptionWithBoolSelectorFieldClass& fc) noexcept + CommonOptionWithBoolSelectorFieldClass + operator=(const CommonOptionWithBoolSelectorFieldClass fc) noexcept { _ThisCommonOptionWithSelectorFieldClass::operator=(fc); return *this; } + CommonOptionWithBoolSelectorFieldClass asConst() const noexcept + { + return CommonOptionWithBoolSelectorFieldClass {*this}; + } + bool selectorIsReversed() const noexcept { return bt_field_class_option_with_selector_field_bool_selector_is_reversed( @@ -1451,7 +1672,7 @@ public: Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } }; @@ -1462,6 +1683,24 @@ using ConstOptionWithBoolSelectorFieldClass = namespace internal { +struct OptionWithBoolSelectorFieldClassTypeDescr +{ + using Const = ConstOptionWithBoolSelectorFieldClass; + using NonConst = OptionWithBoolSelectorFieldClass; +}; + +template <> +struct TypeDescr : + public OptionWithBoolSelectorFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : + public OptionWithBoolSelectorFieldClassTypeDescr +{ +}; + template struct CommonOptionWithIntegerSelectorFieldClassSpec; @@ -1495,21 +1734,15 @@ template class CommonOptionWithIntegerSelectorFieldClass : public CommonOptionWithSelectorFieldClass { private: - using typename CommonFieldClass::_LibObjPtr; - using typename CommonOptionWithSelectorFieldClass< LibObjT>::_ThisCommonOptionWithSelectorFieldClass; - using _ThisCommonOptionWithIntegerSelectorFieldClass = - CommonOptionWithIntegerSelectorFieldClass; - public: - using Shared = - internal::SharedFieldClass<_ThisCommonOptionWithIntegerSelectorFieldClass, LibObjT>; - + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass; using RangeSet = RangeSetT; - explicit CommonOptionWithIntegerSelectorFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonOptionWithIntegerSelectorFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonOptionWithSelectorFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isOptionWithIntegerSelector()); @@ -1517,14 +1750,14 @@ public: template CommonOptionWithIntegerSelectorFieldClass( - const CommonOptionWithIntegerSelectorFieldClass& fc) noexcept : + const CommonOptionWithIntegerSelectorFieldClass fc) noexcept : _ThisCommonOptionWithSelectorFieldClass {fc} { } template - CommonOptionWithIntegerSelectorFieldClass& - operator=(const CommonOptionWithIntegerSelectorFieldClass& fc) noexcept + CommonOptionWithIntegerSelectorFieldClass + operator=(const CommonOptionWithIntegerSelectorFieldClass fc) noexcept { _ThisCommonOptionWithSelectorFieldClass::operator=(fc); return *this; @@ -1538,7 +1771,7 @@ public: Shared shared() const noexcept { - return Shared {*this}; + return Shared::createWithRef(*this); } }; @@ -1556,6 +1789,42 @@ using ConstOptionWithSignedIntegerSelectorFieldClass = namespace internal { +struct OptionWithUnsignedIntegerSelectorFieldClassTypeDescr +{ + using Const = ConstOptionWithUnsignedIntegerSelectorFieldClass; + using NonConst = OptionWithUnsignedIntegerSelectorFieldClass; +}; + +template <> +struct TypeDescr : + public OptionWithUnsignedIntegerSelectorFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : + public OptionWithUnsignedIntegerSelectorFieldClassTypeDescr +{ +}; + +struct OptionWithSignedIntegerSelectorFieldClassTypeDescr +{ + using Const = ConstOptionWithSignedIntegerSelectorFieldClass; + using NonConst = OptionWithSignedIntegerSelectorFieldClass; +}; + +template <> +struct TypeDescr : + public OptionWithSignedIntegerSelectorFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : + public OptionWithSignedIntegerSelectorFieldClassTypeDescr +{ +}; + template struct CommonVariantFieldClassOptionSpec; @@ -1567,6 +1836,11 @@ struct CommonVariantFieldClassOptionSpec final { return bt_field_class_variant_option_borrow_field_class(libObjPtr); } + + static bt_value *userAttributes(bt_field_class_variant_option * const libObjPtr) noexcept + { + return bt_field_class_variant_option_borrow_user_attributes(libObjPtr); + } }; /* Functions specific to constant variant field class options */ @@ -1578,56 +1852,78 @@ struct CommonVariantFieldClassOptionSpec fi { return bt_field_class_variant_option_borrow_field_class_const(libObjPtr); } + + static const bt_value * + userAttributes(const bt_field_class_variant_option * const libObjPtr) noexcept + { + return bt_field_class_variant_option_borrow_user_attributes_const(libObjPtr); + } }; } /* namespace internal */ template -class CommonVariantFieldClassOption : public internal::BorrowedObj +class CommonVariantFieldClassOption : public BorrowedObject { private: - using typename internal::BorrowedObj::_ThisBorrowedObj; - using typename internal::BorrowedObj::_LibObjPtr; - - using _FieldClass = - typename std::conditional::value, ConstFieldClass, FieldClass>::type; + using typename BorrowedObject::_ThisBorrowedObject; + using _FieldClass = internal::DepFc; public: - explicit CommonVariantFieldClassOption(const _LibObjPtr libObjPtr) noexcept : - _ThisBorrowedObj {libObjPtr} + using typename BorrowedObject::LibObjPtr; + using UserAttributes = internal::DepUserAttrs; + + explicit CommonVariantFieldClassOption(const LibObjPtr libObjPtr) noexcept : + _ThisBorrowedObject {libObjPtr} { } template - CommonVariantFieldClassOption(const CommonVariantFieldClassOption& fc) noexcept : - _ThisBorrowedObj {fc} + CommonVariantFieldClassOption(const CommonVariantFieldClassOption fc) noexcept : + _ThisBorrowedObject {fc} { } template - CommonVariantFieldClassOption& - operator=(const CommonVariantFieldClassOption& fc) noexcept + CommonVariantFieldClassOption + operator=(const CommonVariantFieldClassOption fc) noexcept { - _ThisBorrowedObj::operator=(fc); + _ThisBorrowedObject::operator=(fc); return *this; } - bpstd::string_view name() const noexcept + CommonVariantFieldClassOption asConst() const noexcept { - return bt_field_class_variant_option_get_name(this->libObjPtr()); + return CommonVariantFieldClassOption {*this}; } - ConstFieldClass fieldClass() const noexcept + bt2c::CStringView name() const noexcept { - return ConstFieldClass {internal::CommonVariantFieldClassOptionSpec< - const bt_field_class_variant_option>::fieldClass(this->libObjPtr())}; + return bt_field_class_variant_option_get_name(this->libObjPtr()); } - _FieldClass fieldClass() noexcept + _FieldClass fieldClass() const noexcept { return _FieldClass { internal::CommonVariantFieldClassOptionSpec::fieldClass(this->libObjPtr())}; } + + template + CommonVariantFieldClassOption + userAttributes(const CommonMapValue userAttrs) const noexcept + { + static_assert(!std::is_const::value, + "Not available with `bt2::ConstVariantFieldClassOption`."); + + bt_field_class_variant_option_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr()); + return *this; + } + + UserAttributes userAttributes() const noexcept + { + return UserAttributes {internal::CommonVariantFieldClassOptionSpec::userAttributes( + this->libObjPtr())}; + } }; using VariantFieldClassOption = CommonVariantFieldClassOption; @@ -1637,6 +1933,22 @@ using ConstVariantFieldClassOption = namespace internal { +struct VariantFieldClassOptionTypeDescr +{ + using Const = ConstVariantFieldClassOption; + using NonConst = VariantFieldClassOption; +}; + +template <> +struct TypeDescr : public VariantFieldClassOptionTypeDescr +{ +}; + +template <> +struct TypeDescr : public VariantFieldClassOptionTypeDescr +{ +}; + template struct ConstVariantWithIntegerSelectorFieldClassOptionSpec; @@ -1689,37 +2001,38 @@ struct ConstVariantWithIntegerSelectorFieldClassOptionSpec< } /* namespace internal */ template -class ConstVariantWithIntegerSelectorFieldClassOption : public internal::BorrowedObj +class ConstVariantWithIntegerSelectorFieldClassOption : public BorrowedObject { private: - using typename internal::BorrowedObj::_ThisBorrowedObj; - using typename internal::BorrowedObj::_LibObjPtr; + using typename BorrowedObject::_ThisBorrowedObject; using _Spec = internal::ConstVariantWithIntegerSelectorFieldClassOptionSpec; public: + using typename BorrowedObject::LibObjPtr; + using RangeSet = typename std::conditional< std::is_same< LibObjT, const bt_field_class_variant_with_selector_field_integer_unsigned_option>::value, ConstUnsignedIntegerRangeSet, ConstSignedIntegerRangeSet>::type; - explicit ConstVariantWithIntegerSelectorFieldClassOption(const _LibObjPtr libObjPtr) noexcept : - _ThisBorrowedObj {libObjPtr} + explicit ConstVariantWithIntegerSelectorFieldClassOption(const LibObjPtr libObjPtr) noexcept : + _ThisBorrowedObject {libObjPtr} { } template ConstVariantWithIntegerSelectorFieldClassOption( - const ConstVariantWithIntegerSelectorFieldClassOption& fc) noexcept : - _ThisBorrowedObj {fc} + const ConstVariantWithIntegerSelectorFieldClassOption fc) noexcept : + _ThisBorrowedObject {fc} { } template - ConstVariantWithIntegerSelectorFieldClassOption& - operator=(const ConstVariantWithIntegerSelectorFieldClassOption& fc) noexcept + ConstVariantWithIntegerSelectorFieldClassOption + operator=(const ConstVariantWithIntegerSelectorFieldClassOption fc) noexcept { - _ThisBorrowedObj::operator=(fc); + _ThisBorrowedObject::operator=(fc); return *this; } @@ -1728,7 +2041,7 @@ public: return ConstVariantFieldClassOption {_Spec::asBaseOption(this->libObjPtr())}; } - bpstd::string_view name() const noexcept + bt2c::CStringView name() const noexcept { return this->asBaseOption().name(); } @@ -1800,38 +2113,41 @@ private: using typename CommonFieldClass::_ThisCommonFieldClass; protected: - using typename CommonFieldClass::_LibObjPtr; using _ThisCommonVariantFieldClass = CommonVariantFieldClass; public: - using Shared = internal::SharedFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + using Shared = SharedFieldClass, LibObjT>; + using Iterator = BorrowedObjectIterator; using Option = - typename std::conditional::value, ConstVariantFieldClassOption, - VariantFieldClassOption>::type; + internal::DepType; - using Iterator = CommonIterator, Option>; - - explicit CommonVariantFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonVariantFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isVariant()); } template - CommonVariantFieldClass(const CommonVariantFieldClass& fc) noexcept : + CommonVariantFieldClass(const CommonVariantFieldClass fc) noexcept : _ThisCommonFieldClass {fc} { } template - CommonVariantFieldClass& operator=(const CommonVariantFieldClass& fc) noexcept + CommonVariantFieldClass operator=(const CommonVariantFieldClass fc) noexcept { _ThisCommonFieldClass::operator=(fc); return *this; } - std::uint64_t size() const noexcept + CommonVariantFieldClass asConst() const noexcept + { + return CommonVariantFieldClass {*this}; + } + + std::uint64_t length() const noexcept { return bt_field_class_variant_get_option_count(this->libObjPtr()); } @@ -1843,80 +2159,61 @@ public: Iterator end() const noexcept { - return Iterator {*this, this->size()}; + return Iterator {*this, this->length()}; } - ConstVariantFieldClassOption operator[](const std::uint64_t index) const noexcept - { - return ConstVariantFieldClassOption { - internal::CommonVariantFieldClassSpec::optionByIndex( - this->libObjPtr(), index)}; - } - - Option operator[](const std::uint64_t index) noexcept + Option operator[](const std::uint64_t index) const noexcept { return Option {internal::CommonVariantFieldClassSpec::optionByIndex( this->libObjPtr(), index)}; } - nonstd::optional - operator[](const char * const name) const noexcept + OptionalBorrowedObject