@@ -7,29 +7,29 @@ import (
7
7
"unsafe"
8
8
9
9
"github.com/antlabs/gstl/api"
10
- "github.com/antlabs/gstl/mapex"
11
10
xxhash "github.com/cespare/xxhash/v2"
11
+ "golang.org/x/exp/constraints"
12
12
)
13
13
14
14
var _ api.CMaper [int , int ] = (* CMap [int , int ])(nil )
15
15
16
- type Pair [K comparable , V any ] struct {
16
+ type Pair [K constraints. Ordered , V any ] struct {
17
17
Key K
18
18
Val V
19
19
}
20
20
21
- type CMap [K comparable , V any ] struct {
21
+ type CMap [K constraints. Ordered , V any ] struct {
22
22
bucket []Item [K , V ]
23
23
keySize int
24
24
isKeyStr bool
25
25
}
26
26
27
- type Item [K comparable , V any ] struct {
27
+ type Item [K constraints. Ordered , V any ] struct {
28
28
rw sync.RWMutex
29
- m map [ K ] V
29
+ m api. Map [ K , V ]
30
30
}
31
31
32
- func New [K comparable , V any ]() (c * CMap [K , V ]) {
32
+ func New [K constraints. Ordered , V any ]() (c * CMap [K , V ]) {
33
33
c = & CMap [K , V ]{}
34
34
c .init (0 )
35
35
return c
@@ -48,7 +48,7 @@ func (c *CMap[K, V]) init(n int) {
48
48
c .bucket = make ([]Item [K , V ], np )
49
49
50
50
for i := range c .bucket {
51
- c .bucket [i ].m = make ( map [ K ] V )
51
+ c .bucket [i ].m = newStdMap [ K , V ]( )
52
52
}
53
53
54
54
}
@@ -92,42 +92,43 @@ func (c *CMap[K, V]) findIndex(key K) *Item[K, V] {
92
92
func (c * CMap [K , V ]) Delete (key K ) {
93
93
item := c .findIndex (key )
94
94
item .rw .Lock ()
95
- delete ( item .m , key )
95
+ item .m . Delete ( key )
96
96
item .rw .Unlock ()
97
97
}
98
98
99
99
func (c * CMap [K , V ]) Load (key K ) (value V , ok bool ) {
100
100
item := c .findIndex (key )
101
101
item .rw .RLock ()
102
- value , ok = item .m [ key ]
102
+ value , ok = item .m . GetWithBool ( key )
103
103
item .rw .RUnlock ()
104
104
return
105
105
}
106
106
107
107
func (c * CMap [K , V ]) LoadAndDelete (key K ) (value V , loaded bool ) {
108
108
item := c .findIndex (key )
109
109
item .rw .Lock ()
110
- value , loaded = item .m [ key ]
110
+ value , loaded = item .m . GetWithBool ( key )
111
111
if ! loaded {
112
112
item .rw .Unlock ()
113
113
return
114
114
}
115
- delete ( item .m , key )
115
+ item .m . Delete ( key )
116
116
item .rw .Unlock ()
117
117
return
118
118
}
119
119
120
120
func (c * CMap [K , V ]) LoadOrStore (key K , value V ) (actual V , loaded bool ) {
121
121
item := c .findIndex (key )
122
122
item .rw .Lock ()
123
- actual , loaded = item .m [ key ]
123
+ actual , loaded = item .m . GetWithBool ( key )
124
124
if ! loaded {
125
125
actual = value
126
- item .m [ key ] = actual
126
+ item .m . Set ( key , actual )
127
127
item .rw .Unlock ()
128
128
return
129
129
}
130
- actual , loaded = item .m [key ]
130
+
131
+ actual , loaded = item .m .GetWithBool (key )
131
132
item .rw .Unlock ()
132
133
return
133
134
}
@@ -136,12 +137,7 @@ func (c *CMap[K, V]) Range(f func(key K, value V) bool) {
136
137
for i := 0 ; i < len (c .bucket ); i ++ {
137
138
item := & c .bucket [i ]
138
139
item .rw .RLock ()
139
- for k , v := range item .m {
140
- if ! f (k , v ) {
141
- item .rw .RUnlock ()
142
- return
143
- }
144
- }
140
+ item .m .Range (f )
145
141
item .rw .RUnlock ()
146
142
}
147
143
}
@@ -164,9 +160,10 @@ func (c *CMap[K, V]) Iter() (rv chan Pair[K, V]) {
164
160
165
161
defer wg .Done ()
166
162
item .rw .RLock ()
167
- for k , v := range item .m {
168
- rv <- Pair [K , V ]{Key : k , Val : v }
169
- }
163
+ item .m .Range (func (key K , value V ) bool {
164
+ rv <- Pair [K , V ]{Key : key , Val : value }
165
+ return true
166
+ })
170
167
item .rw .RUnlock ()
171
168
172
169
}(item )
@@ -178,7 +175,7 @@ func (c *CMap[K, V]) Iter() (rv chan Pair[K, V]) {
178
175
func (c * CMap [K , V ]) Store (key K , value V ) {
179
176
item := c .findIndex (key )
180
177
item .rw .Lock ()
181
- item .m [ key ] = value
178
+ item .m . Set ( key , value )
182
179
item .rw .Unlock ()
183
180
return
184
181
}
@@ -195,7 +192,10 @@ func (c *CMap[K, V]) Keys() []K {
195
192
196
193
item := & c .bucket [i ]
197
194
item .rw .RLock ()
198
- all = append (all , mapex .Keys (item .m )... )
195
+ item .m .Range (func (key K , value V ) bool {
196
+ all = append (all , key )
197
+ return true
198
+ })
199
199
item .rw .RUnlock ()
200
200
}
201
201
return all
@@ -212,7 +212,10 @@ func (c *CMap[K, V]) Values() []V {
212
212
213
213
item := & c .bucket [i ]
214
214
item .rw .RLock ()
215
- all = append (all , mapex .Values (item .m )... )
215
+ item .m .Range (func (key K , value V ) bool {
216
+ all = append (all , value )
217
+ return true
218
+ })
216
219
item .rw .RUnlock ()
217
220
}
218
221
return all
@@ -223,7 +226,7 @@ func (c *CMap[K, V]) Len() int {
223
226
for i := 0 ; i < len (c .bucket ); i ++ {
224
227
item := & c .bucket [i ]
225
228
item .rw .RLock ()
226
- l += len ( item .m )
229
+ l += item .m . Len ( )
227
230
item .rw .RUnlock ()
228
231
}
229
232
return l
0 commit comments