bt2: _IntegerRangeSet.add(): make it possible to add a single value
[babeltrace.git] / src / bindings / python / bt2 / bt2 / integer_range_set.py
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
23 from bt2 import native_bt, object, utils
24 import collections.abc
25 import bt2
26
27
28 class _IntegerRange:
29 def __init__(self, lower, upper=None):
30 self._check_type(lower)
31
32 if upper is None:
33 upper = lower
34
35 self._check_type(upper)
36
37 if lower > upper:
38 raise ValueError(
39 "range's lower bound ({}) is greater than its upper bound ({})".format(
40 lower, upper
41 )
42 )
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):
60 if type(other) is not type(self):
61 return False
62
63 return self.lower == other.lower and self.upper == other.upper
64
65
66 class SignedIntegerRange(_IntegerRange):
67 _is_type = staticmethod(utils._is_int64)
68 _check_type = staticmethod(utils._check_int64)
69
70
71 class UnsignedIntegerRange(_IntegerRange):
72 _is_type = staticmethod(utils._is_uint64)
73 _check_type = staticmethod(utils._check_uint64)
74
75
76 class _IntegerRangeSet(object._SharedObject, collections.abc.MutableSet):
77 def __init__(self, ranges=None):
78 ptr = self._create_range_set()
79
80 if ptr is None:
81 raise bt2._MemoryError('cannot create range set object')
82
83 super().__init__(ptr)
84
85 if ranges is not None:
86 # will raise if not iterable
87 for rg in ranges:
88 self.add(rg)
89
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)):
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)
110
111 def __eq__(self, other):
112 if type(other) is not type(self):
113 return False
114
115 return self._compare(self._ptr, other._ptr)
116
117 def contains_value(self, value):
118 for rg in self:
119 if rg.contains(value):
120 return True
121
122 return False
123
124 def add(self, rg):
125 if type(rg) is not self._range_type:
126 if self._range_type._is_type(rg):
127 rg = self._range_type(rg)
128 else:
129 # assume it's a simple pair (will raise if it's not)
130 rg = self._range_type(rg[0], rg[1])
131
132 status = self._add_range(self._ptr, rg.lower, rg.upper)
133 utils._handle_func_status(status, 'cannot add range to range set object')
134
135 def discard(self, rg):
136 raise NotImplementedError
137
138
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
144 )
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
148 )
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
154
155
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
161 )
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
165 )
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
This page took 0.033701 seconds and 5 git commands to generate.