template <typename LibObjT>
class CommonDynamicArrayWithLengthFieldClass;
+template <typename LibObjT>
+class CommonBlobFieldClass;
+
+template <typename LibObjT>
+class CommonStaticBlobFieldClass;
+
+template <typename LibObjT>
+class CommonDynamicBlobWithLengthFieldClass;
+
template <typename LibObjT>
class CommonOptionFieldClass;
template <typename LibObjT>
class CommonTraceClass;
-enum class FieldClassType
+enum class FieldClassType : std::uint64_t
{
Bool = BT_FIELD_CLASS_TYPE_BOOL,
BitArray = BT_FIELD_CLASS_TYPE_BIT_ARRAY,
BT_FIELD_CLASS_TYPE_VARIANT_WITH_UNSIGNED_INTEGER_SELECTOR_FIELD,
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 <typename LibObjT>
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 <typename FieldClassT>
FieldClassT as() const noexcept
{
CommonArrayFieldClass<LibObjT> asArray() const noexcept;
CommonStaticArrayFieldClass<LibObjT> asStaticArray() const noexcept;
CommonDynamicArrayWithLengthFieldClass<LibObjT> asDynamicArrayWithLength() const noexcept;
+ CommonBlobFieldClass<LibObjT> asBlob() const noexcept;
+ CommonStaticBlobFieldClass<LibObjT> asStaticBlob() const noexcept;
+ CommonDynamicBlobWithLengthFieldClass<LibObjT> asDynamicBlobWithLength() const noexcept;
CommonOptionFieldClass<LibObjT> asOption() const noexcept;
CommonOptionWithSelectorFieldClass<LibObjT> asOptionWithSelector() const noexcept;
CommonOptionWithBoolSelectorFieldClass<LibObjT> asOptionWithBoolSelector() const noexcept;
{
};
+} /* namespace internal */
+
+template <typename LibObjT>
+class CommonBlobFieldClass : public CommonFieldClass<LibObjT>
+{
+private:
+ using typename CommonFieldClass<LibObjT>::_ThisCommonFieldClass;
+
+protected:
+ using _ThisCommonBlobFieldClass = CommonBlobFieldClass<LibObjT>;
+
+public:
+ using Shared = SharedFieldClass<CommonBlobFieldClass<LibObjT>, LibObjT>;
+ using typename CommonFieldClass<LibObjT>::LibObjPtr;
+
+ explicit CommonBlobFieldClass(const LibObjPtr libObjPtr) noexcept :
+ _ThisCommonFieldClass {libObjPtr}
+ {
+ BT_ASSERT_DBG(this->isBlob());
+ }
+
+ template <typename OtherLibObjT>
+ CommonBlobFieldClass(const CommonBlobFieldClass<OtherLibObjT> fc) noexcept :
+ _ThisCommonFieldClass {fc}
+ {
+ }
+
+ template <typename OtherLibObjT>
+ CommonBlobFieldClass operator=(const CommonBlobFieldClass<OtherLibObjT> fc) noexcept
+ {
+ _ThisCommonFieldClass::operator=(fc);
+ return *this;
+ }
+
+ CommonBlobFieldClass<const bt_field_class> asConst() const noexcept
+ {
+ return CommonBlobFieldClass<const bt_field_class> {*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<LibObjT>::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<bt_field_class>;
+using ConstBlobFieldClass = CommonBlobFieldClass<const bt_field_class>;
+
+namespace internal {
+
+struct BlobFieldClassTypeDescr
+{
+ using Const = ConstBlobFieldClass;
+ using NonConst = BlobFieldClass;
+};
+
+template <>
+struct TypeDescr<BlobFieldClass> : public BlobFieldClassTypeDescr
+{
+};
+
+template <>
+struct TypeDescr<ConstBlobFieldClass> : public BlobFieldClassTypeDescr
+{
+};
+
+} /* namespace internal */
+
+template <typename LibObjT>
+class CommonStaticBlobFieldClass final : public CommonBlobFieldClass<LibObjT>
+{
+private:
+ using typename CommonBlobFieldClass<LibObjT>::_ThisCommonBlobFieldClass;
+
+public:
+ using Shared = SharedFieldClass<CommonStaticBlobFieldClass<LibObjT>, LibObjT>;
+ using typename CommonFieldClass<LibObjT>::LibObjPtr;
+
+ explicit CommonStaticBlobFieldClass(const LibObjPtr libObjPtr) noexcept :
+ _ThisCommonBlobFieldClass {libObjPtr}
+ {
+ BT_ASSERT_DBG(this->isStaticBlob());
+ }
+
+ template <typename OtherLibObjT>
+ CommonStaticBlobFieldClass(const CommonStaticBlobFieldClass<OtherLibObjT> fc) noexcept :
+ _ThisCommonBlobFieldClass {fc}
+ {
+ }
+
+ template <typename OtherLibObjT>
+ CommonStaticBlobFieldClass operator=(const CommonStaticBlobFieldClass<OtherLibObjT> fc) noexcept
+ {
+ _ThisCommonBlobFieldClass::operator=(fc);
+ return *this;
+ }
+
+ CommonStaticBlobFieldClass<const bt_field_class> asConst() const noexcept
+ {
+ return CommonStaticBlobFieldClass<const bt_field_class> {*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<bt_field_class>;
+using ConstStaticBlobFieldClass = CommonStaticBlobFieldClass<const bt_field_class>;
+
+namespace internal {
+
+struct StaticBlobFieldClassTypeDescr
+{
+ using Const = ConstStaticBlobFieldClass;
+ using NonConst = StaticBlobFieldClass;
+};
+
+template <>
+struct TypeDescr<StaticBlobFieldClass> : public StaticBlobFieldClassTypeDescr
+{
+};
+
+template <>
+struct TypeDescr<ConstStaticBlobFieldClass> : public StaticBlobFieldClassTypeDescr
+{
+};
+
+} /* namespace internal */
+
+template <typename LibObjT>
+class CommonDynamicBlobWithLengthFieldClass final : public CommonBlobFieldClass<LibObjT>
+{
+private:
+ using typename CommonBlobFieldClass<LibObjT>::_ThisCommonBlobFieldClass;
+
+public:
+ using Shared = SharedFieldClass<CommonDynamicBlobWithLengthFieldClass<LibObjT>, LibObjT>;
+ using typename CommonFieldClass<LibObjT>::LibObjPtr;
+
+ explicit CommonDynamicBlobWithLengthFieldClass(const LibObjPtr libObjPtr) noexcept :
+ _ThisCommonBlobFieldClass {libObjPtr}
+ {
+ BT_ASSERT_DBG(this->isDynamicBlobWithLength());
+ }
+
+ template <typename OtherLibObjT>
+ CommonDynamicBlobWithLengthFieldClass(
+ const CommonDynamicBlobWithLengthFieldClass<OtherLibObjT> fc) noexcept :
+ _ThisCommonBlobFieldClass {fc}
+ {
+ }
+
+ template <typename OtherLibObjT>
+ CommonDynamicBlobWithLengthFieldClass
+ operator=(const CommonDynamicBlobWithLengthFieldClass<OtherLibObjT> fc) noexcept
+ {
+ _ThisCommonBlobFieldClass::operator=(fc);
+ return *this;
+ }
+
+ CommonDynamicBlobWithLengthFieldClass<const bt_field_class> asConst() const noexcept
+ {
+ return CommonDynamicBlobWithLengthFieldClass<const bt_field_class> {*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<bt_field_class>;
+
+using ConstDynamicBlobWithLengthFieldClass =
+ CommonDynamicBlobWithLengthFieldClass<const bt_field_class>;
+
+namespace internal {
+
+struct DynamicBlobWithLengthFieldClassTypeDescr
+{
+ using Const = ConstDynamicBlobWithLengthFieldClass;
+ using NonConst = DynamicBlobWithLengthFieldClass;
+};
+
+template <>
+struct TypeDescr<DynamicBlobWithLengthFieldClass> : public DynamicBlobWithLengthFieldClassTypeDescr
+{
+};
+
+template <>
+struct TypeDescr<ConstDynamicBlobWithLengthFieldClass> :
+ public DynamicBlobWithLengthFieldClassTypeDescr
+{
+};
+
template <typename LibObjT>
struct CommonOptionFieldClassSpec;
return CommonDynamicArrayWithLengthFieldClass<LibObjT> {this->libObjPtr()};
}
+template <typename LibObjT>
+CommonBlobFieldClass<LibObjT> CommonFieldClass<LibObjT>::asBlob() const noexcept
+{
+ BT_ASSERT_DBG(this->isBlob());
+ return CommonBlobFieldClass<LibObjT> {this->libObjPtr()};
+}
+
+template <typename LibObjT>
+CommonStaticBlobFieldClass<LibObjT> CommonFieldClass<LibObjT>::asStaticBlob() const noexcept
+{
+ BT_ASSERT_DBG(this->isStaticBlob());
+ return CommonStaticBlobFieldClass<LibObjT> {this->libObjPtr()};
+}
+
+template <typename LibObjT>
+CommonDynamicBlobWithLengthFieldClass<LibObjT>
+CommonFieldClass<LibObjT>::asDynamicBlobWithLength() const noexcept
+{
+ BT_ASSERT_DBG(this->isDynamicBlobWithLength());
+ return CommonDynamicBlobWithLengthFieldClass<LibObjT> {this->libObjPtr()};
+}
+
template <typename LibObjT>
CommonOptionFieldClass<LibObjT> CommonFieldClass<LibObjT>::asOption() const noexcept
{