From 4dfefba043b5e90110fd61a9926cd120018d40f5 Mon Sep 17 00:00:00 2001 From: Nocturn9x Date: Mon, 14 Mar 2022 12:04:12 +0100 Subject: [PATCH] Added insert() and related tests (+ more length checks) --- src/nimdeque.nim | 17 +++++++++++++-- src/private/queues/linked.nim | 31 +++++++++++++++++++++++++--- tests/linked.nim | 39 +++++++++++++++++++++++++++++++++-- 3 files changed, 80 insertions(+), 7 deletions(-) diff --git a/src/nimdeque.nim b/src/nimdeque.nim index ceafac2..0a930fe 100644 --- a/src/nimdeque.nim +++ b/src/nimdeque.nim @@ -14,6 +14,19 @@ import private/queues/linked - +# Exports linked queue stuff export newLinkedDeque -export LinkedDeque \ No newline at end of file +export LinkedDeque +export add +export addLeft +export contains +export items +export reversed +export len +export linked.high +export pop +export `[]` +export `[]=` +export pairs +export linked.`$` +export insert \ No newline at end of file diff --git a/src/private/queues/linked.nim b/src/private/queues/linked.nim index 116afca..29d6d7c 100644 --- a/src/private/queues/linked.nim +++ b/src/private/queues/linked.nim @@ -70,7 +70,7 @@ proc addLeft*[T](self: LinkedDeque[T], val: T) = self.head.next = head head.prev = node inc(self.size) - + proc len*[T](self: LinkedDeque[T]): int = ## Returns the length of the deque. @@ -111,7 +111,32 @@ proc getNode[T](self: LinkedDeque[T], i: int): DequeNode[T] = while pos > i: result = result.prev dec(pos) - + + + +proc insert*[T](self: LinkedDeque[T], pos: int, val: T) = + ## Inserts the given value at the given + ## position. When pos equals 0 or self.high(), + ## this proc is equivalent to addLeft and add + ## respectively. In all other cases, all items + ## are "shifted" by 1 (shifted is in quotes because + ## no shifting actually occurs, but the result is + ## the same). The operation takes constant time + if pos == 0: + self.addLeft(val) + elif pos == self.high(): + self.add(val) + else: + var node = self.getNode(pos) + var prev: DequeNode[T] = node.prev + var newNode = newDequeNode(val) + node.prev = newNode + prev.next = newNode + newNode.next = node + newNode.prev = prev + inc(self.size) + + proc `[]`*[T](self: LinkedDeque[T], i: int): T = ## Implements indexing into the queue @@ -187,6 +212,6 @@ proc `$`*[T](self: LinkedDeque[T]): string = result = "deque([" for i, item in self: result &= $item - if i < self.high(): + if i < self.len(): result &= ", " result &= "])" \ No newline at end of file diff --git a/tests/linked.nim b/tests/linked.nim index 9d1ad88..126d2db 100644 --- a/tests/linked.nim +++ b/tests/linked.nim @@ -16,11 +16,13 @@ import ../src/nimdeque when isMainModule: - const size = 10000 + const size = 1000 var deque = newLinkedDeque[int]() echo &"Generating {size} values" for i in countup(0, size, 1): deque.add(i) + echo "Checking length" + doAssert deque.len() == size + 1 echo "Checking iteration" for i in countup(0, size, 1): doAssert deque[i] == i @@ -29,8 +31,12 @@ when isMainModule: doAssert i in deque echo "Popping off the head" doAssert deque.pop() == 0 + echo "Checking length" + doAssert deque.len() == size echo "Popping off the tail" doAssert deque.pop(deque.high()) == size + echo "Checking length" + doAssert deque.len() == size - 1 echo "Checking new head" doAssert deque[0] == 1 echo "Checking new tail" @@ -38,11 +44,40 @@ when isMainModule: echo "Re-checking values" for i in countup(0, size - 2, 1): doAssert deque[i] == i + 1 - echo "Appending value at the beginning" + echo "Checking addLeft" deque.addLeft(0) + echo "Checking length" + doAssert deque.len() == size echo "Re-checking head" doAssert deque[0] == 0 echo "Re-checking values" for i in countup(0, size - 1, 1): doAssert deque[i] == i + echo "Checking insert(3)" + var oldLen = deque.len() + deque.insert(3, 69420) + echo "Checking length" + doAssert oldLen + 1 == deque.len() + echo "Checking inserted value" + doAssert deque.pop(3) == 69420 + echo "Checking length" + doAssert deque.len() == oldLen + echo &"Checking insert({size - 2})" + oldLen = deque.len() + deque.insert(size - 2, 0x42362) + echo "Checking length" + doAssert oldLen + 1 == deque.len() + echo "Checking inserted value" + doAssert deque.pop(size - 2) == 0x42362 + echo "Checking length" + doAssert deque.len() == oldLen + echo &"Checking insert({size div 2})" + oldLen = deque.len() + deque.insert(size div 2, 0xf7102) + echo "Checking length" + doAssert oldLen + 1 == deque.len() + echo "Checking inserted value" + doAssert deque.pop(size div 2) == 0xf7102 + echo "Checking length" + doAssert deque.len() == oldLen echo "All tests passed!"