Merge pull request #54 from exaloop/better-collection-str

Improve collection-to-str conversions
pull/55/head
Ibrahim Numanagić 2022-09-20 11:33:21 -07:00 committed by GitHub
commit bb1c1dd817
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 61 additions and 20 deletions

View File

@ -140,23 +140,24 @@ class Dict:
return {k.__deepcopy__(): v.__deepcopy__() for k, v in self.items()}
def __repr__(self) -> str:
from internal.types.strbuf import strbuf
n = self.__len__()
if n == 0:
return "{}"
else:
lst = []
lst.append("{")
buf = strbuf()
buf.append("{")
first = True
for k, v in self.items():
if not first:
lst.append(", ")
buf.append(", ")
else:
first = False
lst.append(k.__repr__())
lst.append(": ")
lst.append(v.__repr__())
lst.append("}")
return str.cat(lst)
buf.append(k.__repr__())
buf.append(": ")
buf.append(v.__repr__())
buf.append("}")
return buf.__str__()
# Helper methods

View File

@ -267,16 +267,19 @@ class List:
return self
def __repr__(self) -> str:
from internal.types.strbuf import strbuf
n = self.__len__()
if n == 0:
return "[]"
else:
y = ["[", self[0].__repr__()]
buf = strbuf()
buf.append("[")
buf.append(self[0].__repr__())
for i in range(1, n):
y.append(", ")
y.append(self[i].__repr__())
y.append("]")
return str.cat(y)
buf.append(", ")
buf.append(self[i].__repr__())
buf.append("]")
return buf.__str__()
# Helper functions

View File

@ -130,21 +130,22 @@ class Set:
return {s.__deepcopy__() for s in self}
def __repr__(self) -> str:
from internal.types.strbuf import strbuf
n = self.__len__()
if n == 0:
return "{}"
return "set()"
else:
lst = []
lst.append("{")
buf = strbuf()
buf.append("{")
first = True
for k in self:
if not first:
lst.append(", ")
buf.append(", ")
else:
first = False
lst.append(k.__repr__())
lst.append("}")
return str.cat(lst)
buf.append(k.__repr__())
buf.append("}")
return buf.__str__()
# Helper methods

View File

@ -0,0 +1,27 @@
# (c) 2022 Exaloop Inc. All rights reserved.
class strbuf:
data: Ptr[byte]
n: int
m: int
def __init__(self, capacity: int = 16):
self.data = Ptr[byte](capacity)
self.n = 0
self.m = capacity
def append(self, s: str):
from internal.gc import realloc
adding = s.__len__()
needed = self.n + adding
if needed > self.m:
m = self.m
while m < needed:
m *= 2
self.data = realloc(self.data, m, self.m)
self.m = m
str.memcpy(self.data + self.n, s.ptr, adding)
self.n = needed
def __str__(self):
return str(self.data, self.n)

View File

@ -304,6 +304,9 @@ def test_extendedslicing():
a = list(range(10))
a[::2] = (0, 1, 2, 3, 4)
assert a == [0, 1, 1, 3, 2, 5, 3, 7, 4, 9]
assert repr(['x', 'y', 'z']) == "['x', 'y', 'z']"
assert repr(List[int]()) == '[]'
test_extendedslicing()
@test
@ -378,6 +381,9 @@ def test_set():
assert False
except ValueError:
pass
assert repr({(1,2)}) == '{(1, 2)}'
assert repr(Set[int]()) == 'set()'
test_set()
@test
@ -417,6 +423,9 @@ def test_dict():
assert d3 | d4 == {1: 5, 42: 42, 2: 9}
d3 |= d4
assert d3 == {1: 5, 42: 42, 2: 9}
assert repr({1: ['x']}) == "{1: ['x']}"
assert repr(Dict[int,int]()) == '{}'
test_dict()
@test