Skip to content

Commit 9d80274

Browse files
Add Has Method for OrderedMap (#54)
Co-authored-by: busi-reddy-karnati <[email protected]>
1 parent 5750fe0 commit 9d80274

File tree

6 files changed

+531
-0
lines changed

6 files changed

+531
-0
lines changed

orderedmap.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,9 @@ func (m *OrderedMap) Copy() *OrderedMap {
117117

118118
return m2
119119
}
120+
121+
// Has checks if a key exists in the map.
122+
func (m *OrderedMap) Has(key interface{}) bool {
123+
_, exists := m.kv[key]
124+
return exists
125+
}

orderedmap_test.go

Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,26 @@ func TestGetElement(t *testing.T) {
357357
})
358358
}
359359

360+
func TestOrderedMap_Has(t *testing.T) {
361+
t.Run("ReturnsFalseIfKeyDoesNotExist", func(t *testing.T) {
362+
m := orderedmap.NewOrderedMap()
363+
assert.False(t, m.Has("foo"))
364+
})
365+
366+
t.Run("ReturnsTrueIfKeyExists", func(t *testing.T) {
367+
m := orderedmap.NewOrderedMap()
368+
m.Set("foo", "bar")
369+
assert.True(t, m.Has("foo"))
370+
})
371+
372+
t.Run("KeyDoesNotExistAfterDelete", func(t *testing.T) {
373+
m := orderedmap.NewOrderedMap()
374+
m.Set("foo", "bar")
375+
m.Delete("foo")
376+
assert.False(t, m.Has("foo"))
377+
})
378+
}
379+
360380
func benchmarkMap_Set(multiplier int) func(b *testing.B) {
361381
return func(b *testing.B) {
362382
m := make(map[int]bool)
@@ -524,6 +544,40 @@ func benchmarkOrderedMap_Iterate(multiplier int) func(b *testing.B) {
524544
}
525545
}
526546

547+
func benchmarkMap_Has(multiplier int) func(b *testing.B) {
548+
m := make(map[int]bool)
549+
for i := 0; i < 1000*multiplier; i++ {
550+
m[i] = true
551+
}
552+
553+
return func(b *testing.B) {
554+
for i := 0; i < b.N; i++ {
555+
_ = m[i%1000*multiplier]
556+
}
557+
}
558+
}
559+
560+
func BenchmarkMap_Has(b *testing.B) {
561+
benchmarkMap_Has(1)(b)
562+
}
563+
564+
func benchmarkOrderedMap_Has(multiplier int) func(b *testing.B) {
565+
m := orderedmap.NewOrderedMap()
566+
for i := 0; i < 1000*multiplier; i++ {
567+
m.Set(i, true)
568+
}
569+
570+
return func(b *testing.B) {
571+
for i := 0; i < b.N; i++ {
572+
m.Has(i % 1000 * multiplier)
573+
}
574+
}
575+
}
576+
577+
func BenchmarkOrderedMap_Has(b *testing.B) {
578+
benchmarkOrderedMap_Has(1)(b)
579+
}
580+
527581
func BenchmarkOrderedMap_Iterate(b *testing.B) {
528582
benchmarkOrderedMap_Iterate(1)(b)
529583
}
@@ -698,6 +752,42 @@ func BenchmarkOrderedMapString_Iterate(b *testing.B) {
698752
benchmarkOrderedMapString_Iterate(1)(b)
699753
}
700754

755+
func benchmarkMapString_Has(multiplier int) func(b *testing.B) {
756+
m := make(map[string]bool)
757+
a := "12345678"
758+
for i := 0; i < 1000*multiplier; i++ {
759+
m[a+strconv.Itoa(i)] = true
760+
}
761+
762+
return func(b *testing.B) {
763+
for i := 0; i < b.N; i++ {
764+
_ = m[a+strconv.Itoa(i%1000*multiplier)]
765+
}
766+
}
767+
}
768+
769+
func BenchmarkMapString_Has(b *testing.B) {
770+
benchmarkMapString_Has(1)(b)
771+
}
772+
773+
func benchmarkOrderedMapString_Has(multiplier int) func(b *testing.B) {
774+
m := orderedmap.NewOrderedMap()
775+
a := "12345678"
776+
for i := 0; i < 1000*multiplier; i++ {
777+
m.Set(a+strconv.Itoa(i), true)
778+
}
779+
780+
return func(b *testing.B) {
781+
for i := 0; i < b.N; i++ {
782+
m.Has(a + strconv.Itoa(i%1000*multiplier))
783+
}
784+
}
785+
}
786+
787+
func BenchmarkOrderedMapString_Has(b *testing.B) {
788+
benchmarkOrderedMapString_Has(1)(b)
789+
}
790+
701791
func BenchmarkOrderedMap_Keys(b *testing.B) {
702792
benchmarkOrderedMap_Keys(1)(b)
703793
}
@@ -882,6 +972,44 @@ func benchmarkBigMapString_Set() func(b *testing.B) {
882972
}
883973
}
884974

