mirror of
https://github.com/nim-lang/Nim.git
synced 2025-12-28 17:04:41 +00:00
@@ -50,7 +50,7 @@ runnableExamples:
|
||||
|
||||
import std/private/since
|
||||
|
||||
import std/math
|
||||
import std/[hashes, math]
|
||||
|
||||
type
|
||||
Deque*[T] = object
|
||||
@@ -455,3 +455,30 @@ proc `$`*[T](deq: Deque[T]): string =
|
||||
if result.len > 1: result.add(", ")
|
||||
result.addQuoted(x)
|
||||
result.add("]")
|
||||
|
||||
func `==`*[T](deq1, deq2: Deque[T]): bool =
|
||||
## The `==` operator for Deque.
|
||||
## Returns `true` if both deques contains the same values in the same order.
|
||||
runnableExamples:
|
||||
var a, b = initDeque[int]()
|
||||
a.addFirst(2)
|
||||
a.addFirst(1)
|
||||
b.addLast(1)
|
||||
b.addLast(2)
|
||||
doAssert a == b
|
||||
|
||||
if deq1.count != deq2.count:
|
||||
return false
|
||||
|
||||
for i in 0 ..< deq1.count:
|
||||
if deq1.data[(deq1.head + i) and deq1.mask] != deq2.data[(deq2.head + i) and deq2.mask]:
|
||||
return false
|
||||
|
||||
true
|
||||
|
||||
func hash*[T](deq: Deque[T]): Hash =
|
||||
## Hashing of Deque.
|
||||
var h: Hash = 0
|
||||
for x in deq:
|
||||
h = h !& hash(x)
|
||||
!$h
|
||||
|
||||
@@ -189,6 +189,55 @@ proc main() =
|
||||
a.shrink(fromFirst = 0, fromLast = 1)
|
||||
doAssert $a == "[10, 20, 30]"
|
||||
|
||||
block:
|
||||
var a, b: Deque[int]
|
||||
for i in 1 .. 256:
|
||||
a.addLast(i)
|
||||
for i in 1 .. 255:
|
||||
a.popLast
|
||||
b.addLast(1)
|
||||
doAssert a == b
|
||||
|
||||
block:
|
||||
# Issue 23275
|
||||
# Test `==`.
|
||||
block:
|
||||
var a, b = initDeque[int]()
|
||||
doAssert a == b
|
||||
doAssert a.hash == b.hash
|
||||
a.addFirst(1)
|
||||
doAssert a != b
|
||||
doAssert a.hash != b.hash
|
||||
b.addLast(1)
|
||||
doAssert a == b
|
||||
doAssert a.hash == b.hash
|
||||
a.popFirst
|
||||
b.popLast
|
||||
doAssert a == b
|
||||
doAssert a.hash == b.hash
|
||||
a.addLast 2
|
||||
doAssert a != b
|
||||
doAssert a.hash != b.hash
|
||||
b.addFirst 2
|
||||
doAssert a == b
|
||||
doAssert a.hash == b.hash
|
||||
|
||||
block:
|
||||
var a, b = initDeque[int]()
|
||||
for i in countDown(100, 1):
|
||||
a.addFirst(i)
|
||||
for i in 1..100:
|
||||
b.addLast(i)
|
||||
doAssert a == b
|
||||
for i in 1..99:
|
||||
a.popLast
|
||||
let a1 = [1].toDeque
|
||||
doAssert a == a1
|
||||
doAssert a.hash == a1.hash
|
||||
var c = initDeque[int]()
|
||||
c.addLast(1)
|
||||
doAssert a == c
|
||||
doAssert a.hash == c.hash
|
||||
|
||||
static: main()
|
||||
main()
|
||||
|
||||
Reference in New Issue
Block a user