6
6
# ##################################################################################
7
7
8
8
import numpy as np
9
- from libc.stdlib cimport malloc, realloc, free
9
+ from cpython.mem cimport PyMem_Malloc, PyMem_Realloc, PyMem_Free
10
10
from libc.stdlib cimport qsort
11
11
from . myTypes import INDEX
12
12
@@ -25,6 +25,9 @@ cdef class indexSet:
25
25
def inSet_py (self , INDEX_t i ):
26
26
return self .inSet(i)
27
27
28
+ cdef INDEX_t position(self , INDEX_t i):
29
+ raise NotImplementedError ()
30
+
28
31
cpdef void fromSet(self , set s):
29
32
raise NotImplementedError ()
30
33
@@ -176,6 +179,27 @@ cdef class arrayIndexSet(indexSet):
176
179
high = mid
177
180
return True
178
181
182
+ cdef INDEX_t position(self , INDEX_t i):
183
+ cdef:
184
+ INDEX_t low = 0
185
+ INDEX_t high = self .indexArray.shape[0 ]
186
+ INDEX_t mid
187
+ if high- low < 20 :
188
+ for mid in range (low, high):
189
+ if self .indexArray[mid] == i:
190
+ return mid
191
+ return - 1
192
+ else :
193
+ while self .indexArray[low] != i:
194
+ if high- low <= 1 :
195
+ return - 1
196
+ mid = (low+ high) >> 1
197
+ if self .indexArray[mid] <= i:
198
+ low = mid
199
+ else :
200
+ high = mid
201
+ return low
202
+
179
203
cpdef void fromSet(self , set s):
180
204
cdef:
181
205
INDEX_t i, k
@@ -385,6 +409,14 @@ cdef class unsortedArrayIndexSet(arrayIndexSet):
385
409
return True
386
410
return False
387
411
412
+ cdef INDEX_t position(self , INDEX_t i):
413
+ cdef:
414
+ INDEX_t j
415
+ for j in range (self .indexArray.shape[0 ]):
416
+ if self .indexArray[j] == i:
417
+ return j
418
+ return - 1
419
+
388
420
cpdef void fromSet(self , set s):
389
421
cdef:
390
422
INDEX_t i, k
@@ -446,7 +478,7 @@ cdef class arrayIndexSetIterator(indexSetIterator):
446
478
cdef class bitArray(indexSet):
447
479
def __init__ (self , size_t hintMaxLength = 1 , INDEX_t maxElement = 0 ):
448
480
self .length = max (hintMaxLength, maxElement/ (sizeof(MEM_t)* 8 )+ 1 )
449
- self .a = < MEM_t * > malloc (self .length* sizeof(MEM_t))
481
+ self .a = < MEM_t * > PyMem_Malloc (self .length* sizeof(MEM_t))
450
482
for j in range (self .length):
451
483
self .a[j] = 0
452
484
@@ -459,7 +491,7 @@ cdef class bitArray(indexSet):
459
491
if k >= self .length:
460
492
l = self .length
461
493
self .length = k+ 1
462
- self .a = < MEM_t * > realloc (self .a, self .length * sizeof(MEM_t))
494
+ self .a = < MEM_t * > PyMem_Realloc (self .a, self .length * sizeof(MEM_t))
463
495
for j in range (l, self .length):
464
496
self .a[j] = 0
465
497
self .a[k] |= one << n
@@ -510,7 +542,7 @@ cdef class bitArray(indexSet):
510
542
self .a[j] = 0
511
543
512
544
def __dealloc__ (self ):
513
- free (self .a)
545
+ PyMem_Free (self .a)
514
546
515
547
cdef indexSetIterator getIter(self ):
516
548
return bitArrayIterator(self )
0 commit comments