@@ -46,11 +46,12 @@ type (
46
46
47
47
// Map implements the concurrent hashmap
48
48
Map [K hashable , V any ] struct {
49
- listHead * element [K , V ] // Harris lock-free list of elements in ascending order of hash
50
- hasher func (K ) uintptr
51
- metadata atomicPointer [metadata [K , V ]] // atomic.Pointer for safe access even during resizing
52
- resizing atomicUint32
53
- numItems atomicUintptr
49
+ listHead * element [K , V ] // Harris lock-free list of elements in ascending order of hash
50
+ hasher func (K ) uintptr
51
+ metadata atomicPointer [metadata [K , V ]] // atomic.Pointer for safe access even during resizing
52
+ resizing atomicUint32
53
+ numItems atomicUintptr
54
+ defaultSize uintptr
54
55
}
55
56
56
57
// used in deletion of map elements
@@ -64,11 +65,11 @@ type (
64
65
func New [K hashable , V any ](size ... uintptr ) * Map [K , V ] {
65
66
m := & Map [K , V ]{listHead : newListHead [K , V ]()}
66
67
m .numItems .Store (0 )
67
- if len (size ) > 0 && size [0 ] != 0 {
68
- m .allocate (size [0 ])
69
- } else {
70
- m .allocate (defaultSize )
68
+ m .defaultSize = defaultSize
69
+ if len (size ) > 0 && size [0 ] > 0 {
70
+ m .defaultSize = size [0 ]
71
71
}
72
+ m .allocate (m .defaultSize )
72
73
m .setDefaultHasher ()
73
74
return m
74
75
}
@@ -350,6 +351,21 @@ func (m *Map[K, V]) Grow(newSize uintptr) {
350
351
}
351
352
}
352
353
354
+ // Clear the map by removing all entries in the map.
355
+ // This operation resets the underlying metadata to its initial state.
356
+ func (m * Map [K , V ]) Clear () {
357
+ index := make ([]* element [K , V ], m .defaultSize )
358
+ header := (* reflect .SliceHeader )(unsafe .Pointer (& index ))
359
+ newdata := & metadata [K , V ]{
360
+ keyshifts : strconv .IntSize - log2 (m .defaultSize ),
361
+ data : unsafe .Pointer (header .Data ),
362
+ index : index ,
363
+ }
364
+ m .listHead .nextPtr .Store (nil )
365
+ m .metadata .Store (newdata )
366
+ m .numItems .Store (0 )
367
+ }
368
+
353
369
// SetHasher sets the hash function to the one provided by the user
354
370
func (m * Map [K , V ]) SetHasher (hs func (K ) uintptr ) {
355
371
m .hasher = hs
0 commit comments