bool-hybrid-array 9.10.12__tar.gz → 9.10.13__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bool-hybrid-array
3
- Version: 9.10.12
3
+ Version: 9.10.13
4
4
  Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
5
5
  Home-page: https://github.com/BKsell/bool-hybrid-array
6
6
  Author: 蔡靖杰
@@ -557,6 +557,7 @@ except OverflowError as e:
557
557
  * **9.10.10**:新增int_array模块
558
558
  * **9.10.11**:修复NameError: name 'int_array' is not defined. Did you mean: 'bytearray'?的错误
559
559
  * **9.10.12**:把find方法的返回值改为IntHybridArray
560
+ * **9.10.13**:给IntHybridArray新增多种列表操作
560
561
 
561
562
 
562
563
 
@@ -518,6 +518,7 @@ except OverflowError as e:
518
518
  * **9.10.10**:新增int_array模块
519
519
  * **9.10.11**:修复NameError: name 'int_array' is not defined. Did you mean: 'bytearray'?的错误
520
520
  * **9.10.12**:把find方法的返回值改为IntHybridArray
521
+ * **9.10.13**:给IntHybridArray新增多种列表操作
521
522
 
522
523
 
523
524
 
@@ -3,7 +3,7 @@ from types import ModuleType
3
3
  from . import core
4
4
  from .core import __builtins__,builtins
5
5
  from . import int_array
6
- __version__ = "9.10.12"
6
+ __version__ = "9.10.13"
7
7
  public_objects = []
8
8
  for name in dir(core):
9
9
  if not name.startswith("_"):
@@ -8,7 +8,8 @@ class IntBitTag(BHA_Bool, metaclass=ResurrectMeta):
8
8
  __repr__ = __str__
9
9
 
10
10
  class IntHybridArray(BoolHybridArray):
11
- def __init__(self, int_array: list[int], bit_length: int = 8):
11
+ def __init__(self, int_array: list[int], bit_length: int = 8, Type = int):
12
+ self.Type = Type
12
13
  self.bit_length = bit_length
13
14
  bool_data = []
14
15
  max_required_bits = 1
@@ -92,9 +93,10 @@ class IntHybridArray(BoolHybridArray):
92
93
  if block_end > self.size:
93
94
  raise IndexError("索引超出范围")
94
95
  bit_chunk = [super().__getitem__(j) for j in range(block_start, block_end)]
95
- return self.to_int(bit_chunk)
96
+ return self.Type(self.to_int(bit_chunk))
96
97
 
97
98
  def __setitem__(self, key, value):
99
+
98
100
  value = int(value)
99
101
  if isinstance(key, slice):
100
102
  start, stop, step = key.indices(len(self))
@@ -146,17 +148,94 @@ class IntHybridArray(BoolHybridArray):
146
148
  bool_data = [sign_bit] + num_bits
147
149
  for bit_idx in range(self.bit_length):
148
150
  super().__setitem__(block_start + bit_idx, bool_data[bit_idx])
149
-
151
+ def insert(self, index, value):
152
+ value = int(value)
153
+ index = index if index >= 0 else index + len(self)
154
+ if not (0 <= index <= len(self)):
155
+ raise IndexError("插入索引超出范围")
156
+ if value == 0:
157
+ required_bits = 1
158
+ else:
159
+ required_bits = 1 + abs(value).bit_length()
160
+ need_resize = required_bits > self.bit_length
161
+ old_data = list(self) if need_resize else None
162
+ if need_resize:
163
+ self.bit_length = required_bits
164
+ self.total_bits = 0
165
+ super().__init__(0, 0, False, IntBitTag, False)
166
+ for num in old_data[:index]:
167
+ self._add_single_num(num)
168
+ self._add_single_num(value)
169
+ for num in old_data[index:]:
170
+ self._add_single_num(num)
171
+ else:
172
+ insert_bit_start = index * self.bit_length
173
+ if value >= 0:
174
+ sign_bit = False
175
+ num_bits = [bool((num >> i) & 1) for i in range(self.bit_length - 1)]
176
+ else:
177
+ sign_bit = True
178
+ abs_num = abs(value)
179
+ num_bits = [not bool((abs_num >> i) & 1) for i in range(self.bit_length - 1)]
180
+ carry = 1
181
+ for j in range(len(num_bits)):
182
+ if carry:
183
+ num_bits[j] = not num_bits[j]
184
+ carry = 0 if num_bits[j] else 1
185
+ bool_data = [sign_bit] + num_bits
186
+ for i in range(self.bit_length):
187
+ super().insert(insert_bit_start + i, bool_data[i])
188
+ self.total_bits += self.bit_length
189
+ def append(self,v):
190
+ v = int(v)
191
+ req_bits = 1 + abs(v).bit_length() if v != 0 else 1
192
+ if req_bits > self.bit_length:
193
+ old_data = list(self)
194
+ self.bit_length = req_bits
195
+ self.clear()
196
+ self.extend(old_data)
197
+ self.total_bits += self.bit_length
198
+ self[-1] = v
150
199
  def __iter__(self):
