1 # SPDX-License-Identifier: MIT
3 # Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
7 from bt2
import error
as bt2_error
8 from bt2
import utils
as bt2_utils
9 from bt2
import object as bt2_object
10 from bt2
import native_bt
13 class _IntegerRangeConst
:
14 def __init__(self
, lower
, upper
=None):
15 self
._check
_type
(lower
)
20 self
._check
_type
(upper
)
24 "range's lower bound ({}) is greater than its upper bound ({})".format(
40 def contains(self
, value
):
41 self
._check
_type
(value
)
42 return value
>= self
._lower
and value
<= self
._upper
44 def __eq__(self
, other
):
45 if not isinstance(other
, _IntegerRangeConst
):
48 return self
.lower
== other
.lower
and self
.upper
== other
.upper
51 class _IntegerRange(_IntegerRangeConst
):
52 def __init__(self
, lower
, upper
=None):
53 super().__init
__(lower
, upper
)
56 class _SignedIntegerRangeConst(_IntegerRangeConst
):
57 _is_type
= staticmethod(bt2_utils
._is
_int
64)
58 _check_type
= staticmethod(bt2_utils
._check
_int
64)
61 class SignedIntegerRange(_SignedIntegerRangeConst
, _IntegerRange
):
65 class _UnsignedIntegerRangeConst(_IntegerRangeConst
):
66 _is_type
= staticmethod(bt2_utils
._is
_uint
64)
67 _check_type
= staticmethod(bt2_utils
._check
_uint
64)
70 class UnsignedIntegerRange(_UnsignedIntegerRangeConst
, _IntegerRange
):
74 class _IntegerRangeSetConst(bt2_object
._SharedObject
, collections
.abc
.Set
):
76 range_set_ptr
= self
._as
_range
_set
_ptr
(self
._ptr
)
77 count
= native_bt
.integer_range_set_get_range_count(range_set_ptr
)
81 def __contains__(self
, other_range
):
89 for idx
in range(len(self
)):
90 rg_ptr
= self
._borrow
_range
_ptr
_by
_index
(self
._ptr
, idx
)
91 assert rg_ptr
is not None
92 lower
= self
._range
_get
_lower
(rg_ptr
)
93 upper
= self
._range
_get
_upper
(rg_ptr
)
94 yield self
._range
_pycls
(lower
, upper
)
96 def __eq__(self
, other
):
97 if not isinstance(other
, _IntegerRangeSetConst
):
100 return self
._is
_equal
(self
._ptr
, other
._ptr
)
102 def contains_value(self
, value
):
104 if rg
.contains(value
):
110 class _IntegerRangeSet(_IntegerRangeSetConst
, collections
.abc
.MutableSet
):
111 def __init__(self
, ranges
=None):
112 ptr
= self
._create
_range
_set
()
115 raise bt2_error
._MemoryError
("cannot create range set object")
117 super().__init
__(ptr
)
119 if ranges
is not None:
120 # will raise if not iterable
125 if type(rg
) is not self
._range
_pycls
:
126 if self
._range
_pycls
._is
_type
(rg
):
127 rg
= self
._range
_pycls
(rg
)
129 # assume it's a simple pair (will raise if it's not)
130 rg
= self
._range
_pycls
(rg
[0], rg
[1])
132 status
= self
._add
_range
(self
._ptr
, rg
.lower
, rg
.upper
)
133 bt2_utils
._handle
_func
_status
(status
, "cannot add range to range set object")
135 def discard(self
, rg
):
136 raise NotImplementedError
139 class _SignedIntegerRangeSetConst(_IntegerRangeSetConst
):
142 native_bt
.integer_range_set_signed_get_ref(ptr
)
146 native_bt
.integer_range_set_signed_put_ref(ptr
)
148 _as_range_set_ptr
= staticmethod(
149 native_bt
.integer_range_set_signed_as_range_set_const
151 _borrow_range_ptr_by_index
= staticmethod(
152 native_bt
.integer_range_set_signed_borrow_range_by_index_const
154 _range_get_lower
= staticmethod(native_bt
.integer_range_signed_get_lower
)
155 _range_get_upper
= staticmethod(native_bt
.integer_range_signed_get_upper
)
156 _is_equal
= staticmethod(native_bt
.integer_range_set_signed_is_equal
)
157 _range_pycls
= _SignedIntegerRangeConst
160 class SignedIntegerRangeSet(_SignedIntegerRangeSetConst
, _IntegerRangeSet
):
161 _create_range_set
= staticmethod(native_bt
.integer_range_set_signed_create
)
162 _add_range
= staticmethod(native_bt
.integer_range_set_signed_add_range
)
163 _range_pycls
= SignedIntegerRange
166 class _UnsignedIntegerRangeSetConst(_IntegerRangeSetConst
):
169 native_bt
.integer_range_set_unsigned_get_ref(ptr
)
173 native_bt
.integer_range_set_unsigned_put_ref(ptr
)
175 _as_range_set_ptr
= staticmethod(
176 native_bt
.integer_range_set_unsigned_as_range_set_const
178 _borrow_range_ptr_by_index
= staticmethod(
179 native_bt
.integer_range_set_unsigned_borrow_range_by_index_const
181 _range_get_lower
= staticmethod(native_bt
.integer_range_unsigned_get_lower
)
182 _range_get_upper
= staticmethod(native_bt
.integer_range_unsigned_get_upper
)
183 _is_equal
= staticmethod(native_bt
.integer_range_set_unsigned_is_equal
)
184 _range_pycls
= _UnsignedIntegerRangeConst
187 class UnsignedIntegerRangeSet(_UnsignedIntegerRangeSetConst
, _IntegerRangeSet
):
188 _create_range_set
= staticmethod(native_bt
.integer_range_set_unsigned_create
)
189 _add_range
= staticmethod(native_bt
.integer_range_set_unsigned_add_range
)
190 _range_pycls
= UnsignedIntegerRange