2 * Copyright (c) 2020 Philippe Proulx <pproulx@efficios.com>
4 * SPDX-License-Identifier: MIT
7 #ifndef BABELTRACE_CPP_COMMON_BT2_VALUE_HPP
8 #define BABELTRACE_CPP_COMMON_BT2_VALUE_HPP
12 #include <type_traits>
14 #include <babeltrace2/babeltrace.h>
16 #include "common/assert.h"
17 #include "common/common.h"
18 #include "cpp-common/optional.hpp"
19 #include "cpp-common/string_view.hpp"
21 #include "borrowed-object.hpp"
22 #include "common-iterator.hpp"
24 #include "internal/utils.hpp"
25 #include "shared-object.hpp"
30 struct ValueRefFuncs final
32 static void get(const bt_value * const libObjPtr) noexcept
34 bt_value_get_ref(libObjPtr);
37 static void put(const bt_value * const libObjPtr) noexcept
39 bt_value_put_ref(libObjPtr);
43 } /* namespace internal */
45 template <typename ObjT, typename LibObjT>
46 using SharedValue = SharedObject<ObjT, LibObjT, internal::ValueRefFuncs>;
48 template <typename LibObjT>
49 class CommonNullValue;
51 template <typename LibObjT>
52 class CommonBoolValue;
54 template <typename LibObjT>
55 class CommonUnsignedIntegerValue;
57 template <typename LibObjT>
58 class CommonSignedIntegerValue;
60 template <typename LibObjT>
61 class CommonRealValue;
63 template <typename LibObjT>
64 class CommonStringValue;
66 template <typename LibObjT>
67 class CommonArrayValue;
69 template <typename LibObjT>
74 NUL = BT_VALUE_TYPE_NULL,
75 BOOL = BT_VALUE_TYPE_BOOL,
76 UNSIGNED_INTEGER = BT_VALUE_TYPE_UNSIGNED_INTEGER,
77 SIGNED_INTEGER = BT_VALUE_TYPE_SIGNED_INTEGER,
78 REAL = BT_VALUE_TYPE_REAL,
79 STRING = BT_VALUE_TYPE_STRING,
80 ARRAY = BT_VALUE_TYPE_ARRAY,
81 MAP = BT_VALUE_TYPE_MAP,
84 template <typename LibObjT>
85 class CommonValue : public BorrowedObject<LibObjT>
88 using typename BorrowedObject<LibObjT>::_ThisBorrowedObject;
91 using typename BorrowedObject<LibObjT>::_LibObjPtr;
92 using _ThisCommonValue = CommonValue<LibObjT>;
95 using Shared = SharedValue<CommonValue<LibObjT>, LibObjT>;
97 explicit CommonValue(const _LibObjPtr libObjPtr) noexcept : _ThisBorrowedObject {libObjPtr}
101 template <typename OtherLibObjT>
102 CommonValue(const CommonValue<OtherLibObjT> val) noexcept : _ThisBorrowedObject {val}
106 template <typename OtherLibObjT>
107 _ThisCommonValue& operator=(const CommonValue<OtherLibObjT> val) noexcept
109 _ThisBorrowedObject::operator=(val);
113 ValueType type() const noexcept
115 return static_cast<ValueType>(bt_value_get_type(this->libObjPtr()));
118 bool isNull() const noexcept
120 return this->_libTypeIs(BT_VALUE_TYPE_NULL);
123 bool isBool() const noexcept
125 return this->_libTypeIs(BT_VALUE_TYPE_BOOL);
128 bool isInteger() const noexcept
130 return this->_libTypeIs(BT_VALUE_TYPE_INTEGER);
133 bool isUnsignedInteger() const noexcept
135 return this->_libTypeIs(BT_VALUE_TYPE_UNSIGNED_INTEGER);
138 bool isSignedInteger() const noexcept
140 return this->_libTypeIs(BT_VALUE_TYPE_SIGNED_INTEGER);
143 bool isReal() const noexcept
145 return this->_libTypeIs(BT_VALUE_TYPE_REAL);
148 bool isString() const noexcept
150 return this->_libTypeIs(BT_VALUE_TYPE_STRING);
153 bool isArray() const noexcept
155 return this->_libTypeIs(BT_VALUE_TYPE_ARRAY);
158 bool isMap() const noexcept
160 return this->_libTypeIs(BT_VALUE_TYPE_MAP);
163 template <typename OtherLibObjT>
164 bool operator==(const CommonValue<OtherLibObjT> other) const noexcept
166 return static_cast<bool>(bt_value_is_equal(this->libObjPtr(), other.libObjPtr()));
169 template <typename OtherLibObjT>
170 bool operator!=(const CommonValue<OtherLibObjT> other) const noexcept
172 return !(*this == other);
175 Shared shared() const noexcept
177 return Shared::createWithRef(*this);
180 template <typename ValueT>
181 ValueT as() const noexcept
183 return ValueT {this->libObjPtr()};
186 CommonNullValue<LibObjT> asNull() const noexcept;
187 CommonBoolValue<LibObjT> asBool() const noexcept;
188 CommonSignedIntegerValue<LibObjT> asSignedInteger() const noexcept;
189 CommonUnsignedIntegerValue<LibObjT> asUnsignedInteger() const noexcept;
190 CommonRealValue<LibObjT> asReal() const noexcept;
191 CommonStringValue<LibObjT> asString() const noexcept;
192 CommonArrayValue<LibObjT> asArray() const noexcept;
193 CommonMapValue<LibObjT> asMap() const noexcept;
196 bool _libTypeIs(const bt_value_type type) const noexcept
198 return bt_value_type_is(bt_value_get_type(this->libObjPtr()), type);
202 using Value = CommonValue<bt_value>;
203 using ConstValue = CommonValue<const bt_value>;
207 struct ValueTypeDescr
209 using Const = ConstValue;
210 using NonConst = Value;
214 struct TypeDescr<Value> : public ValueTypeDescr
219 struct TypeDescr<ConstValue> : public ValueTypeDescr
223 } /* namespace internal */
225 template <typename LibObjT>
226 class CommonNullValue final : public CommonValue<LibObjT>
229 using typename CommonValue<LibObjT>::_ThisCommonValue;
232 using Shared = SharedValue<CommonNullValue<LibObjT>, LibObjT>;
234 CommonNullValue() noexcept : _ThisCommonValue {bt_value_null}
238 template <typename OtherLibObjT>
239 CommonNullValue(const CommonNullValue<OtherLibObjT> val) noexcept : _ThisCommonValue {val}
243 template <typename OtherLibObjT>
244 CommonNullValue<LibObjT>& operator=(const CommonNullValue<OtherLibObjT> val) noexcept
246 _ThisCommonValue::operator=(val);
250 Shared shared() const noexcept
252 return Shared::createWithRef(*this);
256 using NullValue = CommonNullValue<bt_value>;
257 using ConstNullValue = CommonNullValue<const bt_value>;
261 struct NullValueTypeDescr
263 using Const = ConstNullValue;
264 using NonConst = NullValue;
268 struct TypeDescr<NullValue> : public NullValueTypeDescr
273 struct TypeDescr<ConstNullValue> : public NullValueTypeDescr
277 } /* namespace internal */
279 template <typename LibObjT>
280 class CommonBoolValue final : public CommonValue<LibObjT>
283 using typename CommonValue<LibObjT>::_LibObjPtr;
284 using typename CommonValue<LibObjT>::_ThisCommonValue;
287 using Shared = SharedValue<CommonBoolValue<LibObjT>, LibObjT>;
290 explicit CommonBoolValue(const _LibObjPtr libObjPtr) noexcept : _ThisCommonValue {libObjPtr}
292 BT_ASSERT_DBG(this->isBool());
295 template <typename OtherLibObjT>
296 CommonBoolValue(const CommonBoolValue<OtherLibObjT> val) noexcept : _ThisCommonValue {val}
300 static Shared create(const Value rawVal = false)
302 const auto libObjPtr = bt_value_bool_create_init(static_cast<bt_bool>(rawVal));
304 internal::validateCreatedObjPtr(libObjPtr);
305 return CommonBoolValue::Shared::createWithoutRef(libObjPtr);
308 template <typename OtherLibObjT>
309 CommonBoolValue<LibObjT>& operator=(const CommonBoolValue<OtherLibObjT> val) noexcept
311 _ThisCommonValue::operator=(val);
315 CommonBoolValue<LibObjT> operator=(const Value rawVal) const noexcept
317 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
319 bt_value_bool_set(this->libObjPtr(), static_cast<bt_bool>(rawVal));
323 Value value() const noexcept
325 return static_cast<Value>(bt_value_bool_get(this->libObjPtr()));
328 operator Value() const noexcept
330 return this->value();
333 Shared shared() const noexcept
335 return Shared::createWithRef(*this);
339 using BoolValue = CommonBoolValue<bt_value>;
340 using ConstBoolValue = CommonBoolValue<const bt_value>;
344 struct BoolValueTypeDescr
346 using Const = ConstBoolValue;
347 using NonConst = BoolValue;
351 struct TypeDescr<BoolValue> : public BoolValueTypeDescr
356 struct TypeDescr<ConstBoolValue> : public BoolValueTypeDescr
360 } /* namespace internal */
362 template <typename LibObjT>
363 class CommonUnsignedIntegerValue final : public CommonValue<LibObjT>
366 using typename CommonValue<LibObjT>::_LibObjPtr;
367 using typename CommonValue<LibObjT>::_ThisCommonValue;
370 using Shared = SharedValue<CommonUnsignedIntegerValue<LibObjT>, LibObjT>;
371 using Value = std::uint64_t;
373 explicit CommonUnsignedIntegerValue(const _LibObjPtr libObjPtr) noexcept :
374 _ThisCommonValue {libObjPtr}
376 BT_ASSERT_DBG(this->isUnsignedInteger());
379 static Shared create(const Value rawVal = 0)
381 const auto libObjPtr = bt_value_integer_unsigned_create_init(rawVal);
383 internal::validateCreatedObjPtr(libObjPtr);
384 return CommonUnsignedIntegerValue::Shared::createWithoutRef(libObjPtr);
387 template <typename OtherLibObjT>
388 CommonUnsignedIntegerValue(const CommonUnsignedIntegerValue<OtherLibObjT> val) noexcept :
389 _ThisCommonValue {val}
393 template <typename OtherLibObjT>
394 CommonUnsignedIntegerValue<LibObjT>&
395 operator=(const CommonUnsignedIntegerValue<OtherLibObjT> val) noexcept
397 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
399 _ThisCommonValue::operator=(val);
403 CommonUnsignedIntegerValue<LibObjT> operator=(const Value rawVal) const noexcept
405 bt_value_integer_unsigned_set(this->libObjPtr(), rawVal);
409 Value value() const noexcept
411 return bt_value_integer_unsigned_get(this->libObjPtr());
414 operator Value() const noexcept
416 return this->value();
419 Shared shared() const noexcept
421 return Shared::createWithRef(*this);
425 using UnsignedIntegerValue = CommonUnsignedIntegerValue<bt_value>;
426 using ConstUnsignedIntegerValue = CommonUnsignedIntegerValue<const bt_value>;
430 struct UnsignedIntegerValueTypeDescr
432 using Const = ConstUnsignedIntegerValue;
433 using NonConst = UnsignedIntegerValue;
437 struct TypeDescr<UnsignedIntegerValue> : public UnsignedIntegerValueTypeDescr
442 struct TypeDescr<ConstUnsignedIntegerValue> : public UnsignedIntegerValueTypeDescr
446 } /* namespace internal */
448 template <typename LibObjT>
449 class CommonSignedIntegerValue final : public CommonValue<LibObjT>
452 using typename CommonValue<LibObjT>::_LibObjPtr;
453 using typename CommonValue<LibObjT>::_ThisCommonValue;
456 using Shared = SharedValue<CommonSignedIntegerValue<LibObjT>, LibObjT>;
457 using Value = std::int64_t;
459 explicit CommonSignedIntegerValue(const _LibObjPtr libObjPtr) noexcept :
460 _ThisCommonValue {libObjPtr}
462 BT_ASSERT_DBG(this->isSignedInteger());
465 static Shared create(const Value rawVal = 0)
467 const auto libObjPtr = bt_value_integer_signed_create_init(rawVal);
469 internal::validateCreatedObjPtr(libObjPtr);
470 return CommonSignedIntegerValue::Shared::createWithoutRef(libObjPtr);
473 template <typename OtherLibObjT>
474 CommonSignedIntegerValue(const CommonSignedIntegerValue<OtherLibObjT> val) noexcept :
475 _ThisCommonValue {val}
479 template <typename OtherLibObjT>
480 CommonSignedIntegerValue<LibObjT>
481 operator=(const CommonSignedIntegerValue<OtherLibObjT> val) noexcept
483 _ThisCommonValue::operator=(val);
487 CommonSignedIntegerValue<LibObjT> operator=(const Value rawVal) const noexcept
489 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
491 bt_value_integer_signed_set(this->libObjPtr(), rawVal);
495 Value value() const noexcept
497 return bt_value_integer_signed_get(this->libObjPtr());
500 operator Value() const noexcept
502 return this->value();
505 Shared shared() const noexcept
507 return Shared::createWithRef(*this);
511 using SignedIntegerValue = CommonSignedIntegerValue<bt_value>;
512 using ConstSignedIntegerValue = CommonSignedIntegerValue<const bt_value>;
516 struct SignedIntegerValueTypeDescr
518 using Const = ConstSignedIntegerValue;
519 using NonConst = SignedIntegerValue;
523 struct TypeDescr<SignedIntegerValue> : public SignedIntegerValueTypeDescr
528 struct TypeDescr<ConstSignedIntegerValue> : public SignedIntegerValueTypeDescr
532 } /* namespace internal */
534 template <typename LibObjT>
535 class CommonRealValue final : public CommonValue<LibObjT>
538 using typename CommonValue<LibObjT>::_LibObjPtr;
539 using typename CommonValue<LibObjT>::_ThisCommonValue;
542 using Shared = SharedValue<CommonRealValue<LibObjT>, LibObjT>;
543 using Value = double;
545 explicit CommonRealValue(const _LibObjPtr libObjPtr) noexcept : _ThisCommonValue {libObjPtr}
547 BT_ASSERT_DBG(this->isReal());
550 static Shared create(const Value rawVal = 0)
552 const auto libObjPtr = bt_value_real_create_init(rawVal);
554 internal::validateCreatedObjPtr(libObjPtr);
555 return CommonRealValue::Shared::createWithoutRef(libObjPtr);
558 template <typename OtherLibObjT>
559 CommonRealValue(const CommonRealValue<OtherLibObjT> val) noexcept : _ThisCommonValue {val}
563 template <typename OtherLibObjT>
564 CommonRealValue<LibObjT>& operator=(const CommonRealValue<OtherLibObjT> val) noexcept
566 _ThisCommonValue::operator=(val);
570 CommonRealValue<LibObjT> operator=(const Value rawVal) const noexcept
572 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
574 bt_value_real_set(this->libObjPtr(), rawVal);
578 Value value() const noexcept
580 return bt_value_real_get(this->libObjPtr());
583 operator Value() const noexcept
585 return this->value();
588 Shared shared() const noexcept
590 return Shared::createWithRef(*this);
594 using RealValue = CommonRealValue<bt_value>;
595 using ConstRealValue = CommonRealValue<const bt_value>;
599 struct RealValueTypeDescr
601 using Const = ConstRealValue;
602 using NonConst = RealValue;
606 struct TypeDescr<RealValue> : public RealValueTypeDescr
611 struct TypeDescr<ConstRealValue> : public RealValueTypeDescr
615 } /* namespace internal */
617 template <typename LibObjT>
618 class CommonStringValue final : public CommonValue<LibObjT>
621 using typename CommonValue<LibObjT>::_LibObjPtr;
622 using typename CommonValue<LibObjT>::_ThisCommonValue;
625 using Shared = SharedValue<CommonStringValue<LibObjT>, LibObjT>;
627 explicit CommonStringValue(const _LibObjPtr libObjPtr) noexcept : _ThisCommonValue {libObjPtr}
629 BT_ASSERT_DBG(this->isString());
632 static Shared create(const char * const rawVal = "")
634 const auto libObjPtr = bt_value_string_create_init(rawVal);
636 internal::validateCreatedObjPtr(libObjPtr);
637 return CommonStringValue::Shared::createWithoutRef(libObjPtr);
640 static Shared create(const std::string& rawVal)
642 return CommonStringValue::create(rawVal.data());
645 template <typename OtherLibObjT>
646 CommonStringValue(const CommonStringValue<OtherLibObjT> val) noexcept : _ThisCommonValue {val}
650 template <typename OtherLibObjT>
651 CommonStringValue<LibObjT>& operator=(const CommonStringValue<OtherLibObjT> val) noexcept
653 _ThisCommonValue::operator=(val);
657 CommonStringValue<LibObjT> operator=(const char * const rawVal) const
659 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
661 const auto status = bt_value_string_set(this->libObjPtr(), rawVal);
663 if (status == BT_VALUE_STRING_SET_STATUS_MEMORY_ERROR) {
664 throw MemoryError {};
670 CommonStringValue<LibObjT> operator=(const std::string& rawVal) const noexcept
672 return *this = rawVal.data();
675 bpstd::string_view value() const noexcept
677 return bt_value_string_get(this->libObjPtr());
680 Shared shared() const noexcept
682 return Shared::createWithRef(*this);
686 using StringValue = CommonStringValue<bt_value>;
687 using ConstStringValue = CommonStringValue<const bt_value>;
691 struct StringValueTypeDescr
693 using Const = ConstStringValue;
694 using NonConst = StringValue;
698 struct TypeDescr<StringValue> : public StringValueTypeDescr
703 struct TypeDescr<ConstStringValue> : public StringValueTypeDescr
707 template <typename LibObjT>
708 struct CommonArrayValueSpec;
710 /* Functions specific to mutable array values */
712 struct CommonArrayValueSpec<bt_value> final
714 static bt_value *elementByIndex(bt_value * const libValPtr, const std::uint64_t index) noexcept
716 return bt_value_array_borrow_element_by_index(libValPtr, index);
720 /* Functions specific to constant array values */
722 struct CommonArrayValueSpec<const bt_value> final
724 static const bt_value *elementByIndex(const bt_value * const libValPtr,
725 const std::uint64_t index) noexcept
727 return bt_value_array_borrow_element_by_index_const(libValPtr, index);
731 } /* namespace internal */
733 template <typename LibObjT>
734 class CommonArrayValue final : public CommonValue<LibObjT>
737 using typename CommonValue<LibObjT>::_LibObjPtr;
738 using typename CommonValue<LibObjT>::_ThisCommonValue;
741 using Shared = SharedValue<CommonArrayValue<LibObjT>, LibObjT>;
742 using Iterator = CommonIterator<CommonArrayValue<LibObjT>, CommonValue<LibObjT>>;
744 explicit CommonArrayValue(const _LibObjPtr libObjPtr) noexcept : _ThisCommonValue {libObjPtr}
746 BT_ASSERT_DBG(this->isArray());
749 static Shared create()
751 const auto libObjPtr = bt_value_array_create();
753 internal::validateCreatedObjPtr(libObjPtr);
754 return CommonArrayValue::Shared::createWithoutRef(libObjPtr);
757 template <typename OtherLibObjT>
758 CommonArrayValue(const CommonArrayValue<OtherLibObjT> val) noexcept : _ThisCommonValue {val}
762 template <typename OtherLibObjT>
763 CommonArrayValue<LibObjT>& operator=(const CommonArrayValue<OtherLibObjT> val) noexcept
765 _ThisCommonValue::operator=(val);
769 std::uint64_t length() const noexcept
771 return bt_value_array_get_length(this->libObjPtr());
774 /* Required by the `CommonIterator` template class */
775 std::uint64_t size() const noexcept
777 return this->length();
780 Iterator begin() const noexcept
782 return Iterator {*this, 0};
785 Iterator end() const noexcept
787 return Iterator {*this, this->length()};
790 bool isEmpty() const noexcept
792 return this->length() == 0;
795 CommonValue<LibObjT> operator[](const std::uint64_t index) const noexcept
797 return CommonValue<LibObjT> {
798 internal::CommonArrayValueSpec<LibObjT>::elementByIndex(this->libObjPtr(), index)};
801 void append(const Value val) const
803 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
805 const auto status = bt_value_array_append_element(this->libObjPtr(), val.libObjPtr());
807 this->_handleAppendLibStatus(status);
810 void append(const bool rawVal) const
812 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
815 bt_value_array_append_bool_element(this->libObjPtr(), static_cast<bt_bool>(rawVal));
817 this->_handleAppendLibStatus(status);
820 void append(const std::uint64_t rawVal) const
822 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
825 bt_value_array_append_unsigned_integer_element(this->libObjPtr(), rawVal);
827 this->_handleAppendLibStatus(status);
830 void append(const std::int64_t rawVal) const
832 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
834 const auto status = bt_value_array_append_signed_integer_element(this->libObjPtr(), rawVal);
836 this->_handleAppendLibStatus(status);
839 void append(const double rawVal) const
841 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
843 const auto status = bt_value_array_append_real_element(this->libObjPtr(), rawVal);
845 this->_handleAppendLibStatus(status);
848 void append(const char * const rawVal) const
850 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
852 const auto status = bt_value_array_append_string_element(this->libObjPtr(), rawVal);
854 this->_handleAppendLibStatus(status);
857 void append(const std::string& rawVal) const
859 this->append(rawVal.data());
862 CommonArrayValue<bt_value> appendEmptyArray() const;
863 CommonMapValue<bt_value> appendEmptyMap() const;
865 void operator+=(const Value val) const
870 void operator+=(const bool rawVal) const
872 this->append(rawVal);
875 void operator+=(const std::uint64_t rawVal) const
877 this->append(rawVal);
880 void operator+=(const std::int64_t rawVal) const
882 this->append(rawVal);
885 void operator+=(const double rawVal) const
887 this->append(rawVal);
890 void operator+=(const char * const rawVal) const
892 this->append(rawVal);
895 void operator+=(const std::string& rawVal) const
897 this->append(rawVal);
900 Shared shared() const noexcept
902 return Shared::createWithRef(*this);
906 void _handleAppendLibStatus(const bt_value_array_append_element_status status) const
908 if (status == BT_VALUE_ARRAY_APPEND_ELEMENT_STATUS_MEMORY_ERROR) {
909 throw MemoryError {};
914 using ArrayValue = CommonArrayValue<bt_value>;
915 using ConstArrayValue = CommonArrayValue<const bt_value>;
919 struct ArrayValueTypeDescr
921 using Const = ConstArrayValue;
922 using NonConst = ArrayValue;
926 struct TypeDescr<ArrayValue> : public ArrayValueTypeDescr
931 struct TypeDescr<ConstArrayValue> : public ArrayValueTypeDescr
936 * Type of a user function passed to `CommonMapValue<ObjT>::forEach()`.
938 * First argument is the entry's key, second is its value.
940 template <typename ObjT>
941 using CommonMapValueForEachUserFunc = std::function<void(const bpstd::string_view&, ObjT)>;
944 * Template of a function to be passed to bt_value_map_foreach_entry()
945 * for bt_value_map_foreach_entry_const() which calls a user function.
947 * `userData` is casted to a `const` pointer to
948 * `CommonMapValueForEachUserFunc<ObjT>` (the user function to call).
950 * This function catches any exception which the user function throws
951 * and returns the `ErrorStatus` value. If there's no execption, this
952 * function returns the `OkStatus` value.
954 template <typename ObjT, typename LibObjT, typename LibStatusT, int OkStatus, int ErrorStatus>
955 LibStatusT mapValueForEachLibFunc(const char * const key, LibObjT * const libObjPtr,
956 void * const userData)
958 const auto& userFunc = *reinterpret_cast<const CommonMapValueForEachUserFunc<ObjT> *>(userData);
961 userFunc(key, ObjT {libObjPtr});
963 return static_cast<LibStatusT>(ErrorStatus);
966 return static_cast<LibStatusT>(OkStatus);
969 template <typename LibObjT>
970 struct CommonMapValueSpec;
972 /* Functions specific to mutable map values */
974 struct CommonMapValueSpec<bt_value> final
976 static bt_value *entryByKey(bt_value * const libValPtr, const char * const key) noexcept
978 return bt_value_map_borrow_entry_value(libValPtr, key);
981 static void forEach(bt_value * const libValPtr,
982 const CommonMapValueForEachUserFunc<Value>& func)
984 const auto status = bt_value_map_foreach_entry(
986 mapValueForEachLibFunc<Value, bt_value, bt_value_map_foreach_entry_func_status,
987 BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_OK,
988 BT_VALUE_MAP_FOREACH_ENTRY_FUNC_STATUS_ERROR>,
989 const_cast<void *>(reinterpret_cast<const void *>(&func)));
992 case BT_VALUE_MAP_FOREACH_ENTRY_STATUS_OK:
994 case BT_VALUE_MAP_FOREACH_ENTRY_STATUS_USER_ERROR:
995 case BT_VALUE_MAP_FOREACH_ENTRY_STATUS_ERROR:
1003 /* Functions specific to constant map values */
1005 struct CommonMapValueSpec<const bt_value> final
1007 static const bt_value *entryByKey(const bt_value * const libValPtr,
1008 const char * const key) noexcept
1010 return bt_value_map_borrow_entry_value_const(libValPtr, key);
1013 static void forEach(const bt_value * const libValPtr,
1014 const CommonMapValueForEachUserFunc<ConstValue>& func)
1016 const auto status = bt_value_map_foreach_entry_const(
1018 mapValueForEachLibFunc<ConstValue, const bt_value,
1019 bt_value_map_foreach_entry_const_func_status,
1020 BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_OK,
1021 BT_VALUE_MAP_FOREACH_ENTRY_CONST_FUNC_STATUS_ERROR>,
1022 const_cast<void *>(reinterpret_cast<const void *>(&func)));
1025 case BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_OK:
1027 case BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_USER_ERROR:
1028 case BT_VALUE_MAP_FOREACH_ENTRY_CONST_STATUS_ERROR:
1036 } /* namespace internal */
1038 template <typename LibObjT>
1039 class CommonMapValue final : public CommonValue<LibObjT>
1042 using typename CommonValue<LibObjT>::_LibObjPtr;
1043 using typename CommonValue<LibObjT>::_ThisCommonValue;
1046 using Shared = SharedValue<CommonMapValue<LibObjT>, LibObjT>;
1048 explicit CommonMapValue(const _LibObjPtr libObjPtr) noexcept : _ThisCommonValue {libObjPtr}
1050 BT_ASSERT_DBG(this->isMap());
1053 static Shared create()
1055 const auto libObjPtr = bt_value_map_create();
1057 internal::validateCreatedObjPtr(libObjPtr);
1058 return CommonMapValue::Shared::createWithoutRef(libObjPtr);
1061 template <typename OtherLibObjT>
1062 CommonMapValue(const CommonMapValue<OtherLibObjT> val) noexcept : _ThisCommonValue {val}
1066 template <typename OtherLibObjT>
1067 CommonMapValue<LibObjT>& operator=(const CommonMapValue<OtherLibObjT> val) noexcept
1069 _ThisCommonValue::operator=(val);
1073 std::uint64_t size() const noexcept
1075 return bt_value_map_get_size(this->libObjPtr());
1078 bool isEmpty() const noexcept
1080 return this->size() == 0;
1083 nonstd::optional<CommonValue<LibObjT>> operator[](const char * const key) const noexcept
1085 const auto libObjPtr =
1086 internal::CommonMapValueSpec<LibObjT>::entryByKey(this->libObjPtr(), key);
1089 return nonstd::nullopt;
1092 return CommonValue<LibObjT> {libObjPtr};
1095 nonstd::optional<CommonValue<LibObjT>> operator[](const std::string& key) const noexcept
1097 return (*this)[key.data()];
1100 bool hasEntry(const char * const key) const noexcept
1102 return static_cast<bool>(bt_value_map_has_entry(this->libObjPtr(), key));
1105 bool hasEntry(const std::string& key) const noexcept
1107 return this->hasEntry(key.data());
1110 void insert(const char * const key, const Value val) const
1112 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1114 const auto status = bt_value_map_insert_entry(this->libObjPtr(), key, val.libObjPtr());
1116 this->_handleInsertLibStatus(status);
1119 void insert(const std::string& key, const Value val) const
1121 this->insert(key.data(), val);
1124 void insert(const char * const key, const bool rawVal) const
1126 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1129 bt_value_map_insert_bool_entry(this->libObjPtr(), key, static_cast<bt_bool>(rawVal));
1131 this->_handleInsertLibStatus(status);
1134 void insert(const std::string& key, const bool rawVal) const
1136 this->insert(key.data(), rawVal);
1139 void insert(const char * const key, const std::uint64_t rawVal) const
1141 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1144 bt_value_map_insert_unsigned_integer_entry(this->libObjPtr(), key, rawVal);
1146 this->_handleInsertLibStatus(status);
1149 void insert(const std::string& key, const std::uint64_t rawVal) const
1151 this->insert(key.data(), rawVal);
1154 void insert(const char * const key, const std::int64_t rawVal) const
1156 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1159 bt_value_map_insert_signed_integer_entry(this->libObjPtr(), key, rawVal);
1161 this->_handleInsertLibStatus(status);
1164 void insert(const std::string& key, const std::int64_t rawVal) const
1166 this->insert(key.data(), rawVal);
1169 void insert(const char * const key, const double rawVal) const
1171 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1173 const auto status = bt_value_map_insert_real_entry(this->libObjPtr(), key, rawVal);
1175 this->_handleInsertLibStatus(status);
1178 void insert(const std::string& key, const double rawVal) const
1180 this->insert(key.data(), rawVal);
1183 void insert(const char * const key, const char * const rawVal) const
1185 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1187 const auto status = bt_value_map_insert_string_entry(this->libObjPtr(), key, rawVal);
1189 this->_handleInsertLibStatus(status);
1192 void insert(const char * const key, const std::string& rawVal) const
1194 this->insert(key, rawVal.data());
1197 void insert(const std::string& key, const char * const rawVal) const
1199 this->insert(key.data(), rawVal);
1202 void insert(const std::string& key, const std::string& rawVal) const
1204 this->insert(key.data(), rawVal.data());
1207 CommonArrayValue<bt_value> insertEmptyArray(const char *key) const;
1208 CommonArrayValue<bt_value> insertEmptyArray(const std::string& key) const;
1209 CommonMapValue<bt_value> insertEmptyMap(const char *key) const;
1210 CommonMapValue<bt_value> insertEmptyMap(const std::string& key) const;
1212 void forEach(const internal::CommonMapValueForEachUserFunc<CommonValue<LibObjT>>& func) const
1214 internal::CommonMapValueSpec<LibObjT>::forEach(this->libObjPtr(), func);
1217 Shared shared() const noexcept
1219 return Shared::createWithRef(*this);
1223 void _handleInsertLibStatus(const bt_value_map_insert_entry_status status) const
1225 if (status == BT_VALUE_MAP_INSERT_ENTRY_STATUS_MEMORY_ERROR) {
1226 throw MemoryError {};
1231 using MapValue = CommonMapValue<bt_value>;
1232 using ConstMapValue = CommonMapValue<const bt_value>;
1234 namespace internal {
1236 struct MapValueTypeDescr
1238 using Const = ConstMapValue;
1239 using NonConst = MapValue;
1243 struct TypeDescr<MapValue> : public MapValueTypeDescr
1248 struct TypeDescr<ConstMapValue> : public MapValueTypeDescr
1252 } /* namespace internal */
1254 template <typename LibObjT>
1255 CommonNullValue<LibObjT> CommonValue<LibObjT>::asNull() const noexcept
1257 BT_ASSERT_DBG(this->isNull());
1258 return CommonNullValue<LibObjT> {this->libObjPtr()};
1261 template <typename LibObjT>
1262 CommonBoolValue<LibObjT> CommonValue<LibObjT>::asBool() const noexcept
1264 BT_ASSERT_DBG(this->isBool());
1265 return CommonBoolValue<LibObjT> {this->libObjPtr()};
1268 template <typename LibObjT>
1269 CommonSignedIntegerValue<LibObjT> CommonValue<LibObjT>::asSignedInteger() const noexcept
1271 BT_ASSERT_DBG(this->isSignedInteger());
1272 return CommonSignedIntegerValue<LibObjT> {this->libObjPtr()};
1275 template <typename LibObjT>
1276 CommonUnsignedIntegerValue<LibObjT> CommonValue<LibObjT>::asUnsignedInteger() const noexcept
1278 BT_ASSERT_DBG(this->isUnsignedInteger());
1279 return CommonUnsignedIntegerValue<LibObjT> {this->libObjPtr()};
1282 template <typename LibObjT>
1283 CommonRealValue<LibObjT> CommonValue<LibObjT>::asReal() const noexcept
1285 BT_ASSERT_DBG(this->isReal());
1286 return CommonRealValue<LibObjT> {this->libObjPtr()};
1289 template <typename LibObjT>
1290 CommonStringValue<LibObjT> CommonValue<LibObjT>::asString() const noexcept
1292 BT_ASSERT_DBG(this->isString());
1293 return CommonStringValue<LibObjT> {this->libObjPtr()};
1296 template <typename LibObjT>
1297 CommonArrayValue<LibObjT> CommonValue<LibObjT>::asArray() const noexcept
1299 BT_ASSERT_DBG(this->isArray());
1300 return CommonArrayValue<LibObjT> {this->libObjPtr()};
1303 template <typename LibObjT>
1304 CommonMapValue<LibObjT> CommonValue<LibObjT>::asMap() const noexcept
1306 BT_ASSERT_DBG(this->isMap());
1307 return CommonMapValue<LibObjT> {this->libObjPtr()};
1310 template <typename LibObjT>
1311 ArrayValue CommonArrayValue<LibObjT>::appendEmptyArray() const
1313 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1315 bt_value *libElemPtr;
1316 const auto status = bt_value_array_append_empty_array_element(this->libObjPtr(), &libElemPtr);
1318 this->_handleAppendLibStatus(status);
1319 return ArrayValue {libElemPtr};
1322 template <typename LibObjT>
1323 MapValue CommonArrayValue<LibObjT>::appendEmptyMap() const
1325 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1327 bt_value *libElemPtr;
1328 const auto status = bt_value_array_append_empty_map_element(this->libObjPtr(), &libElemPtr);
1330 this->_handleAppendLibStatus(status);
1331 return MapValue {libElemPtr};
1334 template <typename LibObjT>
1335 ArrayValue CommonMapValue<LibObjT>::insertEmptyArray(const char * const key) const
1337 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1339 bt_value *libEntryPtr;
1340 const auto status = bt_value_map_insert_empty_array_entry(this->libObjPtr(), key, &libEntryPtr);
1342 this->_handleInsertLibStatus(status);
1343 return ArrayValue {libEntryPtr};
1346 template <typename LibObjT>
1347 ArrayValue CommonMapValue<LibObjT>::insertEmptyArray(const std::string& key) const
1349 return this->insertEmptyArray(key.data());
1352 template <typename LibObjT>
1353 MapValue CommonMapValue<LibObjT>::insertEmptyMap(const char * const key) const
1355 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
1357 bt_value *libEntryPtr;
1358 const auto status = bt_value_map_insert_empty_map_entry(this->libObjPtr(), key, &libEntryPtr);
1360 this->_handleInsertLibStatus(status);
1361 return MapValue {libEntryPtr};
1364 template <typename LibObjT>
1365 MapValue CommonMapValue<LibObjT>::insertEmptyMap(const std::string& key) const
1367 return this->insertEmptyMap(key.data());
1370 inline BoolValue::Shared createValue(const bool rawVal)
1372 return BoolValue::create(rawVal);
1375 inline UnsignedIntegerValue::Shared createValue(const std::uint64_t rawVal)
1377 return UnsignedIntegerValue::create(rawVal);
1380 inline SignedIntegerValue::Shared createValue(const std::int64_t rawVal)
1382 return SignedIntegerValue::create(rawVal);
1385 inline RealValue::Shared createValue(const double rawVal)
1387 return RealValue::create(rawVal);
1390 inline StringValue::Shared createValue(const char * const rawVal)
1392 return StringValue::create(rawVal);
1395 inline StringValue::Shared createValue(const std::string& rawVal)
1397 return StringValue::create(rawVal);
1400 } /* namespace bt2 */
1402 #endif /* BABELTRACE_CPP_COMMON_BT2_VALUE_HPP */