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
):
30 self
._check
_type
(lower
)
31 self
._check
_type
(upper
)
34 raise ValueError("range's lower bound ({}) is greater than its upper bound ({})".format(lower
, upper
))
47 def contains(self
, value
):
48 self
._check
_type
(value
)
49 return value
>= self
._lower
and value
<= self
._upper
51 def __eq__(self
, other
):
52 if type(other
) is not type(self
):
55 return self
.lower
== other
.lower
and self
.upper
== other
.upper
58 class SignedIntegerRange(_IntegerRange
):
59 _check_type
= staticmethod(utils
._check
_int
64)
62 class UnsignedIntegerRange(_IntegerRange
):
63 _check_type
= staticmethod(utils
._check
_uint
64)
66 class _IntegerRangeSet(object._SharedObject
, collections
.abc
.MutableSet
):
67 def __init__(self
, ranges
=None):
68 ptr
= self
._create
_range
_set
()
71 raise bt2
.CreationError('cannot create range set object')
75 if ranges
is not None:
76 # will raise if not iterable
81 range_set_ptr
= self
._as
_range
_set
_ptr
(self
._ptr
)
82 count
= native_bt
.integer_range_set_get_range_count(range_set_ptr
)
86 def __contains__(self
, other_range
):
94 for idx
in range(len(self
)):
95 rg_ptr
= self
._borrow
_range
_by
_index
_ptr
(self
._ptr
, idx
)
96 assert rg_ptr
is not None
97 lower
= self
._range
_get
_lower
(rg_ptr
)
98 upper
= self
._range
_get
_upper
(rg_ptr
)
99 yield self
._range
_type
(lower
, upper
)
101 def __eq__(self
, other
):
102 if type(other
) is not type(self
):
105 return self
._compare
(self
._ptr
, other
._ptr
)
107 def contains_value(self
, value
):
109 if rg
.contains(value
):
115 if type(rg
) is not self
._range
_type
:
116 # assume it's a simple pair (will raise if it's not)
117 rg
= self
._range
_type
(rg
[0], rg
[1])
119 status
= self
._add
_range
(self
._ptr
, rg
.lower
, rg
.upper
)
120 utils
._handle
_func
_status
(status
,
121 'cannot add range to range set object')
123 def discard(self
, rg
):
124 raise NotImplementedError
127 class SignedIntegerRangeSet(_IntegerRangeSet
):
128 _get_ref
= staticmethod(native_bt
.integer_range_set_signed_get_ref
)
129 _put_ref
= staticmethod(native_bt
.integer_range_set_signed_put_ref
)
130 _as_range_set_ptr
= staticmethod(native_bt
.integer_range_set_signed_as_range_set_const
)
131 _create_range_set
= staticmethod(native_bt
.integer_range_set_signed_create
)
132 _borrow_range_by_index_ptr
= staticmethod(native_bt
.integer_range_set_signed_borrow_range_by_index_const
)
133 _range_get_lower
= staticmethod(native_bt
.integer_range_signed_get_lower
)
134 _range_get_upper
= staticmethod(native_bt
.integer_range_signed_get_upper
)
135 _add_range
= staticmethod(native_bt
.integer_range_set_signed_add_range
)
136 _compare
= staticmethod(native_bt
.integer_range_set_signed_compare
)
137 _range_type
= SignedIntegerRange
140 class UnsignedIntegerRangeSet(_IntegerRangeSet
):
141 _get_ref
= staticmethod(native_bt
.integer_range_set_unsigned_get_ref
)
142 _put_ref
= staticmethod(native_bt
.integer_range_set_unsigned_put_ref
)
143 _as_range_set_ptr
= staticmethod(native_bt
.integer_range_set_unsigned_as_range_set_const
)
144 _create_range_set
= staticmethod(native_bt
.integer_range_set_unsigned_create
)
145 _borrow_range_by_index_ptr
= staticmethod(native_bt
.integer_range_set_unsigned_borrow_range_by_index_const
)
146 _range_get_lower
= staticmethod(native_bt
.integer_range_unsigned_get_lower
)
147 _range_get_upper
= staticmethod(native_bt
.integer_range_unsigned_get_upper
)
148 _add_range
= staticmethod(native_bt
.integer_range_set_unsigned_add_range
)
149 _compare
= staticmethod(native_bt
.integer_range_set_unsigned_compare
)
150 _range_type
= UnsignedIntegerRange