1 # The MIT License (MIT)
3 # Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
5 # Permission is hereby granted, free of charge, to any person obtaining a copy
6 # of this software and associated documentation files (the "Software"), to deal
7 # in the Software without restriction, including without limitation the rights
8 # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 # copies of the Software, and to permit persons to whom the Software is
10 # furnished to do so, subject to the following conditions:
12 # The above copyright notice and this permission notice shall be included in
13 # all copies or substantial portions of the Software.
15 # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
23 from bt2
import native_bt
, object, utils
24 import collections
.abc
28 class _IntegerRangeConst
:
29 def __init__(self
, lower
, upper
=None):
30 self
._check
_type
(lower
)
35 self
._check
_type
(upper
)
39 "range's lower bound ({}) is greater than its upper bound ({})".format(
55 def contains(self
, value
):
56 self
._check
_type
(value
)
57 return value
>= self
._lower
and value
<= self
._upper
59 def __eq__(self
, other
):
60 if not isinstance(other
, _IntegerRangeConst
):
63 return self
.lower
== other
.lower
and self
.upper
== other
.upper
66 class _IntegerRange(_IntegerRangeConst
):
67 def __init__(self
, lower
, upper
=None):
68 super().__init
__(lower
, upper
)
71 class _SignedIntegerRangeConst(_IntegerRangeConst
):
72 _is_type
= staticmethod(utils
._is
_int
64)
73 _check_type
= staticmethod(utils
._check
_int
64)
76 class SignedIntegerRange(_SignedIntegerRangeConst
, _IntegerRange
):
80 class _UnsignedIntegerRangeConst(_IntegerRangeConst
):
81 _is_type
= staticmethod(utils
._is
_uint
64)
82 _check_type
= staticmethod(utils
._check
_uint
64)
85 class UnsignedIntegerRange(_UnsignedIntegerRangeConst
, _IntegerRange
):
89 class _IntegerRangeSetConst(object._SharedObject
, collections
.abc
.Set
):
91 range_set_ptr
= self
._as
_range
_set
_ptr
(self
._ptr
)
92 count
= native_bt
.integer_range_set_get_range_count(range_set_ptr
)
96 def __contains__(self
, other_range
):
104 for idx
in range(len(self
)):
105 rg_ptr
= self
._borrow
_range
_ptr
_by
_index
(self
._ptr
, idx
)
106 assert rg_ptr
is not None
107 lower
= self
._range
_get
_lower
(rg_ptr
)
108 upper
= self
._range
_get
_upper
(rg_ptr
)
109 yield self
._range
_pycls
(lower
, upper
)
111 def __eq__(self
, other
):
113 if not isinstance(other
, _IntegerRangeSetConst
):
116 return self
._is
_equal
(self
._ptr
, other
._ptr
)
118 def contains_value(self
, value
):
120 if rg
.contains(value
):
126 class _IntegerRangeSet(_IntegerRangeSetConst
, collections
.abc
.MutableSet
):
127 def __init__(self
, ranges
=None):
128 ptr
= self
._create
_range
_set
()
131 raise bt2
._MemoryError('cannot create range set object')
133 super().__init
__(ptr
)
135 if ranges
is not None:
136 # will raise if not iterable
141 if type(rg
) is not self
._range
_pycls
:
142 if self
._range
_pycls
._is
_type
(rg
):
143 rg
= self
._range
_pycls
(rg
)
145 # assume it's a simple pair (will raise if it's not)
146 rg
= self
._range
_pycls
(rg
[0], rg
[1])
148 status
= self
._add
_range
(self
._ptr
, rg
.lower
, rg
.upper
)
149 utils
._handle
_func
_status
(status
, 'cannot add range to range set object')
151 def discard(self
, rg
):
152 raise NotImplementedError
155 class _SignedIntegerRangeSetConst(_IntegerRangeSetConst
):
156 _get_ref
= staticmethod(native_bt
.integer_range_set_signed_get_ref
)
157 _put_ref
= staticmethod(native_bt
.integer_range_set_signed_put_ref
)
158 _as_range_set_ptr
= staticmethod(
159 native_bt
.integer_range_set_signed_as_range_set_const
161 _borrow_range_ptr_by_index
= staticmethod(
162 native_bt
.integer_range_set_signed_borrow_range_by_index_const
164 _range_get_lower
= staticmethod(native_bt
.integer_range_signed_get_lower
)
165 _range_get_upper
= staticmethod(native_bt
.integer_range_signed_get_upper
)
166 _is_equal
= staticmethod(native_bt
.integer_range_set_signed_is_equal
)
167 _range_pycls
= _SignedIntegerRangeConst
170 class SignedIntegerRangeSet(_SignedIntegerRangeSetConst
, _IntegerRangeSet
):
171 _create_range_set
= staticmethod(native_bt
.integer_range_set_signed_create
)
172 _add_range
= staticmethod(native_bt
.integer_range_set_signed_add_range
)
173 _range_pycls
= SignedIntegerRange
176 class _UnsignedIntegerRangeSetConst(_IntegerRangeSetConst
):
177 _get_ref
= staticmethod(native_bt
.integer_range_set_unsigned_get_ref
)
178 _put_ref
= staticmethod(native_bt
.integer_range_set_unsigned_put_ref
)
179 _as_range_set_ptr
= staticmethod(
180 native_bt
.integer_range_set_unsigned_as_range_set_const
182 _borrow_range_ptr_by_index
= staticmethod(
183 native_bt
.integer_range_set_unsigned_borrow_range_by_index_const
185 _range_get_lower
= staticmethod(native_bt
.integer_range_unsigned_get_lower
)
186 _range_get_upper
= staticmethod(native_bt
.integer_range_unsigned_get_upper
)
187 _is_equal
= staticmethod(native_bt
.integer_range_set_unsigned_is_equal
)
188 _range_pycls
= _UnsignedIntegerRangeConst
191 class UnsignedIntegerRangeSet(_UnsignedIntegerRangeSetConst
, _IntegerRangeSet
):
192 _create_range_set
= staticmethod(native_bt
.integer_range_set_unsigned_create
)
193 _add_range
= staticmethod(native_bt
.integer_range_set_unsigned_add_range
)
194 _range_pycls
= UnsignedIntegerRange