Support iterators returning lent T (#11938)
* lent iterators * rebase tests * update changelog * fix comments, more tests
This commit is contained in:
parent
9ae0dd611f
commit
2b565aad89
7 changed files with 116 additions and 27 deletions
|
|
@ -27,3 +27,62 @@ for a in items(arr):
|
|||
|
||||
echo ""
|
||||
|
||||
#--------------------------------------------------------------------
|
||||
# Lent iterators
|
||||
#--------------------------------------------------------------------
|
||||
type
|
||||
NonCopyable = object
|
||||
x: int
|
||||
|
||||
|
||||
proc `=destroy`(o: var NonCopyable) =
|
||||
discard
|
||||
|
||||
proc `=copy`(dst: var NonCopyable, src: NonCopyable) {.error.}
|
||||
|
||||
proc `=sink`(dst: var NonCopyable, src: NonCopyable) =
|
||||
dst.x = src.x
|
||||
|
||||
iterator lentItems[T](a: openarray[T]): lent T =
|
||||
for i in 0..a.high:
|
||||
yield a[i]
|
||||
|
||||
iterator lentPairs[T](a: array[0..1, T]): tuple[key: int, val: lent T] =
|
||||
for i in 0..a.high:
|
||||
yield (i, a[i])
|
||||
|
||||
|
||||
let arr1 = [1, 2, 3]
|
||||
let arr2 = @["a", "b", "c"]
|
||||
let arr3 = [NonCopyable(x: 1), NonCopyable(x: 2)]
|
||||
let arr4 = @[(1, "a"), (2, "b"), (3, "c")]
|
||||
|
||||
var accum: string
|
||||
for x in lentItems(arr1):
|
||||
accum &= $x
|
||||
doAssert(accum == "123")
|
||||
|
||||
accum = ""
|
||||
for x in lentItems(arr2):
|
||||
accum &= $x
|
||||
doAssert(accum == "abc")
|
||||
|
||||
accum = ""
|
||||
for val in lentItems(arr3):
|
||||
accum &= $val.x
|
||||
doAssert(accum == "12")
|
||||
|
||||
accum = ""
|
||||
for i, val in lentPairs(arr3):
|
||||
accum &= $i & "-" & $val.x & " "
|
||||
doAssert(accum == "0-1 1-2 ")
|
||||
|
||||
accum = ""
|
||||
for i, val in lentItems(arr4):
|
||||
accum &= $i & "-" & $val & " "
|
||||
doAssert(accum == "1-a 2-b 3-c ")
|
||||
|
||||
accum = ""
|
||||
for (i, val) in lentItems(arr4):
|
||||
accum &= $i & "-" & $val & " "
|
||||
doAssert(accum == "1-a 2-b 3-c ")
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue