Skip to content

Commit bbe8ac6

Browse files
committed
Add function to get length of Map
Signed-off-by: m-murad <[email protected]>
1 parent ff33133 commit bbe8ac6

File tree

3 files changed

+66
-7
lines changed

3 files changed

+66
-7
lines changed

map.go

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,13 @@ func New() *Map {
3030
// The ok result indicates whether value was found in the map.
3131
func (m *Map) Get(key interface{}) (interface{}, bool) {
3232
m.mu.RLock()
33+
defer m.mu.RUnlock()
34+
3335
v, ok := m.mp[key]
3436
if !ok {
35-
m.mu.RUnlock()
3637
return nil, false
3738
}
38-
m.mu.RUnlock()
39+
3940
me := v.Value.(mapElement)
4041
return me.value, ok
4142
}
@@ -45,27 +46,28 @@ func (m *Map) Get(key interface{}) (interface{}, bool) {
4546
// even if the values are same.
4647
func (m *Map) Put(key interface{}, val interface{}) {
4748
m.mu.Lock()
49+
defer m.mu.Unlock()
50+
4851
if e, ok := m.mp[key]; !ok {
4952
m.mp[key] = m.dll.PushFront(mapElement{key: key, value: val})
5053
} else {
5154
e.Value = mapElement{key: key, value: val}
5255
}
53-
m.mu.Unlock()
5456
}
5557

5658
// Delete deletes the value for a key.
5759
// It returns a boolean indicating weather the key existed and it was deleted.
5860
func (m *Map) Delete(key interface{}) bool {
5961
m.mu.Lock()
62+
defer m.mu.Unlock()
63+
6064
e, ok := m.mp[key]
6165
if !ok {
62-
m.mu.Unlock()
6366
return false
6467
}
6568

6669
m.dll.Remove(e)
6770
delete(m.mp, key)
68-
m.mu.Unlock()
6971
return true
7072
}
7173

@@ -75,10 +77,11 @@ func (m *Map) Delete(key interface{}) bool {
7577
// It will cause a deadlock
7678
func (m *Map) UnorderedRange(f func(key interface{}, value interface{})) {
7779
m.mu.RLock()
80+
defer m.mu.RUnlock()
81+
7882
for k, v := range m.mp {
7983
f(k, v.Value.(mapElement).value)
8084
}
81-
m.mu.RUnlock()
8285
}
8386

8487
// OrderedRange will range over the map in ab ordered sequence.
@@ -89,11 +92,20 @@ func (m *Map) UnorderedRange(f func(key interface{}, value interface{})) {
8992
// It will cause a deadlock
9093
func (m *Map) OrderedRange(f func(key interface{}, value interface{})) {
9194
m.mu.RLock()
95+
defer m.mu.RUnlock()
96+
9297
cur := m.dll.Back()
9398
for cur != nil {
9499
me := cur.Value.(mapElement)
95100
f(me.key, me.value)
96101
cur = cur.Prev()
97102
}
98-
m.mu.RUnlock()
103+
}
104+
105+
// Length will return the length of Map
106+
func (m *Map) Length() int {
107+
m.mu.RLock()
108+
defer m.mu.RUnlock()
109+
110+
return m.dll.Len()
99111
}

map_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,3 +119,47 @@ func TestOrderedRange(t *testing.T) {
119119
}
120120
m.OrderedRange(rangeFunc)
121121
}
122+
123+
func TestLength(t *testing.T) {
124+
m := initMap()
125+
126+
m.Put("a", 1)
127+
m.Put("b", 2)
128+
if m.Length() != 2 {
129+
t.FailNow()
130+
}
131+
132+
m.Put("c", 2)
133+
m.Put("d", 2)
134+
m.Put("e", 2)
135+
if m.Length() != 5 {
136+
t.FailNow()
137+
}
138+
139+
m.Put("e", 3)
140+
if m.Length() != 5 {
141+
t.FailNow()
142+
}
143+
144+
m.Delete("a")
145+
if m.Length() != 4 {
146+
t.FailNow()
147+
}
148+
149+
m.Delete("does_not_exist")
150+
if m.Length() != 4 {
151+
t.FailNow()
152+
}
153+
154+
m.Delete("b")
155+
m.Delete("c")
156+
m.Delete("d")
157+
if m.Length() != 1 {
158+
t.FailNow()
159+
}
160+
161+
m.Delete("e")
162+
if m.Length() != 0 {
163+
t.FailNow()
164+
}
165+
}

readme.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,5 +38,8 @@ func main() {
3838
m.OrderedRange(func(key interface{}, val interface{}) {
3939
log.Println("Key - %v, Value - %v", key, val)
4040
})
41+
42+
// Length will return the length of the Map.
43+
m.Length()
4144
}
4245
```

0 commit comments

Comments
 (0)