fix collections module

This commit is contained in:
blueloveTH 2023-10-16 13:13:39 +08:00
parent 7590cdf51a
commit 7d88d28a6b
4 changed files with 101 additions and 99 deletions

View File

@ -12,7 +12,7 @@ namespace pkpy
// STARTING HERE // STARTING HERE
struct PyDeque struct PyDeque
{ {
PY_CLASS(PyDeque, mycollections, deque); PY_CLASS(PyDeque, collections, deque);
PyDeque(VM *vm, PyObject *iterable, PyObject* maxlen); PyDeque(VM *vm, PyObject *iterable, PyObject* maxlen);
@ -51,5 +51,5 @@ namespace pkpy
void _gc_mark() const; // needed for container types, mark all objects in the deque for gc void _gc_mark() const; // needed for container types, mark all objects in the deque for gc
}; };
void add_module_mycollections(VM *vm); void add_module_collections(VM *vm);
} // namespace pkpy } // namespace pkpy

View File

@ -1,110 +1,110 @@
class _LinkedListNode: # class _LinkedListNode:
def __init__(self, prev, next, value) -> None: # def __init__(self, prev, next, value) -> None:
self.prev = prev # self.prev = prev
self.next = next # self.next = next
self.value = value # self.value = value
class deque: # class deque:
def __init__(self, iterable=None) -> None: # def __init__(self, iterable=None) -> None:
self.head = _LinkedListNode(None, None, None) # self.head = _LinkedListNode(None, None, None)
self.tail = _LinkedListNode(None, None, None) # self.tail = _LinkedListNode(None, None, None)
self.head.next = self.tail # self.head.next = self.tail
self.tail.prev = self.head # self.tail.prev = self.head
self.size = 0 # self.size = 0
if iterable is not None: # if iterable is not None:
for value in iterable: # for value in iterable:
self.append(value) # self.append(value)
def __getitem__(self, index): # def __getitem__(self, index):
assert 0 <= index < len(self) # assert 0 <= index < len(self)
node = self.head.next # node = self.head.next
for _ in range(index): # for _ in range(index):
node = node.next # node = node.next
return node.value # return node.value
def __setitem__(self, index, value): # def __setitem__(self, index, value):
assert 0 <= index < len(self) # assert 0 <= index < len(self)
node = self.head.next # node = self.head.next
for _ in range(index): # for _ in range(index):
node = node.next # node = node.next
node.value = value # node.value = value
def __delitem__(self, index): # def __delitem__(self, index):
assert 0 <= index < len(self) # assert 0 <= index < len(self)
node = self.head.next # node = self.head.next
for _ in range(index): # for _ in range(index):
node = node.next # node = node.next
node.prev.next = node.next # node.prev.next = node.next
node.next.prev = node.prev # node.next.prev = node.prev
self.size -= 1 # self.size -= 1
def clear(self): # def clear(self):
self.head.next = self.tail # self.head.next = self.tail
self.tail.prev = self.head # self.tail.prev = self.head
self.size = 0 # self.size = 0
def extend(self, iterable): # def extend(self, iterable):
for value in iterable: # for value in iterable:
self.append(value) # self.append(value)
def append(self, value): # def append(self, value):
node = _LinkedListNode(self.tail.prev, self.tail, value) # node = _LinkedListNode(self.tail.prev, self.tail, value)
self.tail.prev.next = node # self.tail.prev.next = node
self.tail.prev = node # self.tail.prev = node
self.size += 1 # self.size += 1
def appendleft(self, value): # def appendleft(self, value):
node = _LinkedListNode(self.head, self.head.next, value) # node = _LinkedListNode(self.head, self.head.next, value)
self.head.next.prev = node # self.head.next.prev = node
self.head.next = node # self.head.next = node
self.size += 1 # self.size += 1
def pop(self): # def pop(self):
assert self.size > 0 # assert self.size > 0
node = self.tail.prev # node = self.tail.prev
node.prev.next = self.tail # node.prev.next = self.tail
self.tail.prev = node.prev # self.tail.prev = node.prev
self.size -= 1 # self.size -= 1
return node.value # return node.value
def popleft(self): # def popleft(self):
assert self.size > 0 # assert self.size > 0
node = self.head.next # node = self.head.next
node.next.prev = self.head # node.next.prev = self.head
self.head.next = node.next # self.head.next = node.next
self.size -= 1 # self.size -= 1
return node.value # return node.value
def copy(self): # def copy(self):
new_list = deque() # new_list = deque()
for value in self: # for value in self:
new_list.append(value) # new_list.append(value)
return new_list # return new_list
def __len__(self): # def __len__(self):
return self.size # return self.size
def __iter__(self): # def __iter__(self):
node = self.head.next # node = self.head.next
while node is not self.tail: # while node is not self.tail:
yield node.value # yield node.value
node = node.next # node = node.next
def __repr__(self) -> str: # def __repr__(self) -> str:
a = list(self) # a = list(self)
return f"deque({a})" # return f"deque({a})"
def __eq__(self, __o: object) -> bool: # def __eq__(self, __o: object) -> bool:
if not isinstance(__o, deque): # if not isinstance(__o, deque):
return False # return False
if len(self) != len(__o): # if len(self) != len(__o):
return False # return False
t1, t2 = self.head.next, __o.head.next # t1, t2 = self.head.next, __o.head.next
while t1 is not self.tail: # while t1 is not self.tail:
if t1.value != t2.value: # if t1.value != t2.value:
return False # return False
t1, t2 = t1.next, t2.next # t1, t2 = t1.next, t2.next
return True # return True
def Counter(iterable): def Counter(iterable):
a = {} a = {}

View File

@ -574,9 +574,11 @@ namespace pkpy
} }
/// @brief registers the PyDeque class /// @brief registers the PyDeque class
/// @param vm is needed for the new_module and register_class /// @param vm is needed for the new_module and register_class
void add_module_mycollections(VM *vm) void add_module_collections(VM *vm)
{ {
PyObject *mycollections = vm->new_module("mycollections"); // TODO: change this to collections PyObject* mod = vm->new_module("collections");
PyDeque::register_class(vm, mycollections); PyDeque::register_class(vm, mod);
CodeObject_ code = vm->compile(kPythonLibs["collections"], "collections.py", EXEC_MODE);
vm->_exec(code, mod);
} }
} // namespace pkpypkpy } // namespace pkpypkpy

View File

@ -1722,7 +1722,7 @@ void VM::post_init(){
add_module_base64(this); add_module_base64(this);
add_module_timeit(this); add_module_timeit(this);
for(const char* name: {"this", "functools", "collections", "heapq", "bisect", "pickle", "_long", "colorsys", "typing", "datetime"}){ for(const char* name: {"this", "functools", "heapq", "bisect", "pickle", "_long", "colorsys", "typing", "datetime"}){
_lazy_modules[name] = kPythonLibs[name]; _lazy_modules[name] = kPythonLibs[name];
} }
@ -1745,7 +1745,7 @@ void VM::post_init(){
add_module_linalg(this); add_module_linalg(this);
add_module_easing(this); add_module_easing(this);
add_module_mycollections(this); add_module_collections(this);
#ifdef PK_USE_BOX2D #ifdef PK_USE_BOX2D
add_module_box2d(this); add_module_box2d(this);