@@ -7,29 +7,29 @@ import (
77 "unsafe"
88
99 "github.com/antlabs/gstl/api"
10- "github.com/antlabs/gstl/mapex"
1110 xxhash "github.com/cespare/xxhash/v2"
11+ "golang.org/x/exp/constraints"
1212)
1313
1414var _ api.CMaper [int , int ] = (* CMap [int , int ])(nil )
1515
16- type Pair [K comparable , V any ] struct {
16+ type Pair [K constraints. Ordered , V any ] struct {
1717 Key K
1818 Val V
1919}
2020
21- type CMap [K comparable , V any ] struct {
21+ type CMap [K constraints. Ordered , V any ] struct {
2222 bucket []Item [K , V ]
2323 keySize int
2424 isKeyStr bool
2525}
2626
27- type Item [K comparable , V any ] struct {
27+ type Item [K constraints. Ordered , V any ] struct {
2828 rw sync.RWMutex
29- m map [ K ] V
29+ m api. Map [ K , V ]
3030}
3131
32- func New [K comparable , V any ]() (c * CMap [K , V ]) {
32+ func New [K constraints. Ordered , V any ]() (c * CMap [K , V ]) {
3333 c = & CMap [K , V ]{}
3434 c .init (0 )
3535 return c
@@ -48,7 +48,7 @@ func (c *CMap[K, V]) init(n int) {
4848 c .bucket = make ([]Item [K , V ], np )
4949
5050 for i := range c .bucket {
51- c .bucket [i ].m = make ( map [ K ] V )
51+ c .bucket [i ].m = newStdMap [ K , V ]( )
5252 }
5353
5454}
@@ -92,42 +92,43 @@ func (c *CMap[K, V]) findIndex(key K) *Item[K, V] {
9292func (c * CMap [K , V ]) Delete (key K ) {
9393 item := c .findIndex (key )
9494 item .rw .Lock ()
95- delete ( item .m , key )
95+ item .m . Delete ( key )
9696 item .rw .Unlock ()
9797}
9898
9999func (c * CMap [K , V ]) Load (key K ) (value V , ok bool ) {
100100 item := c .findIndex (key )
101101 item .rw .RLock ()
102- value , ok = item .m [ key ]
102+ value , ok = item .m . GetWithBool ( key )
103103 item .rw .RUnlock ()
104104 return
105105}
106106
107107func (c * CMap [K , V ]) LoadAndDelete (key K ) (value V , loaded bool ) {
108108 item := c .findIndex (key )
109109 item .rw .Lock ()
110- value , loaded = item .m [ key ]
110+ value , loaded = item .m . GetWithBool ( key )
111111 if ! loaded {
112112 item .rw .Unlock ()
113113 return
114114 }
115- delete ( item .m , key )
115+ item .m . Delete ( key )
116116 item .rw .Unlock ()
117117 return
118118}
119119
120120func (c * CMap [K , V ]) LoadOrStore (key K , value V ) (actual V , loaded bool ) {
121121 item := c .findIndex (key )
122122 item .rw .Lock ()
123- actual , loaded = item .m [ key ]
123+ actual , loaded = item .m . GetWithBool ( key )
124124 if ! loaded {
125125 actual = value
126- item .m [ key ] = actual
126+ item .m . Set ( key , actual )
127127 item .rw .Unlock ()
128128 return
129129 }
130- actual , loaded = item .m [key ]
130+
131+ actual , loaded = item .m .GetWithBool (key )
131132 item .rw .Unlock ()
132133 return
133134}
@@ -136,12 +137,7 @@ func (c *CMap[K, V]) Range(f func(key K, value V) bool) {
136137 for i := 0 ; i < len (c .bucket ); i ++ {
137138 item := & c .bucket [i ]
138139 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 )
145141 item .rw .RUnlock ()
146142 }
147143}
@@ -164,9 +160,10 @@ func (c *CMap[K, V]) Iter() (rv chan Pair[K, V]) {
164160
165161 defer wg .Done ()
166162 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+ })
170167 item .rw .RUnlock ()
171168
172169 }(item )
@@ -178,7 +175,7 @@ func (c *CMap[K, V]) Iter() (rv chan Pair[K, V]) {
178175func (c * CMap [K , V ]) Store (key K , value V ) {
179176 item := c .findIndex (key )
180177 item .rw .Lock ()
181- item .m [ key ] = value
178+ item .m . Set ( key , value )
182179 item .rw .Unlock ()
183180 return
184181}
@@ -195,7 +192,10 @@ func (c *CMap[K, V]) Keys() []K {
195192
196193 item := & c .bucket [i ]
197194 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+ })
199199 item .rw .RUnlock ()
200200 }
201201 return all
@@ -212,7 +212,10 @@ func (c *CMap[K, V]) Values() []V {
212212
213213 item := & c .bucket [i ]
214214 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+ })
216219 item .rw .RUnlock ()
217220 }
218221 return all
@@ -223,7 +226,7 @@ func (c *CMap[K, V]) Len() int {
223226 for i := 0 ; i < len (c .bucket ); i ++ {
224227 item := & c .bucket [i ]
225228 item .rw .RLock ()
226- l += len ( item .m )
229+ l += item .m . Len ( )
227230 item .rw .RUnlock ()
228231 }
229232 return l
0 commit comments