lib: rename `bt_*_compare()` to `bt_*_is_equal()`
[babeltrace.git] / src / bindings / python / bt2 / bt2 / integer_range_set.py
CommitLineData
025c8fb8
PP
1# The MIT License (MIT)
2#
3# Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
4#
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:
11#
12# The above copyright notice and this permission notice shall be included in
13# all copies or substantial portions of the Software.
14#
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
21# THE SOFTWARE.
22
23from bt2 import native_bt, object, utils
24import collections.abc
25import bt2
26
27
8d99efe6 28class _IntegerRangeConst:
44d78428 29 def __init__(self, lower, upper=None):
025c8fb8 30 self._check_type(lower)
44d78428
PP
31
32 if upper is None:
33 upper = lower
34
025c8fb8
PP
35 self._check_type(upper)
36
37 if lower > upper:
61d96b89
FD
38 raise ValueError(
39 "range's lower bound ({}) is greater than its upper bound ({})".format(
40 lower, upper
41 )
42 )
025c8fb8
PP
43
44 self._lower = lower
45 self._upper = upper
46
47 @property
48 def lower(self):
49 return self._lower
50
51 @property
52 def upper(self):
53 return self._upper
54
55 def contains(self, value):
56 self._check_type(value)
57 return value >= self._lower and value <= self._upper
58
59 def __eq__(self, other):
8d99efe6 60 if not isinstance(other, _IntegerRangeConst):
025c8fb8
PP
61 return False
62
63 return self.lower == other.lower and self.upper == other.upper
64
65
8d99efe6
FD
66class _IntegerRange(_IntegerRangeConst):
67 def __init__(self, lower, upper=None):
68 super().__init__(lower, upper)
69
70
71class _SignedIntegerRangeConst(_IntegerRangeConst):
44d78428 72 _is_type = staticmethod(utils._is_int64)
025c8fb8
PP
73 _check_type = staticmethod(utils._check_int64)
74
75
8d99efe6
FD
76class SignedIntegerRange(_SignedIntegerRangeConst, _IntegerRange):
77 pass
025c8fb8
PP
78
79
8d99efe6
FD
80class _UnsignedIntegerRangeConst(_IntegerRangeConst):
81 _is_type = staticmethod(utils._is_uint64)
82 _check_type = staticmethod(utils._check_uint64)
025c8fb8 83
025c8fb8 84
8d99efe6
FD
85class UnsignedIntegerRange(_UnsignedIntegerRangeConst, _IntegerRange):
86 pass
025c8fb8 87
025c8fb8 88
8d99efe6 89class _IntegerRangeSetConst(object._SharedObject, collections.abc.Set):
025c8fb8
PP
90 def __len__(self):
91 range_set_ptr = self._as_range_set_ptr(self._ptr)
92 count = native_bt.integer_range_set_get_range_count(range_set_ptr)
93 assert count >= 0
94 return count
95
96 def __contains__(self, other_range):
97 for rg in self:
98 if rg == other_range:
99 return True
100
101 return False
102
103 def __iter__(self):
104 for idx in range(len(self)):
8d99efe6 105 rg_ptr = self._borrow_range_ptr_by_index(self._ptr, idx)
025c8fb8
PP
106 assert rg_ptr is not None
107 lower = self._range_get_lower(rg_ptr)
108 upper = self._range_get_upper(rg_ptr)
8d99efe6 109 yield self._range_pycls(lower, upper)
025c8fb8
PP
110
111 def __eq__(self, other):
8d99efe6
FD
112
113 if not isinstance(other, _IntegerRangeSetConst):
025c8fb8
PP
114 return False
115
e1c423f9 116 return self._is_equal(self._ptr, other._ptr)
025c8fb8
PP
117
118 def contains_value(self, value):
119 for rg in self:
120 if rg.contains(value):
121 return True
122
123 return False
124
8d99efe6
FD
125
126class _IntegerRangeSet(_IntegerRangeSetConst, collections.abc.MutableSet):
127 def __init__(self, ranges=None):
128 ptr = self._create_range_set()
129
130 if ptr is None:
131 raise bt2._MemoryError('cannot create range set object')
132
133 super().__init__(ptr)
134
135 if ranges is not None:
136 # will raise if not iterable
137 for rg in ranges:
138 self.add(rg)
139
025c8fb8 140 def add(self, rg):
8d99efe6
FD
141 if type(rg) is not self._range_pycls:
142 if self._range_pycls._is_type(rg):
143 rg = self._range_pycls(rg)
44d78428
PP
144 else:
145 # assume it's a simple pair (will raise if it's not)
8d99efe6 146 rg = self._range_pycls(rg[0], rg[1])
025c8fb8
PP
147
148 status = self._add_range(self._ptr, rg.lower, rg.upper)
61d96b89 149 utils._handle_func_status(status, 'cannot add range to range set object')
025c8fb8
PP
150
151 def discard(self, rg):
152 raise NotImplementedError
153
154
8d99efe6 155class _SignedIntegerRangeSetConst(_IntegerRangeSetConst):
025c8fb8
PP
156 _get_ref = staticmethod(native_bt.integer_range_set_signed_get_ref)
157 _put_ref = staticmethod(native_bt.integer_range_set_signed_put_ref)
61d96b89
FD
158 _as_range_set_ptr = staticmethod(
159 native_bt.integer_range_set_signed_as_range_set_const
160 )
8d99efe6 161 _borrow_range_ptr_by_index = staticmethod(
61d96b89
FD
162 native_bt.integer_range_set_signed_borrow_range_by_index_const
163 )
025c8fb8
PP
164 _range_get_lower = staticmethod(native_bt.integer_range_signed_get_lower)
165 _range_get_upper = staticmethod(native_bt.integer_range_signed_get_upper)
e1c423f9 166 _is_equal = staticmethod(native_bt.integer_range_set_signed_is_equal)
8d99efe6 167 _range_pycls = _SignedIntegerRangeConst
025c8fb8
PP
168
169
8d99efe6
FD
170class 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
174
175
176class _UnsignedIntegerRangeSetConst(_IntegerRangeSetConst):
025c8fb8
PP
177 _get_ref = staticmethod(native_bt.integer_range_set_unsigned_get_ref)
178 _put_ref = staticmethod(native_bt.integer_range_set_unsigned_put_ref)
61d96b89
FD
179 _as_range_set_ptr = staticmethod(
180 native_bt.integer_range_set_unsigned_as_range_set_const
181 )
8d99efe6 182 _borrow_range_ptr_by_index = staticmethod(
61d96b89
FD
183 native_bt.integer_range_set_unsigned_borrow_range_by_index_const
184 )
025c8fb8
PP
185 _range_get_lower = staticmethod(native_bt.integer_range_unsigned_get_lower)
186 _range_get_upper = staticmethod(native_bt.integer_range_unsigned_get_upper)
e1c423f9 187 _is_equal = staticmethod(native_bt.integer_range_set_unsigned_is_equal)
8d99efe6
FD
188 _range_pycls = _UnsignedIntegerRangeConst
189
190
191class 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
This page took 0.037052 seconds and 4 git commands to generate.