Added insert() and related tests (+ more length checks)
This commit is contained in:
parent
178af73fc9
commit
4dfefba043
|
@ -14,6 +14,19 @@
|
||||||
import private/queues/linked
|
import private/queues/linked
|
||||||
|
|
||||||
|
|
||||||
|
# Exports linked queue stuff
|
||||||
export newLinkedDeque
|
export newLinkedDeque
|
||||||
export LinkedDeque
|
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
|
|
@ -70,7 +70,7 @@ proc addLeft*[T](self: LinkedDeque[T], val: T) =
|
||||||
self.head.next = head
|
self.head.next = head
|
||||||
head.prev = node
|
head.prev = node
|
||||||
inc(self.size)
|
inc(self.size)
|
||||||
|
|
||||||
|
|
||||||
proc len*[T](self: LinkedDeque[T]): int =
|
proc len*[T](self: LinkedDeque[T]): int =
|
||||||
## Returns the length of the deque.
|
## Returns the length of the deque.
|
||||||
|
@ -111,7 +111,32 @@ proc getNode[T](self: LinkedDeque[T], i: int): DequeNode[T] =
|
||||||
while pos > i:
|
while pos > i:
|
||||||
result = result.prev
|
result = result.prev
|
||||||
dec(pos)
|
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 =
|
proc `[]`*[T](self: LinkedDeque[T], i: int): T =
|
||||||
## Implements indexing into the queue
|
## Implements indexing into the queue
|
||||||
|
@ -187,6 +212,6 @@ proc `$`*[T](self: LinkedDeque[T]): string =
|
||||||
result = "deque(["
|
result = "deque(["
|
||||||
for i, item in self:
|
for i, item in self:
|
||||||
result &= $item
|
result &= $item
|
||||||
if i < self.high():
|
if i < self.len():
|
||||||
result &= ", "
|
result &= ", "
|
||||||
result &= "])"
|
result &= "])"
|
|
@ -16,11 +16,13 @@ import ../src/nimdeque
|
||||||
|
|
||||||
|
|
||||||
when isMainModule:
|
when isMainModule:
|
||||||
const size = 10000
|
const size = 1000
|
||||||
var deque = newLinkedDeque[int]()
|
var deque = newLinkedDeque[int]()
|
||||||
echo &"Generating {size} values"
|
echo &"Generating {size} values"
|
||||||
for i in countup(0, size, 1):
|
for i in countup(0, size, 1):
|
||||||
deque.add(i)
|
deque.add(i)
|
||||||
|
echo "Checking length"
|
||||||
|
doAssert deque.len() == size + 1
|
||||||
echo "Checking iteration"
|
echo "Checking iteration"
|
||||||
for i in countup(0, size, 1):
|
for i in countup(0, size, 1):
|
||||||
doAssert deque[i] == i
|
doAssert deque[i] == i
|
||||||
|
@ -29,8 +31,12 @@ when isMainModule:
|
||||||
doAssert i in deque
|
doAssert i in deque
|
||||||
echo "Popping off the head"
|
echo "Popping off the head"
|
||||||
doAssert deque.pop() == 0
|
doAssert deque.pop() == 0
|
||||||
|
echo "Checking length"
|
||||||
|
doAssert deque.len() == size
|
||||||
echo "Popping off the tail"
|
echo "Popping off the tail"
|
||||||
doAssert deque.pop(deque.high()) == size
|
doAssert deque.pop(deque.high()) == size
|
||||||
|
echo "Checking length"
|
||||||
|
doAssert deque.len() == size - 1
|
||||||
echo "Checking new head"
|
echo "Checking new head"
|
||||||
doAssert deque[0] == 1
|
doAssert deque[0] == 1
|
||||||
echo "Checking new tail"
|
echo "Checking new tail"
|
||||||
|
@ -38,11 +44,40 @@ when isMainModule:
|
||||||
echo "Re-checking values"
|
echo "Re-checking values"
|
||||||
for i in countup(0, size - 2, 1):
|
for i in countup(0, size - 2, 1):
|
||||||
doAssert deque[i] == i + 1
|
doAssert deque[i] == i + 1
|
||||||
echo "Appending value at the beginning"
|
echo "Checking addLeft"
|
||||||
deque.addLeft(0)
|
deque.addLeft(0)
|
||||||
|
echo "Checking length"
|
||||||
|
doAssert deque.len() == size
|
||||||
echo "Re-checking head"
|
echo "Re-checking head"
|
||||||
doAssert deque[0] == 0
|
doAssert deque[0] == 0
|
||||||
echo "Re-checking values"
|
echo "Re-checking values"
|
||||||
for i in countup(0, size - 1, 1):
|
for i in countup(0, size - 1, 1):
|
||||||
doAssert deque[i] == i
|
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!"
|
echo "All tests passed!"
|
||||||
|
|
Loading…
Reference in New Issue