bool-hybrid-array 9.10.14__py3-none-any.whl → 9.10.15__py3-none-any.whl

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.
@@ -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.14"
6
+ __version__ = "9.10.15"
7
7
  public_objects = []
8
8
  for name in dir(core):
9
9
  if not name.startswith("_"):
@@ -17,7 +17,7 @@ globals().update({
17
17
  })
18
18
  try:
19
19
  __dict__ = ProtectedBuiltinsDict(globals())
20
- sys.modules[name+".int_array"] = ProtectedBuiltinsDict(int_array.__dict__)
20
+ sys.modules[__name__+'.int_array'] = ProtectedBuiltinsDict(int_array.__dict__)
21
21
  sys.modules[__name__] = ProtectedBuiltinsDict(globals().copy())
22
22
  sys.modules[__name__].name = 'bool_hybrid_array'
23
23
  core.__dict__ = ProtectedBuiltinsDict(core.__dict__)
@@ -8,21 +8,20 @@ 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, Type = int):
12
- self.Type = Type
11
+ def __init__(self, int_array: list[int], bit_length: int = 8):
13
12
  self.bit_length = bit_length
14
13
  bool_data = []
15
14
  max_required_bits = 1
16
15
  for num in int_array:
17
16
  if num == 0:
18
- required_bits = 2
17
+ required_bits = 1
19
18
  else:
20
19
  abs_num = abs(num)
21
20
  num_bits_needed = abs_num.bit_length()
22
21
  required_bits = 1 + num_bits_needed
23
22
  if required_bits > max_required_bits:
24
23
  max_required_bits = required_bits
25
- self.bit_length = max(max_required_bits, 2)
24
+ self.bit_length = max_required_bits
26
25
  for num in int_array:
27
26
  if num >= 0:
28
27
  sign_bit = False
@@ -41,10 +40,15 @@ class IntHybridArray(BoolHybridArray):
41
40
  self.total_bits = len(bool_data)
42
41
  super().__init__(0, self.total_bits, False, IntBitTag, False)
43
42
  for idx in range(self.total_bits):
44
- super().__setitem__(idx, bool_data[idx])
43
+ if idx < self.size:
44
+ super().__setitem__(idx, bool_data[idx])
45
+ else:
46
+ super().append(bool_data[idx])
45
47
  for i in range(0, self.total_bits, self.bit_length):
46
- bit_tag = super().__getitem__(i)
47
- bit_tag.is_sign_bit = True
48
+ if i < self.size:
49
+ bit_tag = super().__getitem__(i)
50
+ bit_tag.is_sign_bit = True
51
+
48
52
  def to_int(self, bit_chunk):
49
53
  sign_bit = bit_chunk[0].value
50
54
  num_bits = [bit.value for bit in bit_chunk[1:]]
@@ -66,6 +70,7 @@ class IntHybridArray(BoolHybridArray):
66
70
  num += (1 << j)
67
71
  num = -num
68
72
  return num
73
+
69
74
  def __getitem__(self, key):
70
75
  if isinstance(key, slice):
71
76
  start, stop, step = key.indices(len(self))
@@ -87,7 +92,8 @@ class IntHybridArray(BoolHybridArray):
87
92
  if block_end > self.size:
88
93
  raise IndexError("索引超出范围")
89
94
  bit_chunk = [super().__getitem__(j) for j in range(block_start, block_end)]
90
- return self.Type(self.to_int(bit_chunk))
95
+ return self.to_int(bit_chunk)
96
+
91
97
  def __setitem__(self, key, value):
92
98
  value = int(value)
93
99
  if isinstance(key, slice):
@@ -140,63 +146,20 @@ class IntHybridArray(BoolHybridArray):
140
146
  bool_data = [sign_bit] + num_bits
141
147
  for bit_idx in range(self.bit_length):
142
148
  super().__setitem__(block_start + bit_idx, bool_data[bit_idx])
143
- def insert(self, index, value):
144
- value = int(value)
145
- index = index if index >= 0 else index + len(self)
146
- if not (0 <= index <= len(self)):
147
- raise IndexError("插入索引超出范围")
148
- if value == 0:
149
- required_bits = 1
150
- else:
151
- required_bits = 1 + abs(value).bit_length()
152
- need_resize = required_bits > self.bit_length
153
- old_data = list(self) if need_resize else None
154
- if need_resize:
155
- self.bit_length = required_bits
156
- self.total_bits = 0
157
- super().__init__(0, 0, False, IntBitTag, False)
158
- for num in old_data[:index]:
159
- self._add_single_num(num)
160
- self._add_single_num(value)
161
- for num in old_data[index:]:
162
- self._add_single_num(num)
163
- else:
164
- insert_bit_start = index * self.bit_length
165
- if value >= 0:
166
- sign_bit = False
167
- num_bits = [bool((num >> i) & 1) for i in range(self.bit_length - 1)]
168
- else:
169
- sign_bit = True
170
- abs_num = abs(value)
171
- num_bits = [not bool((abs_num >> i) & 1) for i in range(self.bit_length - 1)]
172
- carry = 1
173
- for j in range(len(num_bits)):
174
- if carry:
175
- num_bits[j] = not num_bits[j]
176
- carry = 0 if num_bits[j] else 1
177
- bool_data = [sign_bit] + num_bits
178
- for i in range(self.bit_length):
179
- super().insert(insert_bit_start + i, bool_data[i])
180
- self.total_bits += self.bit_length
181
- def append(self,v):
182
- v = int(v)
183
- req_bits = 1 + abs(v).bit_length() if v != 0 else 1
184
- if req_bits > self.bit_length:
185
- old_data = list(self)
186
- self.bit_length = req_bits
187
- self.clear()
188
- self.extend(old_data)
189
- self.total_bits += self.bit_length
190
- self[-1] = v
149
+
191
150
  def __iter__(self):
