mirror of
https://github.com/pocketpy/pocketpy
synced 2025-11-10 13:40:16 +00:00
fix collections module
This commit is contained in:
parent
7590cdf51a
commit
7d88d28a6b
@ -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
|
||||||
@ -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 = {}
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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);
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user