mirror of https://github.com/exaloop/codon.git
Improve collection-to-str conversions
parent
8a63e73c82
commit
74bc584393
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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 "{}"
|
||||
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
|
||||
|
||||
|
|
|
@ -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)
|
|
@ -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]()) == '{}'
|
||||
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
|
||||
|
|
Loading…
Reference in New Issue