975+
func benchmarkBigMap_Has() func(b *testing.B) {
976+
m := make(map[int]bool)
977+
for i := 0; i < 10000000; i++ {
978+
m[i] = true
979+
}
980+
981+
return func(b *testing.B) {
982+
for j := 0; j < b.N; j++ {
983+
for i := 0; i < 10000000; i++ {
984+
_ = m[i]
985+
}
986+
}
987+
}
988+
}
989+
990+
func BenchmarkBigMap_Has(b *testing.B) {
991+
benchmarkBigMap_Has()(b)
992+
}
993+
994+
func benchmarkBigOrderedMap_Has() func(b *testing.B) {
995+
m := orderedmap.NewOrderedMap()
996+
for i := 0; i < 10000000; i++ {
997+
m.Set(i, true)
998+
}
999+
1000+
return func(b *testing.B) {
1001+
for j := 0; j < b.N; j++ {
1002+
for i := 0; i < 10000000; i++ {
1003+
m.Has(i)
1004+
}
1005+
}
1006+
}
1007+
}
1008+
1009+
func BenchmarkBigOrderedMap_Has(b *testing.B) {
1010+
benchmarkBigOrderedMap_Has()(b)
1011+
}
1012+
8851013
func BenchmarkBigMapString_Set(b *testing.B) {
8861014
benchmarkBigMapString_Set()(b)
8871015
}
@@ -1001,6 +1129,45 @@ func BenchmarkBigOrderedMapString_Iterate(b *testing.B) {
10011129
benchmarkBigOrderedMapString_Iterate()(b)
10021130
}
10031131

