Added find() procedure

This commit is contained in:
Nocturn9x 2022-03-16 13:31:29 +01:00
parent b90a38298f
commit a3bcbc36e3
2 changed files with 26 additions and 16 deletions

View File

@ -36,4 +36,5 @@ export reversedPairs
export clear export clear
export clearPop export clearPop
export extendLeft export extendLeft
export maxSize export maxSize
export find

View File

@ -80,7 +80,7 @@ proc maxSize*[T](self: LinkedDeque[T]): int =
result = self.maxSize result = self.maxSize
proc getNode[T](self: LinkedDeque[T], i: int): DequeNode[T] = proc getNode[T](self: LinkedDeque[T], i: int): DequeNode[T] {.raises: IndexDefect.} =
## Low level method for indexing and getting ## Low level method for indexing and getting
## a node object back ## a node object back
if self.high() == -1: if self.high() == -1:
@ -108,30 +108,30 @@ proc getNode[T](self: LinkedDeque[T], i: int): DequeNode[T] =
dec(pos) dec(pos)
proc `[]`*[T](self: LinkedDeque[T], i: int): T = proc `[]`*[T](self: LinkedDeque[T], i: int): T {.raises: IndexDefect.} =
## Implements indexing into the queue ## Implements indexing into the queue
result = self.getNode(i).val result = self.getNode(i).val
proc `[]=`*[T](self: LinkedDeque[T], i: int, val: T) = proc `[]=`*[T](self: LinkedDeque[T], i: int, val: T) {.raises: IndexDefect.} =
## Sets element at position i ## Sets element at position i
## to the given value ## to the given value
self[i].val = val self[i].val = val
proc `[]`*[T](self: LinkedDeque[T], i: BackwardsIndex): T = proc `[]`*[T](self: LinkedDeque[T], i: BackwardsIndex): T {.raises: IndexDefect.} =
## Implements indexing into the queue ## Implements indexing into the queue
## with backwards indeces ## with backwards indeces
result = self[self.size - int(i)] result = self[self.size - int(i)]
proc `[]=`*[T](self: LinkedDeque[T], i: BackwardsIndex, val: T) = proc `[]=`*[T](self: LinkedDeque[T], i: BackwardsIndex, val: T) {.raises: IndexDefect.} =
## Sets element at backwards ## Sets element at backwards
## position i to the given value ## position i to the given value
self[self.size - int(i)] = val self[self.size - int(i)] = val
proc pop*[T](self: LinkedDeque[T], pos: int = 0): T = proc pop*[T](self: LinkedDeque[T], pos: int = 0): T {.raises: IndexDefect.} =
## Pops an element off the deque ## Pops an element off the deque
## at the given index (default 0). ## at the given index (default 0).
## The queue is optimized for popping ## The queue is optimized for popping
@ -155,7 +155,7 @@ proc pop*[T](self: LinkedDeque[T], pos: int = 0): T =
dec(self.size) dec(self.size)
proc pop*[T](self: LinkedDeque[T], pos: BackwardsIndex): T = proc pop*[T](self: LinkedDeque[T], pos: BackwardsIndex): T {.raises: IndexDefect.} =
## Same as self.pop but for backwards indeces ## Same as self.pop but for backwards indeces
result = self.pop(self.size - int(pos)) result = self.pop(self.size - int(pos))
@ -207,17 +207,16 @@ proc addLeft*[T](self: LinkedDeque[T], val: T) =
inc(self.size) inc(self.size)
proc insert*[T](self: LinkedDeque[T], pos: int, val: T) = proc insert*[T](self: LinkedDeque[T], pos: int, val: T) {.raises: IndexDefect.} =
## Inserts the given value at the given ## Inserts the given value at the given
## position. When pos equals 0, this proc is equivalent ## position. When pos equals 0, this proc is equivalent
## to addLeft. In all other cases, all items are ## to addLeft. In all other cases, all items are
## "shifted" by 1 (shifted is in quotes because ## "shifted" by 1 (this is not actually what happens,
## no shifting actually occurs, but the result is ## but the result is analogous). The operation takes
## the same). The operation takes constant time at ## constant time at the ends, but the complexity grows
## the ends, but the complexity grows to O(n) the closer ## to O(n) the closer the index gets to the middle of
## the index gets to the middle of the deque. This ## the deque. This proc raises an IndexDefect if the
## proc raises an IndexDefect if the queue's max ## queue's max size is reached
## size is reached
if self.maxSize > 0 and self.size == self.maxSize: if self.maxSize > 0 and self.size == self.maxSize:
raise newException(IndexDefect, &"LinkedDeque has reached its maximum size ({self.maxSize})") raise newException(IndexDefect, &"LinkedDeque has reached its maximum size ({self.maxSize})")
if pos == 0: if pos == 0:
@ -315,6 +314,16 @@ proc extendLeft*[T](self: LinkedDeque[T], other: seq[T]) =
self.addLeft(item) self.addLeft(item)
proc find*[T](self: LinkedDeque[T], val: T): int =
## Returns the first occurrence
## of val in the queue. Returns -1
## if the item isn't found
for i, item in self:
if item == val:
return i
return -1
proc `$`*[T](self: LinkedDeque[T]): string = proc `$`*[T](self: LinkedDeque[T]): string =
## Returns a string representation ## Returns a string representation
## of the deque ## of the deque