1 # SPDX-License-Identifier: MIT
3 # Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
5 from bt2
import native_bt
6 from bt2
import object as bt2_object
7 from bt2
import utils
as bt2_utils
12 class _IntegerRangeConst
:
13 def __init__(self
, lower
, upper
=None):
14 self
._check
_type
(lower
)
19 self
._check
_type
(upper
)
23 "range's lower bound ({}) is greater than its upper bound ({})".format(
39 def contains(self
, value
):
40 self
._check
_type
(value
)
41 return value
>= self
._lower
and value
<= self
._upper
43 def __eq__(self
, other
):
44 if not isinstance(other
, _IntegerRangeConst
):
47 return self
.lower
== other
.lower
and self
.upper
== other
.upper
50 class _IntegerRange(_IntegerRangeConst
):
51 def __init__(self
, lower
, upper
=None):
52 super().__init
__(lower
, upper
)
55 class _SignedIntegerRangeConst(_IntegerRangeConst
):
56 _is_type
= staticmethod(bt2_utils
._is
_int
64)
57 _check_type
= staticmethod(bt2_utils
._check
_int
64)
60 class SignedIntegerRange(_SignedIntegerRangeConst
, _IntegerRange
):
64 class _UnsignedIntegerRangeConst(_IntegerRangeConst
):
65 _is_type
= staticmethod(bt2_utils
._is
_uint
64)
66 _check_type
= staticmethod(bt2_utils
._check
_uint
64)
69 class UnsignedIntegerRange(_UnsignedIntegerRangeConst
, _IntegerRange
):
73 class _IntegerRangeSetConst(bt2_object
._SharedObject
, collections
.abc
.Set
):
75 range_set_ptr
= self
._as
_range
_set
_ptr
(self
._ptr
)
76 count
= native_bt
.integer_range_set_get_range_count(range_set_ptr
)
80 def __contains__(self
, other_range
):
88 for idx
in range(len(self
)):
89 rg_ptr
= self
._borrow
_range
_ptr
_by
_index
(self
._ptr
, idx
)
90 assert rg_ptr
is not None
91 lower
= self
._range
_get
_lower
(rg_ptr
)
92 upper
= self
._range
_get
_upper
(rg_ptr
)
93 yield self
._range
_pycls
(lower
, upper
)
95 def __eq__(self
, other
):
96 if not isinstance(other
, _IntegerRangeSetConst
):
99 return self
._is
_equal
(self
._ptr
, other
._ptr
)
101 def contains_value(self
, value
):
103 if rg
.contains(value
):
109 class _IntegerRangeSet(_IntegerRangeSetConst
, collections
.abc
.MutableSet
):
110 def __init__(self
, ranges
=None):
111 ptr
= self
._create
_range
_set
()
114 raise bt2
._MemoryError("cannot create range set object")
116 super().__init
__(ptr
)
118 if ranges
is not None:
119 # will raise if not iterable
124 if type(rg
) is not self
._range
_pycls
:
125 if self
._range
_pycls
._is
_type
(rg
):
126 rg
= self
._range
_pycls
(rg
)
128 # assume it's a simple pair (will raise if it's not)
129 rg
= self
._range
_pycls
(rg
[0], rg
[1])
131 status
= self
._add
_range
(self
._ptr
, rg
.lower
, rg
.upper
)
132 bt2_utils
._handle
_func
_status
(status
, "cannot add range to range set object")
134 def discard(self
, rg
):
135 raise NotImplementedError
138 class _SignedIntegerRangeSetConst(_IntegerRangeSetConst
):
141 native_bt
.integer_range_set_signed_get_ref(ptr
)
145 native_bt
.integer_range_set_signed_put_ref(ptr
)
147 _as_range_set_ptr
= staticmethod(
148 native_bt
.integer_range_set_signed_as_range_set_const
150 _borrow_range_ptr_by_index
= staticmethod(
151 native_bt
.integer_range_set_signed_borrow_range_by_index_const
153 _range_get_lower
= staticmethod(native_bt
.integer_range_signed_get_lower
)
154 _range_get_upper
= staticmethod(native_bt
.integer_range_signed_get_upper
)
155 _is_equal
= staticmethod(native_bt
.integer_range_set_signed_is_equal
)
156 _range_pycls
= _SignedIntegerRangeConst
159 class SignedIntegerRangeSet(_SignedIntegerRangeSetConst
, _IntegerRangeSet
):
160 _create_range_set
= staticmethod(native_bt
.integer_range_set_signed_create
)
161 _add_range
= staticmethod(native_bt
.integer_range_set_signed_add_range
)
162 _range_pycls
= SignedIntegerRange
165 class _UnsignedIntegerRangeSetConst(_IntegerRangeSetConst
):
168 native_bt
.integer_range_set_unsigned_get_ref(ptr
)
172 native_bt
.integer_range_set_unsigned_put_ref(ptr
)
174 _as_range_set_ptr
= staticmethod(
175 native_bt
.integer_range_set_unsigned_as_range_set_const
177 _borrow_range_ptr_by_index
= staticmethod(
178 native_bt
.integer_range_set_unsigned_borrow_range_by_index_const
180 _range_get_lower
= staticmethod(native_bt
.integer_range_unsigned_get_lower
)
181 _range_get_upper
= staticmethod(native_bt
.integer_range_unsigned_get_upper
)
182 _is_equal
= staticmethod(native_bt
.integer_range_set_unsigned_is_equal
)
183 _range_pycls
= _UnsignedIntegerRangeConst
186 class UnsignedIntegerRangeSet(_UnsignedIntegerRangeSetConst
, _IntegerRangeSet
):
187 _create_range_set
= staticmethod(native_bt
.integer_range_set_unsigned_create
)
188 _add_range
= staticmethod(native_bt
.integer_range_set_unsigned_add_range
)
189 _range_pycls
= UnsignedIntegerRange