Apply black code formatter on all Python code
[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):
30 self._check_type(lower)
31 self._check_type(upper)
32
33 if lower > upper:
34 raise ValueError(
35 "range's lower bound ({}) is greater than its upper bound ({})".format(
36 lower, upper
37 )
38 )
39
40 self._lower = lower
41 self._upper = upper
42
43 @property
44 def lower(self):
45 return self._lower
46
47 @property
48 def upper(self):
49 return self._upper
50
51 def contains(self, value):
52 self._check_type(value)
53 return value >= self._lower and value <= self._upper
54
55 def __eq__(self, other):
56 if type(other) is not type(self):
57 return False
58
59 return self.lower == other.lower and self.upper == other.upper
60
61
62 class SignedIntegerRange(_IntegerRange):
63 _check_type = staticmethod(utils._check_int64)
64
65
66 class UnsignedIntegerRange(_IntegerRange):
67 _check_type = staticmethod(utils._check_uint64)
68
69
70 class _IntegerRangeSet(object._SharedObject, collections.abc.MutableSet):
71 def __init__(self, ranges=None):
72 ptr = self._create_range_set()
73
74 if ptr is None:
75 raise bt2.CreationError('cannot create range set object')
76
77 super().__init__(ptr)
78
79 if ranges is not None:
80 # will raise if not iterable
81 for rg in ranges:
82 self.add(rg)
83
84 def __len__(self):
85 range_set_ptr = self._as_range_set_ptr(self._ptr)
86 count = native_bt.integer_range_set_get_range_count(range_set_ptr)
87 assert count >= 0
88 return count
89
90 def __contains__(self, other_range):
91 for rg in self:
92 if rg == other_range:
93 return True
94
95 return False
96
97 def __iter__(self):
98 for idx in range(len(self)):
99 rg_ptr = self._borrow_range_by_index_ptr(self._ptr, idx)
100 assert rg_ptr is not None
101 lower = self._range_get_lower(rg_ptr)
102 upper = self._range_get_upper(rg_ptr)
103 yield self._range_type(lower, upper)
104
105 def __eq__(self, other):
106 if type(other) is not type(self):
107 return False
108
109 return self._compare(self._ptr, other._ptr)
110
111 def contains_value(self, value):
112 for rg in self:
113 if rg.contains(value):
114 return True
115
116 return False
117
118 def add(self, rg):
119 if type(rg) is not self._range_type:
120 # assume it's a simple pair (will raise if it's not)
121 rg = self._range_type(rg[0], rg[1])
122
123 status = self._add_range(self._ptr, rg.lower, rg.upper)
124 utils._handle_func_status(status, 'cannot add range to range set object')
125
126 def discard(self, rg):
127 raise NotImplementedError
128
129
130 class SignedIntegerRangeSet(_IntegerRangeSet):
131 _get_ref = staticmethod(native_bt.integer_range_set_signed_get_ref)
132 _put_ref = staticmethod(native_bt.integer_range_set_signed_put_ref)
133 _as_range_set_ptr = staticmethod(
134 native_bt.integer_range_set_signed_as_range_set_const
135 )
136 _create_range_set = staticmethod(native_bt.integer_range_set_signed_create)
137 _borrow_range_by_index_ptr = staticmethod(
138 native_bt.integer_range_set_signed_borrow_range_by_index_const
139 )
140 _range_get_lower = staticmethod(native_bt.integer_range_signed_get_lower)
141 _range_get_upper = staticmethod(native_bt.integer_range_signed_get_upper)
142 _add_range = staticmethod(native_bt.integer_range_set_signed_add_range)
143 _compare = staticmethod(native_bt.integer_range_set_signed_compare)
144 _range_type = SignedIntegerRange
145
146
147 class UnsignedIntegerRangeSet(_IntegerRangeSet):
148 _get_ref = staticmethod(native_bt.integer_range_set_unsigned_get_ref)
149 _put_ref = staticmethod(native_bt.integer_range_set_unsigned_put_ref)
150 _as_range_set_ptr = staticmethod(
151 native_bt.integer_range_set_unsigned_as_range_set_const
152 )
153 _create_range_set = staticmethod(native_bt.integer_range_set_unsigned_create)
154 _borrow_range_by_index_ptr = staticmethod(
155 native_bt.integer_range_set_unsigned_borrow_range_by_index_const
156 )
157 _range_get_lower = staticmethod(native_bt.integer_range_unsigned_get_lower)
158 _range_get_upper = staticmethod(native_bt.integer_range_unsigned_get_upper)
159 _add_range = staticmethod(native_bt.integer_range_set_unsigned_add_range)
160 _compare = staticmethod(native_bt.integer_range_set_unsigned_compare)
161 _range_type = UnsignedIntegerRange
This page took 0.032718 seconds and 4 git commands to generate.