| // Copyright 2025 Google Inc. All rights reserved. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // http://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| package syncmap |
| |
| import "sync" |
| |
| // SyncMap is a wrapper around sync.Map that provides type safety via generics. |
| type SyncMap[K comparable, V any] struct { |
| sync.Map |
| } |
| |
| // Load returns the value stored in the map for a key, or the zero value if no |
| // value is present. |
| // The ok result indicates whether value was found in the map. |
| func (m *SyncMap[K, V]) Load(key K) (value V, ok bool) { |
| v, ok := m.Map.Load(key) |
| if !ok { |
| return *new(V), false |
| } |
| return v.(V), true |
| } |
| |
| // Store sets the value for a key. |
| func (m *SyncMap[K, V]) Store(key K, value V) { |
| m.Map.Store(key, value) |
| } |
| |
| // LoadOrStore returns the existing value for the key if present. |
| // Otherwise, it stores and returns the given value. |
| // The loaded result is true if the value was loaded, false if stored. |
| func (m *SyncMap[K, V]) LoadOrStore(key K, value V) (actual V, loaded bool) { |
| v, loaded := m.Map.LoadOrStore(key, value) |
| return v.(V), loaded |
| } |
| |
| func (m *SyncMap[K, V]) Range(f func(key K, value V) bool) { |
| m.Map.Range(func(k, v any) bool { |
| return f(k.(K), v.(V)) |
| }) |
| } |