1132+
func benchmarkBigMapString_Has() func(b *testing.B) {
1133+
m := make(map[string]bool)
1134+
a := "12345678"
1135+
for i := 0; i < 10000000; i++ {
1136+
m[a+strconv.Itoa(i)] = true
1137+
}
1138+
1139+
return func(b *testing.B) {
1140+
for j := 0; j < b.N; j++ {
1141+
for i := 0; i < 10000000; i++ {
1142+
_ = m[a+strconv.Itoa(i)]
1143+
}
1144+
}
1145+
}
1146+
}
1147+
1148+
func BenchmarkBigMapString_Has(b *testing.B) {
1149+
benchmarkBigMapString_Has()(b)
1150+
}
1151+
1152+
func benchmarkBigOrderedMapString_Has() func(b *testing.B) {
1153+
m := orderedmap.NewOrderedMap()
1154+
for i := 0; i < 10000000; i++ {
1155+
m.Set(i, true)
1156+
}
1157+
1158+
return func(b *testing.B) {
1159+
for j := 0; j < b.N; j++ {
1160+
for i := 0; i < 10000000; i++ {
1161+
m.Has(i)
1162+
}
1163+
}
1164+
}
1165+
}
1166+
1167+
func BenchmarkBigOrderedMapString_Has(b *testing.B) {
1168+
benchmarkBigOrderedMapString_Has()(b)
1169+
}
1170+
10041171
func BenchmarkAll(b *testing.B) {
10051172
b.Run("BenchmarkOrderedMap_Keys", BenchmarkOrderedMap_Keys)
10061173

@@ -1013,6 +1180,8 @@ func BenchmarkAll(b *testing.B) {
10131180
b.Run("BenchmarkMap_Delete", BenchmarkMap_Delete)
10141181
b.Run("BenchmarkOrderedMap_Iterate", BenchmarkOrderedMap_Iterate)
10151182
b.Run("BenchmarkMap_Iterate", BenchmarkMap_Iterate)
1183+
b.Run("BenchmarkOrderedMap_Has", BenchmarkOrderedMap_Has)
1184+
b.Run("BenchmarkMap_Has", BenchmarkMap_Has)
10161185

10171186
b.Run("BenchmarkBigMap_Set", BenchmarkBigMap_Set)
10181187
b.Run("BenchmarkBigOrderedMap_Set", BenchmarkBigOrderedMap_Set)
@@ -1021,6 +1190,8 @@ func BenchmarkAll(b *testing.B) {
10211190
b.Run("BenchmarkBigOrderedMap_GetElement", BenchmarkBigOrderedMap_GetElement)
10221191
b.Run("BenchmarkBigOrderedMap_Iterate", BenchmarkBigOrderedMap_Iterate)
10231192
b.Run("BenchmarkBigMap_Iterate", BenchmarkBigMap_Iterate)
1193+
b.Run("BenchmarkBigMap_Has", BenchmarkBigMap_Has)
1194+
b.Run("BenchmarkBigOrderedMap_Has", BenchmarkBigOrderedMap_Has)
10241195

10251196
b.Run("BenchmarkOrderedMapString_Set", BenchmarkOrderedMapString_Set)
10261197
b.Run("BenchmarkMapString_Set", BenchmarkMapString_Set)
@@ -1031,6 +1202,8 @@ func BenchmarkAll(b *testing.B) {
10311202
b.Run("BenchmarkMapString_Delete", BenchmarkMapString_Delete)
10321203
b.Run("BenchmarkOrderedMapString_Iterate", BenchmarkOrderedMapString_Iterate)
10331204
b.Run("BenchmarkMapString_Iterate", BenchmarkMapString_Iterate)
1205+
b.Run("BenchmarkMapString_Has", BenchmarkMapString_Has)
1206+
b.Run("BenchmarkOrderedMapString_Has", BenchmarkOrderedMapString_Has)
10341207

10351208
b.Run("BenchmarkBigMapString_Set", BenchmarkBigMapString_Set)
10361209
b.Run("BenchmarkBigOrderedMapString_Set", BenchmarkBigOrderedMapString_Set)
@@ -1039,4 +1212,6 @@ func BenchmarkAll(b *testing.B) {
10391212
b.Run("BenchmarkBigOrderedMapString_GetElement", BenchmarkBigOrderedMapString_GetElement)
10401213
b.Run("BenchmarkBigOrderedMapString_Iterate", BenchmarkBigOrderedMapString_Iterate)
10411214
b.Run("BenchmarkBigMapString_Iterate", BenchmarkBigMapString_Iterate)
1215+
b.Run("BenchmarkBigMapString_Has", BenchmarkBigMapString_Has)
1216+
b.Run("BenchmarkBigOrderedMapString_Has", BenchmarkBigOrderedMapString_Has)
10421217
}

v2/orderedmap.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -138,3 +138,9 @@ func (m *OrderedMap[K, V]) Copy() *OrderedMap[K, V] {
138138
}
139139
return m2
140140
}
141+
142+
// Has checks if a key exists in the map.
143+
func (m *OrderedMap[K, V]) Has(key K) bool {
144+
_, exists := m.kv[key]
145+
return exists
146+
}

0 commit comments

Comments
 (0)