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>
13 #include <babeltrace2/babeltrace.h>
15 #include "common-iter.hpp"
17 #include "integer-range.hpp"
18 #include "internal/borrowed-obj.hpp"
19 #include "internal/utils.hpp"
25 template <typename LibObjT>
26 struct IntegerRangeSetRefFuncs;
29 struct IntegerRangeSetRefFuncs<const bt_integer_range_set_unsigned> final
31 static void get(const bt_integer_range_set_unsigned * const libObjPtr)
33 bt_integer_range_set_unsigned_get_ref(libObjPtr);
36 static void put(const bt_integer_range_set_unsigned * const libObjPtr)
38 bt_integer_range_set_unsigned_put_ref(libObjPtr);
43 struct IntegerRangeSetRefFuncs<const bt_integer_range_set_signed> final
45 static void get(const bt_integer_range_set_signed * const libObjPtr)
47 bt_integer_range_set_signed_get_ref(libObjPtr);
50 static void put(const bt_integer_range_set_signed * const libObjPtr)
52 bt_integer_range_set_signed_put_ref(libObjPtr);
56 template <typename LibObjT>
57 struct CommonIntegerRangeSetSpec;
59 /* Functions specific to unsigned integer range sets */
61 struct CommonIntegerRangeSetSpec<const bt_integer_range_set_unsigned> final
63 static std::uint64_t size(const bt_integer_range_set_unsigned * const libRangePtr) noexcept
65 return bt_integer_range_set_get_range_count(
66 bt_integer_range_set_unsigned_as_range_set_const(libRangePtr));
69 static const bt_integer_range_unsigned *
70 rangeByIndex(const bt_integer_range_set_unsigned * const libRangePtr,
71 const std::uint64_t index) noexcept
73 return bt_integer_range_set_unsigned_borrow_range_by_index_const(libRangePtr, index);
76 static bool isEqual(const bt_integer_range_set_unsigned * const libRangePtrA,
77 const bt_integer_range_set_unsigned * const libRangePtrB) noexcept
79 return static_cast<bool>(
80 bt_integer_range_set_unsigned_is_equal(libRangePtrA, libRangePtrB));
83 static bt_integer_range_set_add_range_status
84 addRange(bt_integer_range_set_unsigned * const libRangePtr, const std::uint64_t lower,
85 const std::uint64_t upper) noexcept
87 return bt_integer_range_set_unsigned_add_range(libRangePtr, lower, upper);
90 static bt_integer_range_set_unsigned *create() noexcept
92 return bt_integer_range_set_unsigned_create();
96 /* Functions specific to signed integer range sets */
98 struct CommonIntegerRangeSetSpec<const bt_integer_range_set_signed> final
100 static std::uint64_t size(const bt_integer_range_set_signed * const libRangePtr) noexcept
102 return bt_integer_range_set_get_range_count(
103 bt_integer_range_set_signed_as_range_set_const(libRangePtr));
106 static const bt_integer_range_signed *
107 rangeByIndex(const bt_integer_range_set_signed * const libRangePtr,
108 const std::uint64_t index) noexcept
110 return bt_integer_range_set_signed_borrow_range_by_index_const(libRangePtr, index);
113 static bool isEqual(const bt_integer_range_set_signed * const libRangePtrA,
114 const bt_integer_range_set_signed * const libRangePtrB) noexcept
116 return static_cast<bool>(bt_integer_range_set_signed_is_equal(libRangePtrA, libRangePtrB));
119 static bt_integer_range_set_add_range_status
120 addRange(bt_integer_range_set_signed * const libRangePtr, const std::int64_t lower,
121 const std::int64_t upper) noexcept
123 return bt_integer_range_set_signed_add_range(libRangePtr, lower, upper);
126 static bt_integer_range_set_signed *create() noexcept
128 return bt_integer_range_set_signed_create();
132 } /* namespace internal */
134 template <typename LibObjT>
135 class ConstVariantWithIntegerSelectorFieldClassOption;
137 template <typename LibObjT, typename RangeSetT>
138 class CommonVariantWithIntegerSelectorFieldClass;
140 template <typename LibObjT>
141 class CommonTraceClass;
143 template <typename LibObjT>
144 class CommonIntegerRangeSet final : public internal::BorrowedObj<LibObjT>
146 /* Allow operator==() to call `other.libObjPtr()` */
147 friend class CommonIntegerRangeSet<bt_integer_range_set_unsigned>;
148 friend class CommonIntegerRangeSet<const bt_integer_range_set_unsigned>;
149 friend class CommonIntegerRangeSet<bt_integer_range_set_signed>;
150 friend class CommonIntegerRangeSet<const bt_integer_range_set_signed>;
152 /* Allow appendOption() to call `ranges.libObjPtr()` */
153 friend class CommonVariantWithIntegerSelectorFieldClass<
155 ConstVariantWithIntegerSelectorFieldClassOption<
156 const bt_field_class_variant_with_selector_field_integer_unsigned_option>>;
158 friend class CommonVariantWithIntegerSelectorFieldClass<
160 ConstVariantWithIntegerSelectorFieldClassOption<
161 const bt_field_class_variant_with_selector_field_integer_signed_option>>;
163 /* Allow create*FieldClass() to call `ranges.libObjPtr()` */
164 friend class CommonTraceClass<bt_trace_class>;
167 using typename internal::BorrowedObj<LibObjT>::_ThisBorrowedObj;
168 using typename internal::BorrowedObj<LibObjT>::_LibObjPtr;
169 using _ConstLibObjT = typename std::add_const<LibObjT>::type;
170 using _RefFuncs = internal::IntegerRangeSetRefFuncs<_ConstLibObjT>;
171 using _Spec = internal::CommonIntegerRangeSetSpec<_ConstLibObjT>;
172 using _ThisCommonIntegerRangeSet = CommonIntegerRangeSet<LibObjT>;
175 using Shared = internal::SharedObj<_ThisCommonIntegerRangeSet, LibObjT, _RefFuncs>;
177 using Range = typename std::conditional<
178 std::is_same<_ConstLibObjT, const bt_integer_range_set_unsigned>::value,
179 ConstUnsignedIntegerRange, ConstSignedIntegerRange>::type;
181 using Value = typename Range::Value;
182 using Iterator = CommonIterator<CommonIntegerRangeSet, Range>;
184 explicit CommonIntegerRangeSet(const _LibObjPtr libObjPtr) noexcept :
185 _ThisBorrowedObj {libObjPtr}
189 static Shared create()
191 const auto libObjPtr = _Spec::create();
193 internal::validateCreatedObjPtr(libObjPtr);
194 return CommonIntegerRangeSet::Shared::createWithoutRef(libObjPtr);
197 template <typename OtherLibObjT>
198 CommonIntegerRangeSet(const CommonIntegerRangeSet<OtherLibObjT> rangeSet) noexcept :
199 _ThisBorrowedObj {rangeSet}
203 template <typename OtherLibObjT>
204 _ThisCommonIntegerRangeSet&
205 operator=(const CommonIntegerRangeSet<OtherLibObjT> rangeSet) noexcept
207 _ThisBorrowedObj::operator=(rangeSet);
211 template <typename OtherLibObjT>
212 bool operator==(const CommonIntegerRangeSet<OtherLibObjT> other) const noexcept
214 return _Spec::isEqual(this->libObjPtr(), other.libObjPtr());
217 template <typename OtherLibObjT>
218 bool operator!=(const CommonIntegerRangeSet<OtherLibObjT> other) const noexcept
220 return !(*this == other);
223 void addRange(const Value lower, const Value upper)
225 static_assert(!std::is_const<LibObjT>::value, "`LibObjT` must NOT be `const`.");
227 const auto status = _Spec::addRange(this->libObjPtr(), lower, upper);
229 if (status == BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_MEMORY_ERROR) {
230 throw MemoryError {};
234 std::uint64_t size() const noexcept
236 return _Spec::size(this->libObjPtr());
239 Range operator[](const std::uint64_t index) const noexcept
241 return Range {_Spec::rangeByIndex(this->libObjPtr(), index)};
244 Iterator begin() const noexcept
246 return Iterator {*this, 0};
249 Iterator end() const noexcept
251 return Iterator {*this, this->size()};
254 Shared shared() const noexcept
256 return Shared::createWithRef(*this);
260 using UnsignedIntegerRangeSet = CommonIntegerRangeSet<bt_integer_range_set_unsigned>;
261 using ConstUnsignedIntegerRangeSet = CommonIntegerRangeSet<const bt_integer_range_set_unsigned>;
262 using SignedIntegerRangeSet = CommonIntegerRangeSet<bt_integer_range_set_signed>;
263 using ConstSignedIntegerRangeSet = CommonIntegerRangeSet<const bt_integer_range_set_signed>;
267 struct UnsignedIntegerRangeSetTypeDescr
269 using Const = ConstUnsignedIntegerRangeSet;
270 using NonConst = UnsignedIntegerRangeSet;
274 struct TypeDescr<UnsignedIntegerRangeSet> : public UnsignedIntegerRangeSetTypeDescr
279 struct TypeDescr<ConstUnsignedIntegerRangeSet> : public UnsignedIntegerRangeSetTypeDescr
283 struct SignedIntegerRangeSetTypeDescr
285 using Const = ConstSignedIntegerRangeSet;
286 using NonConst = SignedIntegerRangeSet;
290 struct TypeDescr<SignedIntegerRangeSet> : public SignedIntegerRangeSetTypeDescr
295 struct TypeDescr<ConstSignedIntegerRangeSet> : public SignedIntegerRangeSetTypeDescr
299 } /* namespace internal */
300 } /* namespace bt2 */
302 #endif /* BABELTRACE_CPP_COMMON_BT2_INTEGER_RANGE_SET_HPP */