151
- for i in range(0, self.total_bits, self.bit_length):
152
- if i + self.bit_length > self.size:
153
- break
154
- bit_chunk = [super().__getitem__(j) for j in range(i, i + self.bit_length)]
155
- yield self.to_int(bit_chunk)
156
-
200
+ return BHA_Iterator(map(self.__getitem__,range(len(self))))
201
+ def clear(self):
202
+ self.total_bits = 0
203
+ super().__init__(0, 0, False, IntBitTag, False)
204
+ self.bit_length = 8
157
205
  def __str__(self):
158
206
  return f"IntHybridArray([{', '.join(map(str, self))}])"
159
207
  __repr__ = __str__
160
-
208
+ def __delitem__(self, index: int = -1):
209
+ index = index if index >= 0 else index + len(self)
210
+ if not (0 <= index < len(self)):
211
+ raise IndexError("删除索引超出范围")
212
+ target_num = self[index]
213
+ pop_bit_start = index * self.bit_length
214
+ pop_bit_end = pop_bit_start + self.bit_length
215
+ for _ in range(self.bit_length):
216
+ super().__delitem__(pop_bit_start)
217
+ self.total_bits -= self.bit_length
161
218
  def __len__(self):
162
- return self.total_bits // self.bit_length
219
+ return self.total_bits // self.bit_length
220
+ def index(self, value):
221
+ value = int(value)
222
+ x = f"{value} 不在 IntHybridArray 中"
223
+ for idx in range(len(self)+2>>2):
224
+ if self[idx] == value:
225
+ return idx
226
+ elif self[-idx] == value:
227
+ x = len(self)-idx
228
+ if x != f"{value} 不在 IntHybridArray 中":
229
+ return x
230
+ raise ValueError(x)
231
+ def rindex(self, value):
232
+ value = int(value)
233
+ x = f"{value} 不在 IntHybridArray 中"
234
+ for idx in range(len(self)+2>>2):
235
+ if self[-idx] == value:
236
+ return -idx
237
+ elif self[idx] == value:
238
+ x = -(len(self)-idx)
239
+ if x != f"{value} 不在 IntHybridArray 中":
240
+ return x
241
+ raise ValueError(x)
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bool-hybrid-array
3
- Version: 9.10.12
3
+ Version: 9.10.13
4
4
  Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
5
5
  Home-page: https://github.com/BKsell/bool-hybrid-array
6
6
  Author: 蔡靖杰
@@ -557,6 +557,7 @@ except OverflowError as e:
557
557
  * **9.10.10**:新增int_array模块
558
558
  * **9.10.11**:修复NameError: name 'int_array' is not defined. Did you mean: 'bytearray'?的错误
559
559
  * **9.10.12**:把find方法的返回值改为IntHybridArray
560
+ * **9.10.13**:给IntHybridArray新增多种列表操作
560
561
 
561
562
 
562
563
 
@@ -8,7 +8,7 @@ def get_long_description():
8
8
  return "一个高效的布尔数组(密集+稀疏混合存储,节省内存)"
9
9
  setup(
10
10
  name="bool-hybrid-array",
11
- version="9.10.12",
11
+ version="9.10.13",
12
12
  author="蔡靖杰",
13
13
  extras_require={"int_array":[]},
14
14
  author_email="1289270215@qq.com",