1 # SPDX-License-Identifier: MIT
3 # Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
5 from bt2
import native_bt
, object, utils
10 class _IntegerRangeConst
:
11 def __init__(self
, lower
, upper
=None):
12 self
._check
_type
(lower
)
17 self
._check
_type
(upper
)
21 "range's lower bound ({}) is greater than its upper bound ({})".format(
37 def contains(self
, value
):
38 self
._check
_type
(value
)
39 return value
>= self
._lower
and value
<= self
._upper
41 def __eq__(self
, other
):
42 if not isinstance(other
, _IntegerRangeConst
):
45 return self
.lower
== other
.lower
and self
.upper
== other
.upper
48 class _IntegerRange(_IntegerRangeConst
):
49 def __init__(self
, lower
, upper
=None):
50 super().__init
__(lower
, upper
)
53 class _SignedIntegerRangeConst(_IntegerRangeConst
):
54 _is_type
= staticmethod(utils
._is
_int
64)
55 _check_type
= staticmethod(utils
._check
_int
64)
58 class SignedIntegerRange(_SignedIntegerRangeConst
, _IntegerRange
):
62 class _UnsignedIntegerRangeConst(_IntegerRangeConst
):
63 _is_type
= staticmethod(utils
._is
_uint
64)
64 _check_type
= staticmethod(utils
._check
_uint
64)
67 class UnsignedIntegerRange(_UnsignedIntegerRangeConst
, _IntegerRange
):
71 class _IntegerRangeSetConst(object._SharedObject
, collections
.abc
.Set
):
73 range_set_ptr
= self
._as
_range
_set
_ptr
(self
._ptr
)
74 count
= native_bt
.integer_range_set_get_range_count(range_set_ptr
)
78 def __contains__(self
, other_range
):
86 for idx
in range(len(self
)):
87 rg_ptr
= self
._borrow
_range
_ptr
_by
_index
(self
._ptr
, idx
)
88 assert rg_ptr
is not None
89 lower
= self
._range
_get
_lower
(rg_ptr
)
90 upper
= self
._range
_get
_upper
(rg_ptr
)
91 yield self
._range
_pycls
(lower
, upper
)
93 def __eq__(self
, other
):
95 if not isinstance(other
, _IntegerRangeSetConst
):
98 return self
._is
_equal
(self
._ptr
, other
._ptr
)
100 def contains_value(self
, value
):
102 if rg
.contains(value
):
108 class _IntegerRangeSet(_IntegerRangeSetConst
, collections
.abc
.MutableSet
):
109 def __init__(self
, ranges
=None):
110 ptr
= self
._create
_range
_set
()
113 raise bt2
._MemoryError("cannot create range set object")
115 super().__init
__(ptr
)
117 if ranges
is not None:
118 # will raise if not iterable
123 if type(rg
) is not self
._range
_pycls
:
124 if self
._range
_pycls
._is
_type
(rg
):
125 rg
= self
._range
_pycls
(rg
)
127 # assume it's a simple pair (will raise if it's not)
128 rg
= self
._range
_pycls
(rg
[0], rg
[1])
130 status
= self
._add
_range
(self
._ptr
, rg
.lower
, rg
.upper
)
131 utils
._handle
_func
_status
(status
, "cannot add range to range set object")
133 def discard(self
, rg
):
134 raise NotImplementedError
137 class _SignedIntegerRangeSetConst(_IntegerRangeSetConst
):
140 native_bt
.integer_range_set_signed_get_ref(ptr
)
144 native_bt
.integer_range_set_signed_put_ref(ptr
)
146 _as_range_set_ptr
= staticmethod(
147 native_bt
.integer_range_set_signed_as_range_set_const
149 _borrow_range_ptr_by_index
= staticmethod(
150 native_bt
.integer_range_set_signed_borrow_range_by_index_const
152 _range_get_lower
= staticmethod(native_bt
.integer_range_signed_get_lower
)
153 _range_get_upper
= staticmethod(native_bt
.integer_range_signed_get_upper
)
154 _is_equal
= staticmethod(native_bt
.integer_range_set_signed_is_equal
)
155 _range_pycls
= _SignedIntegerRangeConst
158 class SignedIntegerRangeSet(_SignedIntegerRangeSetConst
, _IntegerRangeSet
):
159 _create_range_set
= staticmethod(native_bt
.integer_range_set_signed_create
)
160 _add_range
= staticmethod(native_bt
.integer_range_set_signed_add_range
)
161 _range_pycls
= SignedIntegerRange
164 class _UnsignedIntegerRangeSetConst(_IntegerRangeSetConst
):
167 native_bt
.integer_range_set_unsigned_get_ref(ptr
)
171 native_bt
.integer_range_set_unsigned_put_ref(ptr
)
173 _as_range_set_ptr
= staticmethod(
174 native_bt
.integer_range_set_unsigned_as_range_set_const
176 _borrow_range_ptr_by_index
= staticmethod(
177 native_bt
.integer_range_set_unsigned_borrow_range_by_index_const
179 _range_get_lower
= staticmethod(native_bt
.integer_range_unsigned_get_lower
)
180 _range_get_upper
= staticmethod(native_bt
.integer_range_unsigned_get_upper
)
181 _is_equal
= staticmethod(native_bt
.integer_range_set_unsigned_is_equal
)
182 _range_pycls
= _UnsignedIntegerRangeConst
185 class UnsignedIntegerRangeSet(_UnsignedIntegerRangeSetConst
, _IntegerRangeSet
):
186 _create_range_set
= staticmethod(native_bt
.integer_range_set_unsigned_create
)
187 _add_range
= staticmethod(native_bt
.integer_range_set_unsigned_add_range
)
188 _range_pycls
= UnsignedIntegerRange