From bb3b2ca1ce5e3e6e70654aa6b9b504e20ea03a37 Mon Sep 17 00:00:00 2001 From: HossamSaberr Date: Wed, 11 Mar 2026 14:34:27 +0200 Subject: [PATCH 1/5] Fix: Implement = and hash --- .../CTQueueTest.class.st | 51 ++++++++++++------- src/Containers-Queue/CTQueue.class.st | 21 +++++++- 2 files changed, 51 insertions(+), 21 deletions(-) diff --git a/src/Containers-Queue-Tests/CTQueueTest.class.st b/src/Containers-Queue-Tests/CTQueueTest.class.st index 702a3be..4f993bc 100644 --- a/src/Containers-Queue-Tests/CTQueueTest.class.st +++ b/src/Containers-Queue-Tests/CTQueueTest.class.st @@ -268,6 +268,38 @@ CTQueueTest >> testEnqueueSingleElement [ self assert: queue front equals: 'first' ] +{ #category : 'tests' } +CTQueueTest >> testEnqueueUnless [ + queue enqueue: 1 unless: [ :v | (v rem: 2) = 0]. + self assert: (queue includes: 1). + self assert: queue size equals: 1 . + queue enqueue: 2 unless: [ :v | (v rem: 2) = 0]. + self assert: (queue includes: 1). + self assert: (queue includes: 2) . + self assert: queue size equals: 2 . + queue enqueue: 4 unless: [ :v | (v rem: 2) = 0]. + self assert: (queue includes: 1). + self assert: (queue includes: 2) . + self assert: queue size equals: 2 . + queue enqueue: 3 unless: [ :v | (v rem: 2) = 0]. + self assert: (queue includes: 1). + self assert: (queue includes: 2) . + self assert: queue size equals: 2 +] + +{ #category : 'tests' } +CTQueueTest >> testEquality [ + | q1 q2 | + q1 := CTQueue new. + q2 := CTQueue new. + + q1 enqueue: 'A'; enqueue: 'B'. + q2 enqueue: 'A'; enqueue: 'B'. + + self assert: q1 equals: q2. + self assert: q1 hash equals: q2 hash. +] + { #category : 'tests' } CTQueueTest >> testErrorHandling [ @@ -421,22 +453,3 @@ CTQueueTest >> testSize [ queue dequeue. self assert: queue size equals: 2 ] - -{ #category : 'tests' } -CTQueueTest >> testEnqueueUnless [ - queue enqueue: 1 unless: [ :v | (v rem: 2) = 0]. - self assert: (queue includes: 1). - self assert: queue size equals: 1 . - queue enqueue: 2 unless: [ :v | (v rem: 2) = 0]. - self assert: (queue includes: 1). - self assert: (queue includes: 2) . - self assert: queue size equals: 2 . - queue enqueue: 4 unless: [ :v | (v rem: 2) = 0]. - self assert: (queue includes: 1). - self assert: (queue includes: 2) . - self assert: queue size equals: 2 . - queue enqueue: 3 unless: [ :v | (v rem: 2) = 0]. - self assert: (queue includes: 1). - self assert: (queue includes: 2) . - self assert: queue size equals: 2 -] diff --git a/src/Containers-Queue/CTQueue.class.st b/src/Containers-Queue/CTQueue.class.st index d618aab..2af5c64 100644 --- a/src/Containers-Queue/CTQueue.class.st +++ b/src/Containers-Queue/CTQueue.class.st @@ -34,6 +34,15 @@ CTQueue class >> new: anInteger [ yourself ] +{ #category : 'comparing' } +CTQueue >> = anObject [ + + self == anObject ifTrue: [ ^ true ]. + self species == anObject species ifFalse: [ ^ false ]. + self size = anObject size ifFalse: [ ^ false ]. + ^ self asArray = anObject asArray +] + { #category : 'converting' } CTQueue >> asArray [ @@ -105,6 +114,7 @@ CTQueue >> enqueue: anObject [ size := size + 1. ^ self ] + { #category : 'adding' } CTQueue >> enqueue: anObject unless: thisTestIsTrue [ 1 to: self size do: [ :i | @@ -118,7 +128,6 @@ CTQueue >> enqueue: anObject unless: thisTestIsTrue [ ^ self ] - { #category : 'adding' } CTQueue >> enqueueAll: aCollection [ @@ -149,6 +158,15 @@ CTQueue >> grow [ rearIndex := size + 1 ] +{ #category : 'comparing' } +CTQueue >> hash [ + + | hashValue | + hashValue := self species hash. + self do: [ :each | hashValue := (hashValue + each hash) hashMultiply ]. + ^ hashValue +] + { #category : 'testing' } CTQueue >> includes: anElement [ @@ -230,4 +248,3 @@ CTQueue >> size [ ^ size ] - From 0ac1cc6dbd6cba24684ba0de391c8ae227fabd40 Mon Sep 17 00:00:00 2001 From: HossamSaberr Date: Wed, 11 Mar 2026 17:21:54 +0200 Subject: [PATCH 2/5] Refactor = method and split testEnqueueUnless tests --- .../CTQueueTest.class.st | 33 ++++++++++++------- src/Containers-Queue/CTQueue.class.st | 3 +- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/src/Containers-Queue-Tests/CTQueueTest.class.st b/src/Containers-Queue-Tests/CTQueueTest.class.st index 4f993bc..e3604a4 100644 --- a/src/Containers-Queue-Tests/CTQueueTest.class.st +++ b/src/Containers-Queue-Tests/CTQueueTest.class.st @@ -269,22 +269,31 @@ CTQueueTest >> testEnqueueSingleElement [ ] { #category : 'tests' } -CTQueueTest >> testEnqueueUnless [ - queue enqueue: 1 unless: [ :v | (v rem: 2) = 0]. +CTQueueTest >> testEnqueueUnlessAdds [ + queue enqueue: 1 unless: [ :v | (v rem: 2) = 0 ]. self assert: (queue includes: 1). - self assert: queue size equals: 1 . - queue enqueue: 2 unless: [ :v | (v rem: 2) = 0]. + self assert: queue size equals: 1. + + queue enqueue: 2 unless: [ :v | (v rem: 2) = 0 ]. self assert: (queue includes: 1). - self assert: (queue includes: 2) . - self assert: queue size equals: 2 . - queue enqueue: 4 unless: [ :v | (v rem: 2) = 0]. + self assert: (queue includes: 2). + self assert: queue size equals: 2. +] + +{ #category : 'tests' } +CTQueueTest >> testEnqueueUnlessIgnores [ + queue enqueue: 1 unless: [ :v | (v rem: 2) = 0 ]. + queue enqueue: 2 unless: [ :v | (v rem: 2) = 0 ]. + + queue enqueue: 4 unless: [ :v | (v rem: 2) = 0 ]. self assert: (queue includes: 1). - self assert: (queue includes: 2) . - self assert: queue size equals: 2 . - queue enqueue: 3 unless: [ :v | (v rem: 2) = 0]. + self assert: (queue includes: 2). + self assert: queue size equals: 2. + + queue enqueue: 3 unless: [ :v | (v rem: 2) = 0 ]. self assert: (queue includes: 1). - self assert: (queue includes: 2) . - self assert: queue size equals: 2 + self assert: (queue includes: 2). + self assert: queue size equals: 2. ] { #category : 'tests' } diff --git a/src/Containers-Queue/CTQueue.class.st b/src/Containers-Queue/CTQueue.class.st index 2af5c64..3e0435c 100644 --- a/src/Containers-Queue/CTQueue.class.st +++ b/src/Containers-Queue/CTQueue.class.st @@ -37,9 +37,10 @@ CTQueue class >> new: anInteger [ { #category : 'comparing' } CTQueue >> = anObject [ + self class = anObject class ifFalse: [ ^ false ]. self == anObject ifTrue: [ ^ true ]. - self species == anObject species ifFalse: [ ^ false ]. self size = anObject size ifFalse: [ ^ false ]. + ^ self asArray = anObject asArray ] From 6e92be53e2eef80906577790002df1e5054f943d Mon Sep 17 00:00:00 2001 From: HossamSaberr Date: Mon, 23 Mar 2026 16:20:59 +0200 Subject: [PATCH 3/5] Fix: refine equality and hash methods based on review --- src/Containers-Queue/CTQueue.class.st | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/Containers-Queue/CTQueue.class.st b/src/Containers-Queue/CTQueue.class.st index 3e0435c..96662ef 100644 --- a/src/Containers-Queue/CTQueue.class.st +++ b/src/Containers-Queue/CTQueue.class.st @@ -38,10 +38,9 @@ CTQueue class >> new: anInteger [ CTQueue >> = anObject [ self class = anObject class ifFalse: [ ^ false ]. - self == anObject ifTrue: [ ^ true ]. self size = anObject size ifFalse: [ ^ false ]. - ^ self asArray = anObject asArray + ^ self elements = anObject elements ] { #category : 'converting' } @@ -105,6 +104,12 @@ CTQueue >> do: aBlock [ ] ] +{ #category : 'accessing' } +CTQueue >> elements [ + + ^ elements +] + { #category : 'adding' } CTQueue >> enqueue: anObject [ @@ -161,10 +166,11 @@ CTQueue >> grow [ { #category : 'comparing' } CTQueue >> hash [ - | hashValue | - hashValue := self species hash. - self do: [ :each | hashValue := (hashValue + each hash) hashMultiply ]. + hashValue := 131. + self do: [ :each | + hashValue := (hashValue + each hash) hashMultiply + ]. ^ hashValue ] From d9e104e1e5c8e1c611d6ad640b5af579bcc62a11 Mon Sep 17 00:00:00 2001 From: HossamSaberr Date: Mon, 23 Mar 2026 16:53:49 +0200 Subject: [PATCH 4/5] refactor: optmize hash method to avoid message sends --- src/Containers-Queue/CTQueue.class.st | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Containers-Queue/CTQueue.class.st b/src/Containers-Queue/CTQueue.class.st index 96662ef..6686804 100644 --- a/src/Containers-Queue/CTQueue.class.st +++ b/src/Containers-Queue/CTQueue.class.st @@ -168,8 +168,7 @@ CTQueue >> grow [ CTQueue >> hash [ | hashValue | hashValue := 131. - self do: [ :each | - hashValue := (hashValue + each hash) hashMultiply + 1 to: size do: [ :i | hashValue := (hashValue bitXor: (elements at: i) hash) hashMultiply ]. ^ hashValue ] From e5fa0217eefd848a787341ed0401bfd4eba39c98 Mon Sep 17 00:00:00 2001 From: HossamSaberr Date: Mon, 23 Mar 2026 17:14:07 +0200 Subject: [PATCH 5/5] refactor: use XOR for hash method and remove hashMultiply --- src/Containers-Queue/CTQueue.class.st | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/Containers-Queue/CTQueue.class.st b/src/Containers-Queue/CTQueue.class.st index 6686804..ebbd947 100644 --- a/src/Containers-Queue/CTQueue.class.st +++ b/src/Containers-Queue/CTQueue.class.st @@ -168,8 +168,7 @@ CTQueue >> grow [ CTQueue >> hash [ | hashValue | hashValue := 131. - 1 to: size do: [ :i | hashValue := (hashValue bitXor: (elements at: i) hash) hashMultiply - ]. + 1 to: size do: [ :i | hashValue := hashValue bitXor: (elements at: i) hash ]. ^ hashValue ]