mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-23 21:10:19 +00:00
125 lines
3.1 KiB
C++
125 lines
3.1 KiB
C++
#pragma once
|
|
|
|
const char* __BUILTINS_CODE = R"(
|
|
def len(x):
|
|
return x.__len__()
|
|
|
|
str.__mul__ = lambda self, n: ''.join([self for _ in range(n)])
|
|
|
|
def __str4split(self, sep):
|
|
if sep == "":
|
|
return list(self)
|
|
res = []
|
|
i = 0
|
|
while i < len(self):
|
|
if self[i:i+len(sep)] == sep:
|
|
res.append(self[:i])
|
|
self = self[i+len(sep):]
|
|
i = 0
|
|
else:
|
|
i += 1
|
|
res.append(self)
|
|
return res
|
|
str.split = __str4split
|
|
|
|
list.__repr__ = lambda self: '[' + ', '.join([repr(i) for i in self]) + ']'
|
|
tuple.__repr__ = lambda self: '(' + ', '.join([repr(i) for i in self]) + ')'
|
|
|
|
def __list4extend(self, other):
|
|
for i in other:
|
|
self.append(i)
|
|
list.extend = __list4extend
|
|
|
|
def __list4__mul__(self, n):
|
|
a = []
|
|
for i in range(n):
|
|
a.extend(self)
|
|
return a
|
|
list.__mul__ = __list4__mul__
|
|
|
|
def __iterable4__eq__(self, other):
|
|
if len(self) != len(other):
|
|
return False
|
|
for i in range(len(self)):
|
|
if self[i] != other[i]:
|
|
return False
|
|
return True
|
|
list.__eq__ = __iterable4__eq__
|
|
tuple.__eq__ = __iterable4__eq__
|
|
|
|
def __iterable4__contains__(self, item):
|
|
for i in self:
|
|
if i == item:
|
|
return True
|
|
return False
|
|
list.__contains__ = __iterable4__contains__
|
|
tuple.__contains__ = __iterable4__contains__
|
|
|
|
# https://github.com/python/cpython/blob/main/Objects/dictobject.c
|
|
class dict:
|
|
def __init__(self):
|
|
self._capacity = 8
|
|
self._a = [None] * self._capacity
|
|
self._len = 0
|
|
|
|
def __len__(self):
|
|
return self._len
|
|
|
|
def __probe(self, key):
|
|
i = hash(key) % self._capacity
|
|
while self._a[i] is not None:
|
|
if self._a[i][0] == key:
|
|
return True, i
|
|
i = ((5*i) + 1) % self._capacity
|
|
return False, i
|
|
|
|
def __getitem__(self, key):
|
|
ok, i = self.__probe(key)
|
|
if not ok:
|
|
raise KeyError(key)
|
|
return self._a[i][1]
|
|
|
|
def __contains__(self, key):
|
|
ok, i = self.__probe(key)
|
|
return ok
|
|
|
|
def __setitem__(self, key, value):
|
|
ok, i = self.__probe(key)
|
|
if ok:
|
|
self._a[i][1] = value
|
|
else:
|
|
self._a[i] = [key, value]
|
|
self._len += 1
|
|
if self._len > self._capacity * 0.6:
|
|
self.__resize_2x()
|
|
|
|
def __delitem__(self, key):
|
|
ok, i = self.__probe(key)
|
|
if not ok:
|
|
raise KeyError(key)
|
|
self._a[i] = None
|
|
self._len -= 1
|
|
|
|
def __resize_2x(self):
|
|
old_a = self._a
|
|
self._capacity *= 2
|
|
self._a = [None] * self._capacity
|
|
self._len = 0
|
|
for kv in old_a:
|
|
if kv is not None:
|
|
self[kv[0]] = kv[1]
|
|
|
|
def keys(self):
|
|
return [kv[0] for kv in self._a if kv is not None]
|
|
|
|
def values(self):
|
|
return [kv[1] for kv in self._a if kv is not None]
|
|
|
|
def items(self):
|
|
return [kv for kv in self._a if kv is not None]
|
|
|
|
def __repr__(self):
|
|
a = [repr(k)+': '+repr(v) for k,v in self.items()]
|
|
return '{'+ ', '.join(a) + '}'
|
|
|
|
)"; |