diff options
author | flywind <43030857+xflywind@users.noreply.github.com> | 2020-11-22 04:30:04 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-11-21 12:30:04 -0800 |
commit | c9371ef59dc1c0b1037e0798dae8f0a90661db5d (patch) | |
tree | 912d6a5d6ce59d67e682c638e7a0a14cef356da6 | |
parent | 3040f0550534848f61aa87d42e195e3fb5a70262 (diff) | |
download | Nim-c9371ef59dc1c0b1037e0798dae8f0a90661db5d.tar.gz |
deques minor improvement (#16084)
-rw-r--r-- | lib/pure/collections/deques.nim | 147 | ||||
-rw-r--r-- | tests/stdlib/tdeque.nim | 111 |
2 files changed, 129 insertions, 129 deletions
diff --git a/lib/pure/collections/deques.nim b/lib/pure/collections/deques.nim index c3eeb3156..6df34bd3a 100644 --- a/lib/pure/collections/deques.nim +++ b/lib/pure/collections/deques.nim @@ -77,7 +77,7 @@ template checkIfInitialized(deq: typed) = initImpl(deq, defaultInitialSize) proc initDeque*[T](initialSize: int = 4): Deque[T] = - ## Create a new empty deque. + ## Creates a new empty deque. ## ## Optionally, the initial capacity can be reserved via `initialSize` ## as a performance optimization. @@ -103,7 +103,7 @@ proc toDeque*[T](x: openArray[T]): Deque[T] {.since: (1, 3).} = result.addLast(item) proc len*[T](deq: Deque[T]): int {.inline.} = - ## Return the number of elements of `deq`. + ## Returns the number of elements of `deq`. result = deq.count template emptyCheck(deq) = @@ -123,7 +123,7 @@ template xBoundsCheck(deq, i) = "Out of bounds: " & $i & " < 0") proc `[]`*[T](deq: Deque[T], i: Natural): T {.inline.} = - ## Access the i-th element of `deq`. + ## Accesses the i-th element of `deq`. runnableExamples: var a = initDeque[int]() for i in 1 .. 5: @@ -136,7 +136,7 @@ proc `[]`*[T](deq: Deque[T], i: Natural): T {.inline.} = return deq.data[(deq.head + i) and deq.mask] proc `[]`*[T](deq: var Deque[T], i: Natural): var T {.inline.} = - ## Access the i-th element of `deq` and return a mutable + ## Accesses the i-th element of `deq` and return a mutable ## reference to it. runnableExamples: var a = initDeque[int]() @@ -150,7 +150,7 @@ proc `[]`*[T](deq: var Deque[T], i: Natural): var T {.inline.} = return deq.data[(deq.head + i) and deq.mask] proc `[]=`*[T](deq: var Deque[T], i: Natural, val: T) {.inline.} = - ## Change the i-th element of `deq`. + ## Changes the i-th element of `deq`. runnableExamples: var a = initDeque[int]() for i in 1 .. 5: @@ -164,7 +164,7 @@ proc `[]=`*[T](deq: var Deque[T], i: Natural, val: T) {.inline.} = deq.data[(deq.head + i) and deq.mask] = val proc `[]`*[T](deq: Deque[T], i: BackwardsIndex): T {.inline.} = - ## Access the backwards indexed i-th element. + ## Accesses the backwards indexed i-th element. ## ## `deq[^1]` is the last element. runnableExamples: @@ -179,7 +179,7 @@ proc `[]`*[T](deq: Deque[T], i: BackwardsIndex): T {.inline.} = return deq[deq.len - int(i)] proc `[]`*[T](deq: var Deque[T], i: BackwardsIndex): var T {.inline.} = - ## Access the backwards indexed i-th element. + ## Accesses the backwards indexed i-th element. ## ## `deq[^1]` is the last element. runnableExamples: @@ -194,7 +194,7 @@ proc `[]`*[T](deq: var Deque[T], i: BackwardsIndex): var T {.inline.} = return deq[deq.len - int(i)] proc `[]=`*[T](deq: var Deque[T], i: BackwardsIndex, x: T) {.inline.} = - ## Change the backwards indexed i-th element. + ## Changes the backwards indexed i-th element. ## ## `deq[^1]` is the last element. runnableExamples: @@ -210,7 +210,7 @@ proc `[]=`*[T](deq: var Deque[T], i: BackwardsIndex, x: T) {.inline.} = deq[deq.len - int(i)] = x iterator items*[T](deq: Deque[T]): T = - ## Yield every element of `deq`. + ## Yields every element of `deq`. ## ## **Examples:** ## @@ -232,7 +232,7 @@ iterator items*[T](deq: Deque[T]): T = i = (i + 1) and deq.mask iterator mitems*[T](deq: var Deque[T]): var T = - ## Yield every element of `deq`, which can be modified. + ## Yields every element of `deq`, which can be modified. runnableExamples: var a = initDeque[int]() for i in 1 .. 5: @@ -248,7 +248,7 @@ iterator mitems*[T](deq: var Deque[T]): var T = i = (i + 1) and deq.mask iterator pairs*[T](deq: Deque[T]): tuple[key: int, val: T] = - ## Yield every (position, value) of `deq`. + ## Yields every (position, value) of `deq`. ## ## **Examples:** ## @@ -270,7 +270,7 @@ iterator pairs*[T](deq: Deque[T]): tuple[key: int, val: T] = i = (i + 1) and deq.mask proc contains*[T](deq: Deque[T], item: T): bool {.inline.} = - ## Return true if `item` is in `deq` or false if not found. + ## Returns true if `item` is in `deq` or false if not found. ## ## Usually used via the ``in`` operator. ## It is the equivalent of ``deq.find(item) >= 0``. @@ -298,7 +298,7 @@ proc expandIfNeeded[T](deq: var Deque[T]) = deq.head = 0 proc addFirst*[T](deq: var Deque[T], item: T) = - ## Add an `item` to the beginning of the `deq`. + ## Adds an `item` to the beginning of the `deq`. ## ## See also: ## * `addLast proc <#addLast,Deque[T],T>`_ @@ -318,7 +318,7 @@ proc addFirst*[T](deq: var Deque[T], item: T) = deq.data[deq.head] = item proc addLast*[T](deq: var Deque[T], item: T) = - ## Add an `item` to the end of the `deq`. + ## Adds an `item` to the end of the `deq`. ## ## See also: ## * `addFirst proc <#addFirst,Deque[T],T>`_ @@ -421,7 +421,7 @@ template destroy(x: untyped) = reset(x) proc popFirst*[T](deq: var Deque[T]): T {.inline, discardable.} = - ## Remove and returns the first element of the `deq`. + ## Removes and returns the first element of the `deq`. ## ## See also: ## * `addFirst proc <#addFirst,Deque[T],T>`_ @@ -446,7 +446,7 @@ proc popFirst*[T](deq: var Deque[T]): T {.inline, discardable.} = deq.head = (deq.head + 1) and deq.mask proc popLast*[T](deq: var Deque[T]): T {.inline, discardable.} = - ## Remove and returns the last element of the `deq`. + ## Removes and returns the last element of the `deq`. ## ## See also: ## * `addFirst proc <#addFirst,Deque[T],T>`_ @@ -489,7 +489,7 @@ proc clear*[T](deq: var Deque[T]) {.inline.} = deq.tail = deq.head proc shrink*[T](deq: var Deque[T], fromFirst = 0, fromLast = 0) = - ## Remove `fromFirst` elements from the front of the deque and + ## Removes `fromFirst` elements from the front of the deque and ## `fromLast` elements from the back. ## ## If the supplied number of elements exceeds the total number of elements @@ -520,120 +520,9 @@ proc shrink*[T](deq: var Deque[T], fromFirst = 0, fromLast = 0) = dec deq.count, fromFirst + fromLast proc `$`*[T](deq: Deque[T]): string = - ## Turn a deque into its string representation. + ## Turns a deque into its string representation. result = "[" for x in deq: if result.len > 1: result.add(", ") result.addQuoted(x) result.add("]") - - - -when isMainModule: - var deq = initDeque[int](1) - deq.addLast(4) - deq.addFirst(9) - deq.addFirst(123) - var first = deq.popFirst() - deq.addLast(56) - assert(deq.peekLast() == 56) - deq.addLast(6) - assert(deq.peekLast() == 6) - var second = deq.popFirst() - deq.addLast(789) - assert(deq.peekLast() == 789) - - assert first == 123 - assert second == 9 - assert($deq == "[4, 56, 6, 789]") - assert deq == [4, 56, 6, 789].toDeque - - assert deq[0] == deq.peekFirst and deq.peekFirst == 4 - #assert deq[^1] == deq.peekLast and deq.peekLast == 789 - deq[0] = 42 - deq[deq.len - 1] = 7 - - assert 6 in deq and 789 notin deq - assert deq.find(6) >= 0 - assert deq.find(789) < 0 - - block: - var d = initDeque[int](1) - d.addLast 7 - d.addLast 8 - d.addLast 10 - d.addFirst 5 - d.addFirst 2 - d.addFirst 1 - d.addLast 20 - d.shrink(fromLast = 2) - doAssert($d == "[1, 2, 5, 7, 8]") - d.shrink(2, 1) - doAssert($d == "[5, 7]") - d.shrink(2, 2) - doAssert d.len == 0 - - for i in -2 .. 10: - if i in deq: - assert deq.contains(i) and deq.find(i) >= 0 - else: - assert(not deq.contains(i) and deq.find(i) < 0) - - when compileOption("boundChecks"): - try: - echo deq[99] - assert false - except IndexDefect: - discard - - try: - assert deq.len == 4 - for i in 0 ..< 5: deq.popFirst() - assert false - except IndexDefect: - discard - - # grabs some types of resize error. - deq = initDeque[int]() - for i in 1 .. 4: deq.addLast i - deq.popFirst() - deq.popLast() - for i in 5 .. 8: deq.addFirst i - assert $deq == "[8, 7, 6, 5, 2, 3]" - - # Similar to proc from the documentation example - proc foo(a, b: Positive) = # assume random positive values for `a` and `b`. - var deq = initDeque[int]() - assert deq.len == 0 - for i in 1 .. a: deq.addLast i - - if b < deq.len: # checking before indexed access. - assert deq[b] == b + 1 - - # The following two lines don't need any checking on access due to the logic - # of the program, but that would not be the case if `a` could be 0. - assert deq.peekFirst == 1 - assert deq.peekLast == a - - while deq.len > 0: # checking if the deque is empty - assert deq.popFirst() > 0 - - #foo(0,0) - foo(8, 5) - foo(10, 9) - foo(1, 1) - foo(2, 1) - foo(1, 5) - foo(3, 2) - - import sets - block t13310: - proc main() = - var q = initDeque[HashSet[int16]](2) - q.addFirst([1'i16].toHashSet) - q.addFirst([2'i16].toHashSet) - q.addFirst([3'i16].toHashSet) - assert $q == "[{3}, {2}, {1}]" - - static: - main() diff --git a/tests/stdlib/tdeque.nim b/tests/stdlib/tdeque.nim new file mode 100644 index 000000000..50e5d0ab1 --- /dev/null +++ b/tests/stdlib/tdeque.nim @@ -0,0 +1,111 @@ +import deques + + +var deq = initDeque[int](1) +deq.addLast(4) +deq.addFirst(9) +deq.addFirst(123) +var first = deq.popFirst() +deq.addLast(56) +assert(deq.peekLast() == 56) +deq.addLast(6) +assert(deq.peekLast() == 6) +var second = deq.popFirst() +deq.addLast(789) +assert(deq.peekLast() == 789) + +assert first == 123 +assert second == 9 +assert($deq == "[4, 56, 6, 789]") +assert deq == [4, 56, 6, 789].toDeque + +assert deq[0] == deq.peekFirst and deq.peekFirst == 4 +#assert deq[^1] == deq.peekLast and deq.peekLast == 789 +deq[0] = 42 +deq[deq.len - 1] = 7 + +assert 6 in deq and 789 notin deq +assert deq.find(6) >= 0 +assert deq.find(789) < 0 + +block: + var d = initDeque[int](1) + d.addLast 7 + d.addLast 8 + d.addLast 10 + d.addFirst 5 + d.addFirst 2 + d.addFirst 1 + d.addLast 20 + d.shrink(fromLast = 2) + doAssert($d == "[1, 2, 5, 7, 8]") + d.shrink(2, 1) + doAssert($d == "[5, 7]") + d.shrink(2, 2) + doAssert d.len == 0 + +for i in -2 .. 10: + if i in deq: + assert deq.contains(i) and deq.find(i) >= 0 + else: + assert(not deq.contains(i) and deq.find(i) < 0) + +when compileOption("boundChecks"): + try: + echo deq[99] + assert false + except IndexDefect: + discard + + try: + assert deq.len == 4 + for i in 0 ..< 5: deq.popFirst() + assert false + except IndexDefect: + discard + +# grabs some types of resize error. +deq = initDeque[int]() +for i in 1 .. 4: deq.addLast i +deq.popFirst() +deq.popLast() +for i in 5 .. 8: deq.addFirst i +assert $deq == "[8, 7, 6, 5, 2, 3]" + +# Similar to proc from the documentation example +proc foo(a, b: Positive) = # assume random positive values for `a` and `b`. + var deq = initDeque[int]() + assert deq.len == 0 + for i in 1 .. a: deq.addLast i + + if b < deq.len: # checking before indexed access. + assert deq[b] == b + 1 + + # The following two lines don't need any checking on access due to the logic + # of the program, but that would not be the case if `a` could be 0. + assert deq.peekFirst == 1 + assert deq.peekLast == a + + while deq.len > 0: # checking if the deque is empty + assert deq.popFirst() > 0 + +#foo(0,0) +foo(8, 5) +foo(10, 9) +foo(1, 1) +foo(2, 1) +foo(1, 5) +foo(3, 2) + +import sets + +block t13310: + proc main() = + var q = initDeque[HashSet[int16]](2) + q.addFirst([1'i16].toHashSet) + q.addFirst([2'i16].toHashSet) + q.addFirst([3'i16].toHashSet) + assert $q == "[{3}, {2}, {1}]" + + static: + main() |