X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=src%2Fcpp-common%2Fbt2%2Ffield-class.hpp;h=71e32e411d2d43cb5d19ed411b41383aa82488bc;hb=HEAD;hp=6e1c0d679b5a0ff78126724aa19a9a25a44aff6e;hpb=100fa861dbb7e463175e63326e8871446f0f35f0;p=babeltrace.git diff --git a/src/cpp-common/bt2/field-class.hpp b/src/cpp-common/bt2/field-class.hpp index 6e1c0d67..722c729f 100644 --- a/src/cpp-common/bt2/field-class.hpp +++ b/src/cpp-common/bt2/field-class.hpp @@ -7,20 +7,24 @@ #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 "internal/utils.hpp" -#include "cpp-common/optional.hpp" -#include "cpp-common/string_view.hpp" -#include "common-iter.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 "integer-range-set.hpp" +#include "field-location.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 { @@ -28,20 +32,17 @@ 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 +68,9 @@ struct CommonFieldClassSpec final } /* namespace internal */ +template +using SharedFieldClass = SharedObject; + template class CommonBitArrayFieldClass; @@ -94,6 +98,15 @@ class CommonStaticArrayFieldClass; template class CommonDynamicArrayWithLengthFieldClass; +template +class CommonBlobFieldClass; + +template +class CommonStaticBlobFieldClass; + +template +class CommonDynamicBlobWithLengthFieldClass; + template class CommonOptionFieldClass; @@ -130,89 +143,72 @@ class CommonStreamClass; template class CommonTraceClass; -enum class FieldClassType -{ - BOOL = BT_FIELD_CLASS_TYPE_BOOL, - BIT_ARRAY = BT_FIELD_CLASS_TYPE_BIT_ARRAY, - UNSIGNED_INTEGER = BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER, - SIGNED_INTEGER = BT_FIELD_CLASS_TYPE_SIGNED_INTEGER, - UNSIGNED_ENUMERATION = BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION, - SIGNED_ENUMERATION = BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION, - SINGLE_PRECISION_REAL = BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL, - DOUBLE_PRECISION_REAL = BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL, - STRING = BT_FIELD_CLASS_TYPE_STRING, - STRUCTURE = BT_FIELD_CLASS_TYPE_STRUCTURE, - STATIC_ARRAY = BT_FIELD_CLASS_TYPE_STATIC_ARRAY, - DYNAMIC_ARRAY_WITHOUT_LENGTH = BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD, - DYNAMIC_ARRAY_WITH_LENGTH = BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD, - OPTION_WITHOUT_SELECTOR = BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD, - OPTION_WITH_BOOL_SELECTOR = BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD, - OPTION_WITH_UNSIGNED_INTEGER_SELECTOR = +enum class FieldClassType : std::uint64_t +{ + Bool = BT_FIELD_CLASS_TYPE_BOOL, + BitArray = BT_FIELD_CLASS_TYPE_BIT_ARRAY, + UnsignedInteger = BT_FIELD_CLASS_TYPE_UNSIGNED_INTEGER, + SignedInteger = BT_FIELD_CLASS_TYPE_SIGNED_INTEGER, + UnsignedEnumeration = BT_FIELD_CLASS_TYPE_UNSIGNED_ENUMERATION, + SignedEnumeration = BT_FIELD_CLASS_TYPE_SIGNED_ENUMERATION, + SinglePrecisionReal = BT_FIELD_CLASS_TYPE_SINGLE_PRECISION_REAL, + DoublePrecisionReal = BT_FIELD_CLASS_TYPE_DOUBLE_PRECISION_REAL, + String = BT_FIELD_CLASS_TYPE_STRING, + Structure = BT_FIELD_CLASS_TYPE_STRUCTURE, + StaticArray = BT_FIELD_CLASS_TYPE_STATIC_ARRAY, + DynamicArrayWithoutLength = BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITHOUT_LENGTH_FIELD, + DynamicArrayWithLength = BT_FIELD_CLASS_TYPE_DYNAMIC_ARRAY_WITH_LENGTH_FIELD, + OptionWithoutSelector = BT_FIELD_CLASS_TYPE_OPTION_WITHOUT_SELECTOR_FIELD, + OptionWithBoolSelector = BT_FIELD_CLASS_TYPE_OPTION_WITH_BOOL_SELECTOR_FIELD, + OptionWithUnsignedIntegerSelector = BT_FIELD_CLASS_TYPE_OPTION_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD, - OPTION_WITH_SIGNED_INTEGER_SELECTOR = - BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD, - VARIANT_WITHOUT_SELECTOR = BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD, - VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR = + OptionWithSignedIntegerSelector = BT_FIELD_CLASS_TYPE_OPTION_WITH_SIGNED_INTEGER_SELECTOR_FIELD, + VariantWithoutSelector = BT_FIELD_CLASS_TYPE_VARIANT_WITHOUT_SELECTOR_FIELD, + VariantWithUnsignedIntegerSelector = BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD, - VARIANT_WITH_SIGNED_INTEGER_SELECTOR = + VariantWithSignedIntegerSelector = BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD, + StaticBlob = BT_FIELD_CLASS_TYPE_STATIC_BLOB, + DynamicBlob = BT_FIELD_CLASS_TYPE_DYNAMIC_BLOB, + DynamicBlobWithoutLengthField = BT_FIELD_CLASS_TYPE_DYNAMIC_BLOB_WITHOUT_LENGTH_FIELD, + DynamicBlobWithLengthField = BT_FIELD_CLASS_TYPE_DYNAMIC_BLOB_WITH_LENGTH_FIELD, }; 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 UserAttributes = - typename std::conditional::value, ConstMapValue, MapValue>::type; + using typename BorrowedObject::LibObjPtr; + using Shared = SharedFieldClass, LibObjT>; + using UserAttributes = internal::DepUserAttrs; - 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 +369,31 @@ public: return this->_libTypeIs(BT_FIELD_CLASS_TYPE_VARIANT_WITH_SIGNED_INTEGER_SELECTOR_FIELD); } + bool isBlob() const noexcept + { + return this->_libTypeIs(BT_FIELD_CLASS_TYPE_BLOB); + } + + bool isStaticBlob() const noexcept + { + return this->_libTypeIs(BT_FIELD_CLASS_TYPE_STATIC_BLOB); + } + + bool isDynamicBlob() const noexcept + { + return this->_libTypeIs(BT_FIELD_CLASS_TYPE_DYNAMIC_BLOB); + } + + bool isDynamicBlobWithoutLength() const noexcept + { + return this->_libTypeIs(BT_FIELD_CLASS_TYPE_DYNAMIC_BLOB_WITHOUT_LENGTH_FIELD); + } + + bool isDynamicBlobWithLength() const noexcept + { + return this->_libTypeIs(BT_FIELD_CLASS_TYPE_DYNAMIC_BLOB_WITH_LENGTH_FIELD); + } + template FieldClassT as() const noexcept { @@ -394,6 +415,9 @@ public: CommonArrayFieldClass asArray() const noexcept; CommonStaticArrayFieldClass asStaticArray() const noexcept; CommonDynamicArrayWithLengthFieldClass asDynamicArrayWithLength() const noexcept; + CommonBlobFieldClass asBlob() const noexcept; + CommonStaticBlobFieldClass asStaticBlob() const noexcept; + CommonDynamicBlobWithLengthFieldClass asDynamicBlobWithLength() const noexcept; CommonOptionFieldClass asOption() const noexcept; CommonOptionWithSelectorFieldClass asOptionWithSelector() const noexcept; CommonOptionWithBoolSelectorFieldClass asOptionWithBoolSelector() const noexcept; @@ -419,20 +443,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())}; @@ -473,17 +492,40 @@ struct TypeDescr : public FieldClassTypeDescr } /* namespace internal */ +class ConstBitArrayFieldClassFlag final : public BorrowedObject +{ +public: + using RangeSet = ConstUnsignedIntegerRangeSet; + + explicit ConstBitArrayFieldClassFlag(const LibObjPtr libObjPtr) noexcept : + _ThisBorrowedObject {libObjPtr} + { + } + + RangeSet ranges() const noexcept + { + return RangeSet { + bt_field_class_bit_array_flag_borrow_index_ranges_const(this->libObjPtr())}; + } + + bt2c::CStringView label() const noexcept + { + return bt_field_class_bit_array_flag_get_label(this->libObjPtr()); + } +}; + 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>; + using Iterator = BorrowedObjectIterator; - explicit CommonBitArrayFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonBitArrayFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isBitArray()); @@ -496,18 +538,59 @@ public: } template - CommonBitArrayFieldClass& + 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()); } + ConstBitArrayFieldClassFlag operator[](const std::uint64_t index) const noexcept + { + return ConstBitArrayFieldClassFlag { + bt_field_class_bit_array_borrow_flag_by_index_const(this->libObjPtr(), index)}; + } + + OptionalBorrowedObject + operator[](const bt2c::CStringView label) const noexcept + { + return bt_field_class_bit_array_borrow_flag_by_label_const(this->libObjPtr(), label); + } + + CommonBitArrayFieldClass addFlag(const bt2c::CStringView label, + const ConstBitArrayFieldClassFlag::RangeSet ranges) const + { + static_assert(!std::is_const::value, + "Not available with `bt2::ConstBitArrayFieldClass`."); + + if (bt_field_class_bit_array_add_flag(this->libObjPtr(), label, ranges.libObjPtr()) == + BT_FIELD_CLASS_BIT_ARRAY_ADD_FLAG_STATUS_MEMORY_ERROR) { + throw MemoryError {}; + } + + return *this; + } + + Iterator begin() const noexcept + { + return Iterator {*this, 0}; + } + + Iterator end() const noexcept + { + return Iterator {*this, this->length()}; + } + Shared shared() const noexcept { return Shared::createWithRef(*this); @@ -539,10 +622,10 @@ struct TypeDescr : public BitArrayFieldClassTypeDescr enum class DisplayBase { - BINARY = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_BINARY, - OCTAL = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_OCTAL, - DECIMAL = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL, - HEXADECIMAL = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_HEXADECIMAL, + Binary = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_BINARY, + Octal = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_OCTAL, + Decimal = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_DECIMAL, + Hexadecimal = BT_FIELD_CLASS_INTEGER_PREFERRED_DISPLAY_BASE_HEXADECIMAL, }; template @@ -552,13 +635,13 @@ 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()); @@ -571,17 +654,24 @@ public: } 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 { - static_assert(!std::is_const::value, "`LibObjT` must NOT be `const`."); + return CommonIntegerFieldClass {*this}; + } + + CommonIntegerFieldClass fieldValueRange(const std::uint64_t n) const noexcept + { + 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 @@ -589,12 +679,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 @@ -630,10 +722,6 @@ struct TypeDescr : public IntegerFieldClassTypeDescr { }; -} /* namespace internal */ - -namespace internal { - template struct ConstEnumerationFieldClassMappingSpec; @@ -677,31 +765,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; } @@ -711,7 +800,7 @@ public: internal::ConstEnumerationFieldClassMappingSpec::ranges(this->libObjPtr())}; } - bpstd::string_view label() const noexcept + bt2c::CStringView label() const noexcept { return internal::ConstEnumerationFieldClassMappingSpec::label(this->libObjPtr()); } @@ -785,13 +874,13 @@ 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()); @@ -805,14 +894,19 @@ public: } template - CommonBaseEnumerationFieldClass& + 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()); } @@ -827,16 +921,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 Iterator = CommonIterator; + 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()); @@ -845,15 +938,15 @@ public: template CommonEnumerationFieldClass( const CommonEnumerationFieldClass fc) noexcept : - _ThisCommonEnumerationFieldClass {fc} + CommonEnumerationFieldClass {fc} { } template - CommonEnumerationFieldClass& + CommonEnumerationFieldClass operator=(const CommonEnumerationFieldClass fc) noexcept { - _ThisCommonEnumerationFieldClass::operator=(fc); + CommonEnumerationFieldClass::operator=(fc); return *this; } @@ -863,36 +956,26 @@ 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 + CommonEnumerationFieldClass addMapping(const bt2c::CStringView label, + const typename Mapping::RangeSet ranges) const { - return (*this)[label.data()]; - } + static_assert(!std::is_const::value, + "Not available with `bt2::Const*EnumerationFieldClass`."); - void addMapping(const char * const label, const typename Mapping::RangeSet ranges) - { const auto status = internal::CommonEnumerationFieldClassSpec::addMapping( this->libObjPtr(), label, ranges.libObjPtr()); if (status == BT_FIELD_CLASS_ENUMERATION_ADD_MAPPING_STATUS_MEMORY_ERROR) { throw MemoryError {}; } - } - void addMapping(const std::string& label, const typename Mapping::RangeSet ranges) - { - this->addMapping(label.data(), ranges); + return *this; } Iterator begin() const noexcept @@ -902,7 +985,7 @@ public: Iterator end() const noexcept { - return Iterator {*this, this->size()}; + return Iterator {*this, this->length()}; } Shared shared() const noexcept @@ -998,72 +1081,65 @@ 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: - using UserAttributes = - typename std::conditional::value, ConstMapValue, MapValue>::type; + using typename BorrowedObject::LibObjPtr; + using UserAttributes = internal::DepUserAttrs; - explicit CommonStructureFieldClassMember(const _LibObjPtr libObjPtr) noexcept : - _ThisBorrowedObj {libObjPtr} + explicit CommonStructureFieldClassMember(const LibObjPtr libObjPtr) noexcept : + _ThisBorrowedObject {libObjPtr} { } template CommonStructureFieldClassMember(const CommonStructureFieldClassMember fc) noexcept : - _ThisBorrowedObj {fc} + _ThisBorrowedObject {fc} { } template - CommonStructureFieldClassMember& + 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 - void userAttributes(const CommonMapValue userAttrs) + CommonStructureFieldClassMember + 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::ConstStructureFieldClassMember`."); bt_field_class_structure_member_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr()); + return *this; } - ConstMapValue userAttributes() const noexcept - { - return ConstMapValue {internal::CommonStructureFieldClassMemberSpec< - const bt_field_class_structure_member>::userAttributes(this->libObjPtr())}; - } - - UserAttributes userAttributes() noexcept + UserAttributes userAttributes() const noexcept { return UserAttributes { internal::CommonStructureFieldClassMemberSpec::userAttributes( @@ -1137,18 +1213,17 @@ 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()); @@ -1161,15 +1236,21 @@ public: } 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 { - static_assert(!std::is_const::value, "`LibObjT` must NOT be `const`."); + return CommonStructureFieldClass {*this}; + } + + CommonStructureFieldClass appendMember(const bt2c::CStringView name, const FieldClass fc) 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()); @@ -1177,14 +1258,11 @@ public: if (status == BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_MEMORY_ERROR) { 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()); } @@ -1196,57 +1274,19 @@ public: Iterator end() const noexcept { - return Iterator {*this, this->size()}; + return Iterator {*this, this->length()}; } - ConstStructureFieldClassMember operator[](const std::uint64_t index) const noexcept - { - return ConstStructureFieldClassMember { - internal::CommonStructureFieldClassSpec::memberByIndex( - this->libObjPtr(), index)}; - } - - 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 + OptionalBorrowedObject operator[](const bt2c::CStringView 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 - { - return (*this)[name.data()]; + return internal::CommonStructureFieldClassSpec::memberByName(this->libObjPtr(), + name); } Shared shared() const noexcept @@ -1306,18 +1346,16 @@ 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()); @@ -1330,20 +1368,18 @@ public: } 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())}; @@ -1383,12 +1419,12 @@ 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()); @@ -1401,13 +1437,18 @@ public: } template - CommonStaticArrayFieldClass& + 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()); @@ -1447,13 +1488,12 @@ class CommonDynamicArrayWithLengthFieldClass final : public CommonArrayFieldClas { 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()); @@ -1467,13 +1507,18 @@ public: } template - CommonDynamicArrayWithLengthFieldClass& + CommonDynamicArrayWithLengthFieldClass operator=(const CommonDynamicArrayWithLengthFieldClass fc) noexcept { _ThisCommonArrayFieldClass::operator=(fc); return *this; } + CommonDynamicArrayWithLengthFieldClass asConst() const noexcept + { + return CommonDynamicArrayWithLengthFieldClass {*this}; + } + ConstFieldPath lengthFieldPath() const noexcept { return ConstFieldPath { @@ -1481,6 +1526,13 @@ public: this->libObjPtr())}; } + ConstFieldLocation lengthFieldLocation() const noexcept + { + return ConstFieldLocation { + bt_field_class_array_dynamic_with_length_field_borrow_length_field_location_const( + this->libObjPtr())}; + } + Shared shared() const noexcept { return Shared::createWithRef(*this); @@ -1512,6 +1564,233 @@ struct TypeDescr : { }; +} /* namespace internal */ + +template +class CommonBlobFieldClass : public CommonFieldClass +{ +private: + using typename CommonFieldClass::_ThisCommonFieldClass; + +protected: + using _ThisCommonBlobFieldClass = CommonBlobFieldClass; + +public: + using Shared = SharedFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + + explicit CommonBlobFieldClass(const LibObjPtr libObjPtr) noexcept : + _ThisCommonFieldClass {libObjPtr} + { + BT_ASSERT_DBG(this->isBlob()); + } + + template + CommonBlobFieldClass(const CommonBlobFieldClass fc) noexcept : + _ThisCommonFieldClass {fc} + { + } + + template + CommonBlobFieldClass operator=(const CommonBlobFieldClass fc) noexcept + { + _ThisCommonFieldClass::operator=(fc); + return *this; + } + + CommonBlobFieldClass asConst() const noexcept + { + return CommonBlobFieldClass {*this}; + } + + bt2c::CStringView mediaType() const noexcept + { + return bt_field_class_blob_get_media_type(this->libObjPtr()); + } + + CommonBlobFieldClass mediaType(const bt2c::CStringView mediaType) const + { + static_assert(!std::is_const::value, + "Not available with `bt2::ConstBlobFieldClass`."); + + if (bt_field_class_blob_set_media_type(this->libObjPtr(), mediaType) == + BT_FIELD_CLASS_BLOB_SET_MEDIA_TYPE_STATUS_MEMORY_ERROR) { + throw MemoryError {}; + } + + return *this; + } + + Shared shared() const noexcept + { + return Shared::createWithRef(*this); + } +}; + +using BlobFieldClass = CommonBlobFieldClass; +using ConstBlobFieldClass = CommonBlobFieldClass; + +namespace internal { + +struct BlobFieldClassTypeDescr +{ + using Const = ConstBlobFieldClass; + using NonConst = BlobFieldClass; +}; + +template <> +struct TypeDescr : public BlobFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : public BlobFieldClassTypeDescr +{ +}; + +} /* namespace internal */ + +template +class CommonStaticBlobFieldClass final : public CommonBlobFieldClass +{ +private: + using typename CommonBlobFieldClass::_ThisCommonBlobFieldClass; + +public: + using Shared = SharedFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + + explicit CommonStaticBlobFieldClass(const LibObjPtr libObjPtr) noexcept : + _ThisCommonBlobFieldClass {libObjPtr} + { + BT_ASSERT_DBG(this->isStaticBlob()); + } + + template + CommonStaticBlobFieldClass(const CommonStaticBlobFieldClass fc) noexcept : + _ThisCommonBlobFieldClass {fc} + { + } + + template + CommonStaticBlobFieldClass operator=(const CommonStaticBlobFieldClass fc) noexcept + { + _ThisCommonBlobFieldClass::operator=(fc); + return *this; + } + + CommonStaticBlobFieldClass asConst() const noexcept + { + return CommonStaticBlobFieldClass {*this}; + } + + std::uint64_t length() const noexcept + { + return bt_field_class_blob_static_get_length(this->libObjPtr()); + } + + Shared shared() const noexcept + { + return Shared::createWithRef(*this); + } +}; + +using StaticBlobFieldClass = CommonStaticBlobFieldClass; +using ConstStaticBlobFieldClass = CommonStaticBlobFieldClass; + +namespace internal { + +struct StaticBlobFieldClassTypeDescr +{ + using Const = ConstStaticBlobFieldClass; + using NonConst = StaticBlobFieldClass; +}; + +template <> +struct TypeDescr : public StaticBlobFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : public StaticBlobFieldClassTypeDescr +{ +}; + +} /* namespace internal */ + +template +class CommonDynamicBlobWithLengthFieldClass final : public CommonBlobFieldClass +{ +private: + using typename CommonBlobFieldClass::_ThisCommonBlobFieldClass; + +public: + using Shared = SharedFieldClass, LibObjT>; + using typename CommonFieldClass::LibObjPtr; + + explicit CommonDynamicBlobWithLengthFieldClass(const LibObjPtr libObjPtr) noexcept : + _ThisCommonBlobFieldClass {libObjPtr} + { + BT_ASSERT_DBG(this->isDynamicBlobWithLength()); + } + + template + CommonDynamicBlobWithLengthFieldClass( + const CommonDynamicBlobWithLengthFieldClass fc) noexcept : + _ThisCommonBlobFieldClass {fc} + { + } + + template + CommonDynamicBlobWithLengthFieldClass + operator=(const CommonDynamicBlobWithLengthFieldClass fc) noexcept + { + _ThisCommonBlobFieldClass::operator=(fc); + return *this; + } + + CommonDynamicBlobWithLengthFieldClass asConst() const noexcept + { + return CommonDynamicBlobWithLengthFieldClass {*this}; + } + + ConstFieldLocation lengthFieldLocation() const noexcept + { + return ConstFieldLocation { + bt_field_class_blob_dynamic_with_length_field_borrow_length_field_location_const( + this->libObjPtr())}; + } + + Shared shared() const noexcept + { + return Shared::createWithRef(*this); + } +}; + +using DynamicBlobWithLengthFieldClass = CommonDynamicBlobWithLengthFieldClass; + +using ConstDynamicBlobWithLengthFieldClass = + CommonDynamicBlobWithLengthFieldClass; + +namespace internal { + +struct DynamicBlobWithLengthFieldClassTypeDescr +{ + using Const = ConstDynamicBlobWithLengthFieldClass; + using NonConst = DynamicBlobWithLengthFieldClass; +}; + +template <> +struct TypeDescr : public DynamicBlobWithLengthFieldClassTypeDescr +{ +}; + +template <> +struct TypeDescr : + public DynamicBlobWithLengthFieldClassTypeDescr +{ +}; + template struct CommonOptionFieldClassSpec; @@ -1542,18 +1821,16 @@ 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()); @@ -1566,20 +1843,18 @@ public: } 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())}; @@ -1621,13 +1896,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()); @@ -1641,13 +1916,18 @@ public: } template - CommonOptionWithSelectorFieldClass& + CommonOptionWithSelectorFieldClass operator=(const CommonOptionWithSelectorFieldClass fc) noexcept { _ThisCommonOptionFieldClass::operator=(fc); return *this; } + CommonOptionWithSelectorFieldClass asConst() const noexcept + { + return CommonOptionWithSelectorFieldClass {*this}; + } + ConstFieldPath selectorFieldPath() const noexcept { return ConstFieldPath { @@ -1655,6 +1935,13 @@ public: this->libObjPtr())}; } + ConstFieldLocation selectorFieldLocation() const noexcept + { + return ConstFieldLocation { + bt_field_class_option_with_selector_field_borrow_selector_field_location_const( + this->libObjPtr())}; + } + Shared shared() const noexcept { return Shared::createWithRef(*this); @@ -1688,16 +1975,14 @@ 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()); @@ -1711,13 +1996,18 @@ public: } template - CommonOptionWithBoolSelectorFieldClass& + 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( @@ -1788,21 +2078,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()); @@ -1816,7 +2100,7 @@ public: } template - CommonOptionWithIntegerSelectorFieldClass& + CommonOptionWithIntegerSelectorFieldClass operator=(const CommonOptionWithIntegerSelectorFieldClass fc) noexcept { _ThisCommonOptionWithSelectorFieldClass::operator=(fc); @@ -1923,76 +2207,63 @@ struct CommonVariantFieldClassOptionSpec fi } /* 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: - using UserAttributes = - typename std::conditional::value, ConstMapValue, MapValue>::type; + using typename BorrowedObject::LibObjPtr; + using UserAttributes = internal::DepUserAttrs; - explicit CommonVariantFieldClassOption(const _LibObjPtr libObjPtr) noexcept : - _ThisBorrowedObj {libObjPtr} + explicit CommonVariantFieldClassOption(const LibObjPtr libObjPtr) noexcept : + _ThisBorrowedObject {libObjPtr} { } template CommonVariantFieldClassOption(const CommonVariantFieldClassOption fc) noexcept : - _ThisBorrowedObj {fc} + _ThisBorrowedObject {fc} { } template - CommonVariantFieldClassOption& + CommonVariantFieldClassOption operator=(const CommonVariantFieldClassOption fc) noexcept { - _ThisBorrowedObj::operator=(fc); + _ThisBorrowedObject::operator=(fc); return *this; } - nonstd::optional name() const noexcept + CommonVariantFieldClassOption asConst() const noexcept { - const auto name = bt_field_class_variant_option_get_name(this->libObjPtr()); - - if (name) { - return name; - } - - return nonstd::nullopt; + 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 - void userAttributes(const CommonMapValue userAttrs) + CommonVariantFieldClassOption + 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::ConstVariantFieldClassOption`."); bt_field_class_variant_option_set_user_attributes(this->libObjPtr(), userAttrs.libObjPtr()); + return *this; } - ConstMapValue userAttributes() const noexcept - { - return ConstMapValue {internal::CommonVariantFieldClassOptionSpec< - const bt_field_class_variant_option>::userAttributes(this->libObjPtr())}; - } - - UserAttributes userAttributes() noexcept + UserAttributes userAttributes() const noexcept { return UserAttributes {internal::CommonVariantFieldClassOptionSpec::userAttributes( this->libObjPtr())}; @@ -2074,37 +2345,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} + _ThisBorrowedObject {fc} { } template - ConstVariantWithIntegerSelectorFieldClassOption& + ConstVariantWithIntegerSelectorFieldClassOption operator=(const ConstVariantWithIntegerSelectorFieldClassOption fc) noexcept { - _ThisBorrowedObj::operator=(fc); + _ThisBorrowedObject::operator=(fc); return *this; } @@ -2113,7 +2385,7 @@ public: return ConstVariantFieldClassOption {_Spec::asBaseOption(this->libObjPtr())}; } - nonstd::optional name() const noexcept + bt2c::CStringView name() const noexcept { return this->asBaseOption().name(); } @@ -2185,19 +2457,17 @@ 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; - - explicit CommonVariantFieldClass(const _LibObjPtr libObjPtr) noexcept : + explicit CommonVariantFieldClass(const LibObjPtr libObjPtr) noexcept : _ThisCommonFieldClass {libObjPtr} { BT_ASSERT_DBG(this->isVariant()); @@ -2210,13 +2480,18 @@ public: } 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()); } @@ -2228,57 +2503,19 @@ public: Iterator end() const noexcept { - return Iterator {*this, this->size()}; - } - - ConstVariantFieldClassOption operator[](const std::uint64_t index) const noexcept - { - return ConstVariantFieldClassOption { - internal::CommonVariantFieldClassSpec::optionByIndex( - this->libObjPtr(), index)}; + return Iterator {*this, this->length()}; } - 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 - { - const auto libObjPtr = - internal::CommonVariantFieldClassSpec::optionByName( - this->libObjPtr(), name); - - if (libObjPtr) { - return ConstVariantFieldClassOption {libObjPtr}; - } - - return nonstd::nullopt; - } - - nonstd::optional - operator[](const std::string& name) const noexcept + OptionalBorrowedObject