Skip to content

Commit

Permalink
fixes nim-lang#23275; Add == for Deque (nim-lang#23276)
Browse files Browse the repository at this point in the history
  • Loading branch information
demotomohiro authored Feb 8, 2024
1 parent 4b67ccc commit befb383
Show file tree
Hide file tree
Showing 2 changed files with 77 additions and 1 deletion.
29 changes: 28 additions & 1 deletion lib/pure/collections/deques.nim
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ runnableExamples:

import std/private/since

import std/math
import std/[hashes, math]

type
Deque*[T] = object
Expand Down Expand Up @@ -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
49 changes: 49 additions & 0 deletions tests/stdlib/tdeques.nim
Original file line number Diff line number Diff line change
Expand Up @@ -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()

0 comments on commit befb383

Please sign in to comment.