use sink and lent in deques (#17661)
* use sink and lent in deques * Update lib/pure/collections/deques.nim Co-authored-by: Andreas Rumpf <rumpf_a@web.de> Co-authored-by: Andreas Rumpf <rumpf_a@web.de>
This commit is contained in:
parent
939df8cbda
commit
834d5641e8
2 changed files with 61 additions and 12 deletions
|
|
@ -50,7 +50,7 @@ runnableExamples:
|
||||||
|
|
||||||
import std/private/since
|
import std/private/since
|
||||||
|
|
||||||
import math
|
import std/math
|
||||||
|
|
||||||
type
|
type
|
||||||
Deque*[T] = object
|
Deque*[T] = object
|
||||||
|
|
@ -120,7 +120,7 @@ template xBoundsCheck(deq, i) =
|
||||||
raise newException(IndexDefect,
|
raise newException(IndexDefect,
|
||||||
"Out of bounds: " & $i & " < 0")
|
"Out of bounds: " & $i & " < 0")
|
||||||
|
|
||||||
proc `[]`*[T](deq: Deque[T], i: Natural): T {.inline.} =
|
proc `[]`*[T](deq: Deque[T], i: Natural): lent T {.inline.} =
|
||||||
## Accesses the `i`-th element of `deq`.
|
## Accesses the `i`-th element of `deq`.
|
||||||
runnableExamples:
|
runnableExamples:
|
||||||
let a = [10, 20, 30, 40, 50].toDeque
|
let a = [10, 20, 30, 40, 50].toDeque
|
||||||
|
|
@ -142,7 +142,7 @@ proc `[]`*[T](deq: var Deque[T], i: Natural): var T {.inline.} =
|
||||||
xBoundsCheck(deq, i)
|
xBoundsCheck(deq, i)
|
||||||
return deq.data[(deq.head + i) and deq.mask]
|
return deq.data[(deq.head + i) and deq.mask]
|
||||||
|
|
||||||
proc `[]=`*[T](deq: var Deque[T], i: Natural, val: T) {.inline.} =
|
proc `[]=`*[T](deq: var Deque[T], i: Natural, val: sink T) {.inline.} =
|
||||||
## Sets the `i`-th element of `deq` to `val`.
|
## Sets the `i`-th element of `deq` to `val`.
|
||||||
runnableExamples:
|
runnableExamples:
|
||||||
var a = [10, 20, 30, 40, 50].toDeque
|
var a = [10, 20, 30, 40, 50].toDeque
|
||||||
|
|
@ -154,7 +154,7 @@ proc `[]=`*[T](deq: var Deque[T], i: Natural, val: T) {.inline.} =
|
||||||
xBoundsCheck(deq, i)
|
xBoundsCheck(deq, i)
|
||||||
deq.data[(deq.head + i) and deq.mask] = val
|
deq.data[(deq.head + i) and deq.mask] = val
|
||||||
|
|
||||||
proc `[]`*[T](deq: Deque[T], i: BackwardsIndex): T {.inline.} =
|
proc `[]`*[T](deq: Deque[T], i: BackwardsIndex): lent T {.inline.} =
|
||||||
## Accesses the backwards indexed `i`-th element.
|
## Accesses the backwards indexed `i`-th element.
|
||||||
##
|
##
|
||||||
## `deq[^1]` is the last element.
|
## `deq[^1]` is the last element.
|
||||||
|
|
@ -180,7 +180,7 @@ proc `[]`*[T](deq: var Deque[T], i: BackwardsIndex): var T {.inline.} =
|
||||||
xBoundsCheck(deq, deq.len - int(i))
|
xBoundsCheck(deq, deq.len - int(i))
|
||||||
return deq[deq.len - int(i)]
|
return deq[deq.len - int(i)]
|
||||||
|
|
||||||
proc `[]=`*[T](deq: var Deque[T], i: BackwardsIndex, x: T) {.inline.} =
|
proc `[]=`*[T](deq: var Deque[T], i: BackwardsIndex, x: sink T) {.inline.} =
|
||||||
## Sets the backwards indexed `i`-th element of `deq` to `x`.
|
## Sets the backwards indexed `i`-th element of `deq` to `x`.
|
||||||
##
|
##
|
||||||
## `deq[^1]` is the last element.
|
## `deq[^1]` is the last element.
|
||||||
|
|
@ -194,7 +194,7 @@ proc `[]=`*[T](deq: var Deque[T], i: BackwardsIndex, x: T) {.inline.} =
|
||||||
xBoundsCheck(deq, deq.len - int(i))
|
xBoundsCheck(deq, deq.len - int(i))
|
||||||
deq[deq.len - int(i)] = x
|
deq[deq.len - int(i)] = x
|
||||||
|
|
||||||
iterator items*[T](deq: Deque[T]): T =
|
iterator items*[T](deq: Deque[T]): lent T =
|
||||||
## Yields every element of `deq`.
|
## Yields every element of `deq`.
|
||||||
##
|
##
|
||||||
## **See also:**
|
## **See also:**
|
||||||
|
|
@ -270,7 +270,7 @@ proc expandIfNeeded[T](deq: var Deque[T]) =
|
||||||
deq.tail = deq.count
|
deq.tail = deq.count
|
||||||
deq.head = 0
|
deq.head = 0
|
||||||
|
|
||||||
proc addFirst*[T](deq: var Deque[T], item: T) =
|
proc addFirst*[T](deq: var Deque[T], item: sink T) =
|
||||||
## Adds an `item` to the beginning of `deq`.
|
## Adds an `item` to the beginning of `deq`.
|
||||||
##
|
##
|
||||||
## **See also:**
|
## **See also:**
|
||||||
|
|
@ -286,7 +286,7 @@ proc addFirst*[T](deq: var Deque[T], item: T) =
|
||||||
deq.head = (deq.head - 1) and deq.mask
|
deq.head = (deq.head - 1) and deq.mask
|
||||||
deq.data[deq.head] = item
|
deq.data[deq.head] = item
|
||||||
|
|
||||||
proc addLast*[T](deq: var Deque[T], item: T) =
|
proc addLast*[T](deq: var Deque[T], item: sink T) =
|
||||||
## Adds an `item` to the end of `deq`.
|
## Adds an `item` to the end of `deq`.
|
||||||
##
|
##
|
||||||
## **See also:**
|
## **See also:**
|
||||||
|
|
@ -302,7 +302,7 @@ proc addLast*[T](deq: var Deque[T], item: T) =
|
||||||
deq.data[deq.tail] = item
|
deq.data[deq.tail] = item
|
||||||
deq.tail = (deq.tail + 1) and deq.mask
|
deq.tail = (deq.tail + 1) and deq.mask
|
||||||
|
|
||||||
proc peekFirst*[T](deq: Deque[T]): T {.inline.} =
|
proc peekFirst*[T](deq: Deque[T]): lent T {.inline.} =
|
||||||
## Returns the first element of `deq`, but does not remove it from the deque.
|
## Returns the first element of `deq`, but does not remove it from the deque.
|
||||||
##
|
##
|
||||||
## **See also:**
|
## **See also:**
|
||||||
|
|
@ -317,7 +317,7 @@ proc peekFirst*[T](deq: Deque[T]): T {.inline.} =
|
||||||
emptyCheck(deq)
|
emptyCheck(deq)
|
||||||
result = deq.data[deq.head]
|
result = deq.data[deq.head]
|
||||||
|
|
||||||
proc peekLast*[T](deq: Deque[T]): T {.inline.} =
|
proc peekLast*[T](deq: Deque[T]): lent T {.inline.} =
|
||||||
## Returns the last element of `deq`, but does not remove it from the deque.
|
## Returns the last element of `deq`, but does not remove it from the deque.
|
||||||
##
|
##
|
||||||
## **See also:**
|
## **See also:**
|
||||||
|
|
|
||||||
|
|
@ -1,8 +1,11 @@
|
||||||
discard """
|
discard """
|
||||||
targets: "c js"
|
matrix: "--gc:refc; --gc:orc"
|
||||||
|
targets: "c cpp js"
|
||||||
"""
|
"""
|
||||||
|
|
||||||
import std/deques
|
import std/deques
|
||||||
|
from std/sequtils import toSeq
|
||||||
|
|
||||||
|
|
||||||
block:
|
block:
|
||||||
proc index(self: Deque[int], idx: Natural): int =
|
proc index(self: Deque[int], idx: Natural): int =
|
||||||
|
|
@ -125,7 +128,7 @@ block:
|
||||||
foo(1, 5)
|
foo(1, 5)
|
||||||
foo(3, 2)
|
foo(3, 2)
|
||||||
|
|
||||||
import sets
|
import std/sets
|
||||||
|
|
||||||
block t13310:
|
block t13310:
|
||||||
proc main() =
|
proc main() =
|
||||||
|
|
@ -137,3 +140,49 @@ block t13310:
|
||||||
|
|
||||||
static:
|
static:
|
||||||
main()
|
main()
|
||||||
|
|
||||||
|
|
||||||
|
proc main() =
|
||||||
|
block:
|
||||||
|
let a = [10, 20, 30].toDeque
|
||||||
|
doAssert toSeq(a.pairs) == @[(0, 10), (1, 20), (2, 30)]
|
||||||
|
|
||||||
|
block:
|
||||||
|
let q = [7, 9].toDeque
|
||||||
|
doAssert 7 in q
|
||||||
|
doAssert q.contains(7)
|
||||||
|
doAssert 8 notin q
|
||||||
|
|
||||||
|
block:
|
||||||
|
let a = [10, 20, 30, 40, 50].toDeque
|
||||||
|
doAssert $a == "[10, 20, 30, 40, 50]"
|
||||||
|
doAssert a.peekFirst == 10
|
||||||
|
doAssert len(a) == 5
|
||||||
|
|
||||||
|
block:
|
||||||
|
let a = [10, 20, 30, 40, 50].toDeque
|
||||||
|
doAssert $a == "[10, 20, 30, 40, 50]"
|
||||||
|
doAssert a.peekLast == 50
|
||||||
|
doAssert len(a) == 5
|
||||||
|
|
||||||
|
block:
|
||||||
|
var a = [10, 20, 30, 40, 50].toDeque
|
||||||
|
doAssert $a == "[10, 20, 30, 40, 50]"
|
||||||
|
doAssert a.popFirst == 10
|
||||||
|
doAssert $a == "[20, 30, 40, 50]"
|
||||||
|
|
||||||
|
block:
|
||||||
|
var a = [10, 20, 30, 40, 50].toDeque
|
||||||
|
doAssert $a == "[10, 20, 30, 40, 50]"
|
||||||
|
doAssert a.popLast == 50
|
||||||
|
doAssert $a == "[10, 20, 30, 40]"
|
||||||
|
|
||||||
|
block:
|
||||||
|
var a = [10, 20, 30, 40, 50].toDeque
|
||||||
|
doAssert $a == "[10, 20, 30, 40, 50]"
|
||||||
|
clear(a)
|
||||||
|
doAssert len(a) == 0
|
||||||
|
|
||||||
|
|
||||||
|
static: main()
|
||||||
|
main()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue