2 * Copyright (c) 2020 Philippe Proulx <pproulx@efficios.com>
4 * SPDX-License-Identifier: MIT
7 #ifndef BABELTRACE_CPP_COMMON_BT2_INTEGER_RANGE_SET_HPP
8 #define BABELTRACE_CPP_COMMON_BT2_INTEGER_RANGE_SET_HPP
11 #include <type_traits>
12 #include <babeltrace2/babeltrace.h>
14 #include "common-iter.hpp"
15 #include "internal/borrowed-obj.hpp"
16 #include "internal/utils.hpp"
17 #include "integer-range.hpp"
18 #include "lib-error.hpp"
24 template <typename LibObjT>
25 struct IntegerRangeSetRefFuncs;
28 struct IntegerRangeSetRefFuncs<const bt_integer_range_set_unsigned> final
30 static void get(const bt_integer_range_set_unsigned * const libObjPtr)
32 bt_integer_range_set_unsigned_get_ref(libObjPtr);
35 static void put(const bt_integer_range_set_unsigned * const libObjPtr)
37 bt_integer_range_set_unsigned_get_ref(libObjPtr);
42 struct IntegerRangeSetRefFuncs<const bt_integer_range_set_signed> final
44 static void get(const bt_integer_range_set_signed * const libObjPtr)
46 bt_integer_range_set_signed_get_ref(libObjPtr);
49 static void put(const bt_integer_range_set_signed * const libObjPtr)
51 bt_integer_range_set_signed_get_ref(libObjPtr);
55 template <typename LibObjT>
56 struct CommonIntegerRangeSetSpec;
58 /* Functions specific to unsigned integer range sets */
60 struct CommonIntegerRangeSetSpec<const bt_integer_range_set_unsigned> final
62 static std::uint64_t size(const bt_integer_range_set_unsigned * const libRangePtr) noexcept
64 return bt_integer_range_set_get_range_count(
65 bt_integer_range_set_unsigned_as_range_set_const(libRangePtr));
68 static const bt_integer_range_unsigned *
69 rangeByIndex(const bt_integer_range_set_unsigned * const libRangePtr,
70 const std::uint64_t index) noexcept
72 return bt_integer_range_set_unsigned_borrow_range_by_index_const(libRangePtr, index);
75 static bool isEqual(const bt_integer_range_set_unsigned * const libRangePtrA,
76 const bt_integer_range_set_unsigned * const libRangePtrB) noexcept
78 return static_cast<bool>(
79 bt_integer_range_set_unsigned_is_equal(libRangePtrA, libRangePtrB));
82 static bt_integer_range_set_add_range_status
83 addRange(bt_integer_range_set_unsigned * const libRangePtr, const std::uint64_t lower,
84 const std::uint64_t upper) noexcept
86 return bt_integer_range_set_unsigned_add_range(libRangePtr, lower, upper);
89 static bt_integer_range_set_unsigned *create() noexcept
91 return bt_integer_range_set_unsigned_create();
95 /* Functions specific to signed integer range sets */
97 struct CommonIntegerRangeSetSpec<const bt_integer_range_set_signed> final
99 static std::uint64_t size(const bt_integer_range_set_signed * const libRangePtr) noexcept
101 return bt_integer_range_set_get_range_count(
102 bt_integer_range_set_signed_as_range_set_const(libRangePtr));
105 static const bt_integer_range_signed *
106 rangeByIndex(const bt_integer_range_set_signed * const libRangePtr,
107 const std::uint64_t index) noexcept
109 return bt_integer_range_set_signed_borrow_range_by_index_const(libRangePtr, index);
112 static bool isEqual(const bt_integer_range_set_signed * const libRangePtrA,
113 const bt_integer_range_set_signed * const libRangePtrB) noexcept
115 return static_cast<bool>(bt_integer_range_set_signed_is_equal(libRangePtrA, libRangePtrB));
118 static bt_integer_range_set_add_range_status
119 addRange(bt_integer_range_set_signed * const libRangePtr, const std::int64_t lower,
120 const std::int64_t upper) noexcept
122 return bt_integer_range_set_signed_add_range(libRangePtr, lower, upper);
125 static bt_integer_range_set_signed *create() noexcept
127 return bt_integer_range_set_signed_create();
131 } /* namespace internal */
133 template <typename LibObjT>
134 class ConstVariantWithIntegerSelectorFieldClassOption;
136 template <typename LibObjT, typename RangeSetT>
137 class CommonVariantWithIntegerSelectorFieldClass;
139 template <typename LibObjT>
140 class CommonTraceClass;
142 template <typename LibObjT>
143 class CommonIntegerRangeSet final : public internal::BorrowedObj<LibObjT>
145 /* Allow operator==() to call `other.libObjPtr()` */
146 friend class CommonIntegerRangeSet<bt_integer_range_set_unsigned>;
147 friend class CommonIntegerRangeSet<const bt_integer_range_set_unsigned>;
148 friend class CommonIntegerRangeSet<bt_integer_range_set_signed>;
149 friend class CommonIntegerRangeSet<const bt_integer_range_set_signed>;
151 /* Allow appendOption() to call `ranges.libObjPtr()` */
152 friend class CommonVariantWithIntegerSelectorFieldClass<
154 ConstVariantWithIntegerSelectorFieldClassOption<
155 const bt_field_class_variant_with_selector_field_integer_unsigned_option>>;
157 friend class CommonVariantWithIntegerSelectorFieldClass<
159 ConstVariantWithIntegerSelectorFieldClassOption<
160 const bt_field_class_variant_with_selector_field_integer_signed_option>>;
162 /* Allow create*FieldClass() to call `ranges.libObjPtr()` */
163 friend class CommonTraceClass<bt_trace_class>;
166 using typename internal::BorrowedObj<LibObjT>::_ThisBorrowedObj;
167 using typename internal::BorrowedObj<LibObjT>::_LibObjPtr;
168 using _ConstLibObjT = typename std::add_const<LibObjT>::type;
169 using _RefFuncs = internal::IntegerRangeSetRefFuncs<_ConstLibObjT>;
170 using _Spec = internal::CommonIntegerRangeSetSpec<_ConstLibObjT>;
171 using _ThisCommonIntegerRangeSet = CommonIntegerRangeSet<LibObjT>;
174 using Shared = internal::SharedObj<_ThisCommonIntegerRangeSet, LibObjT, _RefFuncs>;
176 using Range = typename std::conditional<
177 std::is_same<_ConstLibObjT, const bt_integer_range_set_unsigned>::value,
178 ConstUnsignedIntegerRange, ConstSignedIntegerRange>::type;
180 using Value = typename Range::Value;
181 using Iterator = CommonIterator<CommonIntegerRangeSet, Range>;
183 explicit CommonIntegerRangeSet(const _LibObjPtr libObjPtr) noexcept :
184 _ThisBorrowedObj {libObjPtr}
188 static Shared create()
190 const auto libObjPtr = _Spec::create();
192 internal::validateCreatedObjPtr(libObjPtr);
193 return CommonIntegerRangeSet::Shared::createWithoutRef(libObjPtr);
196 template <typename OtherLibObjT>
197 CommonIntegerRangeSet(const CommonIntegerRangeSet<OtherLibObjT>& rangeSet) noexcept :
198 _ThisBorrowedObj {rangeSet}
202 template <typename OtherLibObjT>
203 _ThisCommonIntegerRangeSet&
204 operator=(const CommonIntegerRangeSet<OtherLibObjT>& rangeSet) noexcept
206 _ThisBorrowedObj::operator=(rangeSet);
210 template <typename OtherLibObjT>
211 bool operator==(const CommonIntegerRangeSet<OtherLibObjT>& other) const noexcept
213 return _Spec::isEqual(this->libObjPtr(), other.libObjPtr());
216 template <typename OtherLibObjT>
217 bool operator!=(const CommonIntegerRangeSet<OtherLibObjT>& other) const noexcept
219 return !(*this == other);
222 void addRange(const Value lower, const Value upper)
224 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
226 const auto status = _Spec::addRange(this->libObjPtr(), lower, upper);
228 if (status == BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_MEMORY_ERROR) {
229 throw LibMemoryError {};
233 std::uint64_t size() const noexcept
235 return _Spec::size(this->libObjPtr());
238 Range operator[](const std::uint64_t index) const noexcept
240 return Range {_Spec::rangeByIndex(this->libObjPtr(), index)};
243 Iterator begin() const noexcept
245 return Iterator {*this, 0};
248 Iterator end() const noexcept
250 return Iterator {*this, this->size()};
253 Shared shared() const noexcept
255 return Shared::createWithRef(*this);
259 using UnsignedIntegerRangeSet = CommonIntegerRangeSet<bt_integer_range_set_unsigned>;
260 using ConstUnsignedIntegerRangeSet = CommonIntegerRangeSet<const bt_integer_range_set_unsigned>;
261 using SignedIntegerRangeSet = CommonIntegerRangeSet<bt_integer_range_set_signed>;
262 using ConstSignedIntegerRangeSet = CommonIntegerRangeSet<const bt_integer_range_set_signed>;
266 struct UnsignedIntegerRangeSetTypeDescr
268 using Const = ConstUnsignedIntegerRangeSet;
269 using NonConst = UnsignedIntegerRangeSet;
273 struct TypeDescr<UnsignedIntegerRangeSet> : public UnsignedIntegerRangeSetTypeDescr
278 struct TypeDescr<ConstUnsignedIntegerRangeSet> : public UnsignedIntegerRangeSetTypeDescr
282 struct SignedIntegerRangeSetTypeDescr
284 using Const = ConstSignedIntegerRangeSet;
285 using NonConst = SignedIntegerRangeSet;
289 struct TypeDescr<SignedIntegerRangeSet> : public SignedIntegerRangeSetTypeDescr
294 struct TypeDescr<ConstSignedIntegerRangeSet> : public SignedIntegerRangeSetTypeDescr
298 } /* namespace internal */
299 } /* namespace bt2 */
301 #endif /* BABELTRACE_CPP_COMMON_BT2_INTEGER_RANGE_SET_HPP */