192
- return BHA_Iterator(map(self.__getitem__,range(len(self))))
193
- def clear(self):
194
- self.total_bits = 0
195
- super().__init__(0, 0, False, IntBitTag, False)
196
- self.bit_length = 8
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
+
197
157
  def __str__(self):
198
158
  return f"IntHybridArray([{', '.join(map(str, self))}])"
199
159
  __repr__ = __str__
160
+
161
+ def __len__(self):
162
+ return self.total_bits // self.bit_length
200
163
  def __delitem__(self, index: int = -1):
201
164
  index = index if index >= 0 else index + len(self)
202
165
  if not (0 <= index < len(self)):
@@ -207,8 +170,6 @@ class IntHybridArray(BoolHybridArray):
207
170
  for _ in range(self.bit_length):
208
171
  super().__delitem__(pop_bit_start)
209
172
  self.total_bits -= self.bit_length
210
- def __len__(self):
211
- return self.total_bits // self.bit_length
212
173
  def index(self, value):
213
174
  value = int(value)
214
175
  x = f"{value} 不在 IntHybridArray 中"
@@ -239,4 +200,4 @@ class IntHybridArray(BoolHybridArray):
239
200
  len_ = len(iterable)
240
201
  self.total_bits += len_*self.bit_length
241
202
  for i,j in zip(range(len_),iterable):
242
- self[-i-1] = j
203
+ self[-i-1] = j
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bool-hybrid-array
3
- Version: 9.10.14
3
+ Version: 9.10.15
4
4
  Summary: 一个高效的布尔数组(密集+稀疏混合存储,节省内存)
5
5
  Home-page: https://github.com/BKsell/bool-hybrid-array
6
6
  Author: 蔡靖杰
@@ -559,6 +559,7 @@ except OverflowError as e:
559
559
  * **9.10.12**:把find方法的返回值改为IntHybridArray
560
560
  * **9.10.13**:给IntHybridArray新增多种列表操作
561
561
  * **9.10.14**:修复IntHybridArray中因单个 0 导致所有数字位长被压缩到 1的问题
562
+ * **9.10.15**:修复IntHybridArray变成布尔数组的错误
562
563
 
563
564
 
564
565
 
@@ -0,0 +1,10 @@
1
+ bool_hybrid_array/__init__.py,sha256=m4L8YfX1-psmzeZZz1ksRmkj5wk7JbBcHYgiVnuAkYY,876
2
+ bool_hybrid_array/__main__.py,sha256=3MsUAXMj6Pe1EzP7YreuUePbXZeQvFSCnejnTeS42kU,8324
3
+ bool_hybrid_array/core.py,sha256=zp4jam5xC_CZvVVkmfT6fPAhBzf4-wspDnYuz0z49Ys,36578
4
+ bool_hybrid_array/秘密.md,sha256=Ii2NvXmv-Ktu04zJsGLcQZvlzT4gOatByE4B2wTK1Ks,48
5
+ bool_hybrid_array/int_array/__init__.py,sha256=EnjBonyL35YKDTtQ2g6tnrf4tTKEt5k-EAEbqLRuptI,8548
6
+ bool_hybrid_array-9.10.15.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
7
+ bool_hybrid_array-9.10.15.dist-info/METADATA,sha256=mS-KbHgJZm0VG_6P8nj4Ae3vlfuOeCk8YTQSao_bblE,22788
8
+ bool_hybrid_array-9.10.15.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
9
+ bool_hybrid_array-9.10.15.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
10
+ bool_hybrid_array-9.10.15.dist-info/RECORD,,
@@ -1,10 +0,0 @@
1
- bool_hybrid_array/__init__.py,sha256=yvJ9gw9SQf3Q3EaRPL4D1JaBTgkg73VlPwkZvM0g_zM,872
2
- bool_hybrid_array/__main__.py,sha256=3MsUAXMj6Pe1EzP7YreuUePbXZeQvFSCnejnTeS42kU,8324
3
- bool_hybrid_array/core.py,sha256=zp4jam5xC_CZvVVkmfT6fPAhBzf4-wspDnYuz0z49Ys,36578
4
- bool_hybrid_array/秘密.md,sha256=Ii2NvXmv-Ktu04zJsGLcQZvlzT4gOatByE4B2wTK1Ks,48
5
- bool_hybrid_array/int_array/__init__.py,sha256=_sDSu7-DXEObnElKBYGWnb0OrIBeaQ1tzgwl_d1fkwY,10412
6
- bool_hybrid_array-9.10.14.dist-info/licenses/LICENSE,sha256=Sg4rnGXkBDYkwJCWyxdWp5H60rhVAxpNvFh_l3JWZdY,1070
7
- bool_hybrid_array-9.10.14.dist-info/METADATA,sha256=28LDpkvNmNI91OcpIQ9T5I_c8DKQH53OP9Z27gNuB_w,22723
8
- bool_hybrid_array-9.10.14.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
9
- bool_hybrid_array-9.10.14.dist-info/top_level.txt,sha256=vk-TD77wuVQsN1rJ6uVWZX4sC_wya_WplRDwQKJoBZM,18
10
- bool_hybrid_array-9.10.14.dist-info/RECORD,,