mirror of
https://github.com/status-im/nim-stew.git
synced 2025-02-17 22:47:28 +00:00
arraybuf: fix iterator, setLen (#231)
This commit is contained in:
parent
90a9bfd843
commit
68e8ae6413
@ -51,7 +51,7 @@ template setLen*(b: var ArrayBuf, newLenParam: int) =
|
|||||||
newLenParam.evalOnceAs(newLen)
|
newLenParam.evalOnceAs(newLen)
|
||||||
let nl = typeof(b.n)(newLen)
|
let nl = typeof(b.n)(newLen)
|
||||||
for i in newLen ..< b.len():
|
for i in newLen ..< b.len():
|
||||||
reset(b.buf[b.len() - i - 1]) # reset cleared items when shrinking
|
reset(b.buf[i]) # reset cleared items when shrinking
|
||||||
b.n = nl
|
b.n = nl
|
||||||
|
|
||||||
template data*(bParam: ArrayBuf): openArray =
|
template data*(bParam: ArrayBuf): openArray =
|
||||||
@ -64,7 +64,7 @@ template data*(bParam: var ArrayBuf): var openArray =
|
|||||||
|
|
||||||
iterator items*[N, T](b: ArrayBuf[N, T]): lent T =
|
iterator items*[N, T](b: ArrayBuf[N, T]): lent T =
|
||||||
for i in 0 ..< b.len:
|
for i in 0 ..< b.len:
|
||||||
yield b.d[i]
|
yield b.buf[i]
|
||||||
|
|
||||||
iterator mitems*[N, T](b: var ArrayBuf[N, T]): var T =
|
iterator mitems*[N, T](b: var ArrayBuf[N, T]): var T =
|
||||||
for i in 0 ..< b.len:
|
for i in 0 ..< b.len:
|
||||||
@ -83,6 +83,9 @@ template `[]`*[N, T](b: var ArrayBuf[N, T], i: int): var T =
|
|||||||
template `[]=`*[N, T](b: var ArrayBuf[N, T], i: int, v: T) =
|
template `[]=`*[N, T](b: var ArrayBuf[N, T], i: int, v: T) =
|
||||||
b.buf[i] = v
|
b.buf[i] = v
|
||||||
|
|
||||||
|
template `[]`*[N, T](b: ArrayBuf[N, T], i: BackwardsIndex): lent T =
|
||||||
|
b.buf[b.len - int(i)]
|
||||||
|
|
||||||
template `==`*(a, b: ArrayBuf): bool =
|
template `==`*(a, b: ArrayBuf): bool =
|
||||||
a.data() == b.data()
|
a.data() == b.data()
|
||||||
|
|
||||||
@ -102,3 +105,11 @@ template add*[N, T](b: var ArrayBuf[N, T], v: openArray[T]) =
|
|||||||
# TODO `b` is evaluated multiple times but since it's a `var` this should
|
# TODO `b` is evaluated multiple times but since it's a `var` this should
|
||||||
# _hopefully_ be fine..
|
# _hopefully_ be fine..
|
||||||
b.n += typeof(b.n)(b.buf.toOpenArray(b.len, N - 1).copyFrom(v))
|
b.n += typeof(b.n)(b.buf.toOpenArray(b.len, N - 1).copyFrom(v))
|
||||||
|
|
||||||
|
template pop*[N, T](b: var ArrayBuf[N, T]): T =
|
||||||
|
## Return the last item while removing it from the buffer
|
||||||
|
# TODO `b` is evaluated multiple times but since it's a `var` this should
|
||||||
|
# _hopefully_ be fine..
|
||||||
|
assert b.n > 0, "pop from empty ArrayBuf"
|
||||||
|
b.n -= 1
|
||||||
|
move(b.buf[b.n])
|
@ -34,3 +34,25 @@ suite "ArrayBuf":
|
|||||||
|
|
||||||
v.add(byte 4)
|
v.add(byte 4)
|
||||||
doAssert v.data() == [byte 0, 1]
|
doAssert v.data() == [byte 0, 1]
|
||||||
|
|
||||||
|
test "setLen clearing":
|
||||||
|
var v: ArrayBuf[5, byte]
|
||||||
|
|
||||||
|
v.add(1)
|
||||||
|
v.add(2)
|
||||||
|
|
||||||
|
check: v.pop() == 2
|
||||||
|
|
||||||
|
v.setLen(2)
|
||||||
|
check:
|
||||||
|
v[^1] == 0 # not 2!
|
||||||
|
|
||||||
|
|
||||||
|
v[1] = 42
|
||||||
|
|
||||||
|
v.setLen(1)
|
||||||
|
check:
|
||||||
|
v[0] == 1
|
||||||
|
v.len == 1
|
||||||
|
v.setLen(2)
|
||||||
|
doAssert v.data() == [byte 1, 0]
|
||||||
|
Loading…
x
Reference in New Issue
Block a user