snapshot before regression test
This commit is contained in:
66
includes/vector.py
Normal file
66
includes/vector.py
Normal file
@@ -0,0 +1,66 @@
|
||||
import t, c
|
||||
from stdint import *
|
||||
import memhub
|
||||
|
||||
|
||||
class Vector[T]():
|
||||
data: t.CVoid | t.CPtr
|
||||
length: t.CSizeT
|
||||
capacity: t.CSizeT
|
||||
elem_size: t.CSizeT
|
||||
pool: memhub.MemManager | t.CPtr
|
||||
|
||||
def __init__(self, pool: memhub.MemManager | t.CPtr, capacity: t.CSizeT, _hint: T):
|
||||
self.elem_size = T.__sizeof__()
|
||||
self.capacity = capacity
|
||||
self.length = 0
|
||||
self.pool = pool
|
||||
self.data = pool.alloc(capacity * self.elem_size)
|
||||
|
||||
def push(self, value: T):
|
||||
if self.data == None: return
|
||||
if self.length >= self.capacity:
|
||||
self._grow()
|
||||
if self.length >= self.capacity: return
|
||||
offset: t.CUInt64T = t.CUInt64T(self.data) + self.length * self.elem_size
|
||||
dst: t.CVoid | t.CPtr = t.CVoid(offset, t.CPtr)
|
||||
c.DerefAs(dst, value)
|
||||
self.length += 1
|
||||
|
||||
def _grow(self):
|
||||
if self.pool == None: return
|
||||
new_capacity: t.CSizeT = self.capacity * 2
|
||||
if new_capacity == 0: new_capacity = 4
|
||||
old_size: t.CSizeT = self.capacity * self.elem_size
|
||||
new_size: t.CSizeT = new_capacity * self.elem_size
|
||||
new_data: t.CVoid | t.CPtr = self.pool.realloc(self.data, old_size, new_size)
|
||||
if new_data == None: return
|
||||
self.data = new_data
|
||||
self.capacity = new_capacity
|
||||
|
||||
def get(self, index: t.CSizeT) -> T:
|
||||
if self.data == None: return T(0)
|
||||
offset: t.CUInt64T = t.CUInt64T(self.data) + index * self.elem_size
|
||||
typed_ptr = T(offset, t.CPtr)
|
||||
return c.Deref(typed_ptr)
|
||||
|
||||
def set(self, index: t.CSizeT, value: T):
|
||||
if index >= self.length: return
|
||||
if self.data == None: return
|
||||
offset: t.CUInt64T = t.CUInt64T(self.data) + index * self.elem_size
|
||||
dst: t.CVoid | t.CPtr = t.CVoid(offset, t.CPtr)
|
||||
c.DerefAs(dst, value)
|
||||
|
||||
def len(self) -> t.CSizeT:
|
||||
return self.length
|
||||
|
||||
def clear(self):
|
||||
self.length = 0
|
||||
|
||||
def free(self):
|
||||
if self.data != None:
|
||||
if self.pool != None:
|
||||
self.pool.free(self.data)
|
||||
self.data = None
|
||||
self.length = 0
|
||||
self.capacity = 0
|
||||
Reference in New Issue
Block a user