]> Cypherpunks repositories - gostls13.git/commitdiff
expvar: add Map.Delete
authorMichael Fraenkel <michael.fraenkel@gmail.com>
Thu, 4 Oct 2018 00:42:05 +0000 (20:42 -0400)
committerIan Lance Taylor <iant@golang.org>
Thu, 4 Oct 2018 01:16:52 +0000 (01:16 +0000)
Fixes #13491

Change-Id: Ic0525d8ee90f47d0d23c1485919aee13d2400494
Reviewed-on: https://go-review.googlesource.com/c/139537
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/expvar/expvar.go
src/expvar/expvar_test.go

index b7928aab1727e0d8c07a22b69e0b39c52aa02d79..976b300d63779a927cd11eb82a3150f6983d6649 100644 (file)
@@ -137,7 +137,7 @@ func (v *Map) Init() *Map {
        return v
 }
 
-// updateKeys updates the sorted list of keys in v.keys.
+// addKey updates the sorted list of keys in v.keys.
 func (v *Map) addKey(key string) {
        v.keysMu.Lock()
        defer v.keysMu.Unlock()
@@ -199,6 +199,17 @@ func (v *Map) AddFloat(key string, delta float64) {
        }
 }
 
+// Deletes the given key from the map.
+func (v *Map) Delete(key string) {
+       v.keysMu.Lock()
+       defer v.keysMu.Unlock()
+       i := sort.SearchStrings(v.keys, key)
+       if i < len(v.keys) && key == v.keys[i] {
+               v.keys = append(v.keys[:i], v.keys[i+1:]...)
+               v.m.Delete(key)
+       }
+}
+
 // Do calls f for each entry in the map.
 // The map is locked during the iteration,
 // but existing entries may be concurrently updated.
index 728e763896ceb3132559f5cbd6a251d0b04c7946..804b56c1aaaa12a4906f95b7960a4fe99af9e012 100644 (file)
@@ -183,6 +183,43 @@ func TestMapInit(t *testing.T) {
        }
 }
 
+func TestMapDelete(t *testing.T) {
+       RemoveAll()
+       colors := NewMap("bike-shed-colors")
+
+       colors.Add("red", 1)
+       colors.Add("red", 2)
+       colors.Add("blue", 4)
+
+       n := 0
+       colors.Do(func(KeyValue) { n++ })
+       if n != 2 {
+               t.Errorf("after two Add calls with distinct keys, Do should invoke f 2 times; got %v", n)
+       }
+
+       colors.Delete("red")
+       n = 0
+       colors.Do(func(KeyValue) { n++ })
+       if n != 1 {
+               t.Errorf("removed red, Do should invoke f 1 times; got %v", n)
+       }
+
+       colors.Delete("notfound")
+       n = 0
+       colors.Do(func(KeyValue) { n++ })
+       if n != 1 {
+               t.Errorf("attempted to remove notfound, Do should invoke f 1 times; got %v", n)
+       }
+
+       colors.Delete("blue")
+       colors.Delete("blue")
+       n = 0
+       colors.Do(func(KeyValue) { n++ })
+       if n != 0 {
+               t.Errorf("all keys removed, Do should invoke f 0 times; got %v", n)
+       }
+}
+
 func TestMapCounter(t *testing.T) {
        RemoveAll()
        colors := NewMap("bike-shed-colors")