mirror of https://github.com/exaloop/codon.git
Improve collection-to-str conversions
parent
8a63e73c82
commit
74bc584393
stdlib/internal/types
collections
test/core
|
@ -140,23 +140,24 @@ class Dict:
|
||||||
return {k.__deepcopy__(): v.__deepcopy__() for k, v in self.items()}
|
return {k.__deepcopy__(): v.__deepcopy__() for k, v in self.items()}
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
|
from internal.types.strbuf import strbuf
|
||||||
n = self.__len__()
|
n = self.__len__()
|
||||||
if n == 0:
|
if n == 0:
|
||||||
return "{}"
|
return "{}"
|
||||||
else:
|
else:
|
||||||
lst = []
|
buf = strbuf()
|
||||||
lst.append("{")
|
buf.append("{")
|
||||||
first = True
|
first = True
|
||||||
for k, v in self.items():
|
for k, v in self.items():
|
||||||
if not first:
|
if not first:
|
||||||
lst.append(", ")
|
buf.append(", ")
|
||||||
else:
|
else:
|
||||||
first = False
|
first = False
|
||||||
lst.append(k.__repr__())
|
buf.append(k.__repr__())
|
||||||
lst.append(": ")
|
buf.append(": ")
|
||||||
lst.append(v.__repr__())
|
buf.append(v.__repr__())
|
||||||
lst.append("}")
|
buf.append("}")
|
||||||
return str.cat(lst)
|
return buf.__str__()
|
||||||
|
|
||||||
# Helper methods
|
# Helper methods
|
||||||
|
|
||||||
|
|
|
@ -267,16 +267,19 @@ class List:
|
||||||
return self
|
return self
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
|
from internal.types.strbuf import strbuf
|
||||||
n = self.__len__()
|
n = self.__len__()
|
||||||
if n == 0:
|
if n == 0:
|
||||||
return "[]"
|
return "[]"
|
||||||
else:
|
else:
|
||||||
y = ["[", self[0].__repr__()]
|
buf = strbuf()
|
||||||
|
buf.append("[")
|
||||||
|
buf.append(self[0].__repr__())
|
||||||
for i in range(1, n):
|
for i in range(1, n):
|
||||||
y.append(", ")
|
buf.append(", ")
|
||||||
y.append(self[i].__repr__())
|
buf.append(self[i].__repr__())
|
||||||
y.append("]")
|
buf.append("]")
|
||||||
return str.cat(y)
|
return buf.__str__()
|
||||||
|
|
||||||
# Helper functions
|
# Helper functions
|
||||||
|
|
||||||
|
|
|
@ -130,21 +130,22 @@ class Set:
|
||||||
return {s.__deepcopy__() for s in self}
|
return {s.__deepcopy__() for s in self}
|
||||||
|
|
||||||
def __repr__(self) -> str:
|
def __repr__(self) -> str:
|
||||||
|
from internal.types.strbuf import strbuf
|
||||||
n = self.__len__()
|
n = self.__len__()
|
||||||
if n == 0:
|
if n == 0:
|
||||||
return "{}"
|
return "{}"
|
||||||
else:
|
else:
|
||||||
lst = []
|
buf = strbuf()
|
||||||
lst.append("{")
|
buf.append("{")
|
||||||
first = True
|
first = True
|
||||||
for k in self:
|
for k in self:
|
||||||
if not first:
|
if not first:
|
||||||
lst.append(", ")
|
buf.append(", ")
|
||||||
else:
|
else:
|
||||||
first = False
|
first = False
|
||||||
lst.append(k.__repr__())
|
buf.append(k.__repr__())
|
||||||
lst.append("}")
|
buf.append("}")
|
||||||
return str.cat(lst)
|
return buf.__str__()
|
||||||
|
|
||||||
# Helper methods
|
# 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 = list(range(10))
|
||||||
a[::2] = (0, 1, 2, 3, 4)
|
a[::2] = (0, 1, 2, 3, 4)
|
||||||
assert a == [0, 1, 1, 3, 2, 5, 3, 7, 4, 9]
|
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_extendedslicing()
|
||||||
|
|
||||||
@test
|
@test
|
||||||
|
@ -378,6 +381,9 @@ def test_set():
|
||||||
assert False
|
assert False
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
assert repr({(1,2)}) == '{(1, 2)}'
|
||||||
|
assert repr(Set[int]()) == '{}'
|
||||||
test_set()
|
test_set()
|
||||||
|
|
||||||
@test
|
@test
|
||||||
|
@ -417,6 +423,9 @@ def test_dict():
|
||||||
assert d3 | d4 == {1: 5, 42: 42, 2: 9}
|
assert d3 | d4 == {1: 5, 42: 42, 2: 9}
|
||||||
d3 |= d4
|
d3 |= d4
|
||||||
assert d3 == {1: 5, 42: 42, 2: 9}
|
assert d3 == {1: 5, 42: 42, 2: 9}
|
||||||
|
|
||||||
|
assert repr({1: ['x']}) == "{1: ['x']}"
|
||||||
|
assert repr(Dict[int,int]()) == '{}'
|
||||||
test_dict()
|
test_dict()
|
||||||
|
|
||||||
@test
|
@test
|
||||||
|
|
Loading…
Reference in New Issue