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
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 type(other
) is not type(self
):
63 return self
.lower
== other
.lower
and self
.upper
== other
.upper
66 class SignedIntegerRange(_IntegerRange
):
67 _is_type
= staticmethod(utils
._is
_int
64)
68 _check_type
= staticmethod(utils
._check
_int
64)
71 class UnsignedIntegerRange(_IntegerRange
):
72 _is_type
= staticmethod(utils
._is
_uint
64)
73 _check_type
= staticmethod(utils
._check
_uint
64)
76 class _IntegerRangeSet(object._SharedObject
, collections
.abc
.MutableSet
):
77 def __init__(self
, ranges
=None):
78 ptr
= self
._create
_range
_set
()
81 raise bt2
._MemoryError('cannot create range set object')
85 if ranges
is not None:
86 # will raise if not iterable
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
_by
_index
_ptr
(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
_type
(lower
, upper
)
111 def __eq__(self
, other
):
112 if type(other
) is not type(self
):
115 return self
._compare
(self
._ptr
, other
._ptr
)
117 def contains_value(self
, value
):
119 if rg
.contains(value
):
125 if type(rg
) is not self
._range
_type
:
126 if self
._range
_type
._is
_type
(rg
):
127 rg
= self
._range
_type
(rg
)
129 # assume it's a simple pair (will raise if it's not)
130 rg
= self
._range
_type
(rg
[0], rg
[1])
132 status
= self
._add
_range
(self
._ptr
, rg
.lower
, rg
.upper
)
133 utils
._handle
_func
_status
(status
, 'cannot add range to range set object')
135 def discard(self
, rg
):
136 raise NotImplementedError
139 class SignedIntegerRangeSet(_IntegerRangeSet
):
140 _get_ref
= staticmethod(native_bt
.integer_range_set_signed_get_ref
)
141 _put_ref
= staticmethod(native_bt
.integer_range_set_signed_put_ref
)
142 _as_range_set_ptr
= staticmethod(
143 native_bt
.integer_range_set_signed_as_range_set_const
145 _create_range_set
= staticmethod(native_bt
.integer_range_set_signed_create
)
146 _borrow_range_by_index_ptr
= staticmethod(
147 native_bt
.integer_range_set_signed_borrow_range_by_index_const
149 _range_get_lower
= staticmethod(native_bt
.integer_range_signed_get_lower
)
150 _range_get_upper
= staticmethod(native_bt
.integer_range_signed_get_upper
)
151 _add_range
= staticmethod(native_bt
.integer_range_set_signed_add_range
)
152 _compare
= staticmethod(native_bt
.integer_range_set_signed_compare
)
153 _range_type
= SignedIntegerRange
156 class UnsignedIntegerRangeSet(_IntegerRangeSet
):
157 _get_ref
= staticmethod(native_bt
.integer_range_set_unsigned_get_ref
)
158 _put_ref
= staticmethod(native_bt
.integer_range_set_unsigned_put_ref
)
159 _as_range_set_ptr
= staticmethod(
160 native_bt
.integer_range_set_unsigned_as_range_set_const
162 _create_range_set
= staticmethod(native_bt
.integer_range_set_unsigned_create
)
163 _borrow_range_by_index_ptr
= staticmethod(
164 native_bt
.integer_range_set_unsigned_borrow_range_by_index_const
166 _range_get_lower
= staticmethod(native_bt
.integer_range_unsigned_get_lower
)
167 _range_get_upper
= staticmethod(native_bt
.integer_range_unsigned_get_upper
)
168 _add_range
= staticmethod(native_bt
.integer_range_set_unsigned_add_range
)
169 _compare
= staticmethod(native_bt
.integer_range_set_unsigned_compare
)
170 _range_type
= UnsignedIntegerRange