| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182 |
- package types
- import (
- "sync"
- "github.com/QuantumNous/new-api/common"
- )
- type RWMap[K comparable, V any] struct {
- data map[K]V
- mutex sync.RWMutex
- }
- func (m *RWMap[K, V]) UnmarshalJSON(b []byte) error {
- m.mutex.Lock()
- defer m.mutex.Unlock()
- m.data = make(map[K]V)
- return common.Unmarshal(b, &m.data)
- }
- func (m *RWMap[K, V]) MarshalJSON() ([]byte, error) {
- m.mutex.RLock()
- defer m.mutex.RUnlock()
- return common.Marshal(m.data)
- }
- func NewRWMap[K comparable, V any]() *RWMap[K, V] {
- return &RWMap[K, V]{
- data: make(map[K]V),
- }
- }
- func (m *RWMap[K, V]) Get(key K) (V, bool) {
- m.mutex.RLock()
- defer m.mutex.RUnlock()
- value, exists := m.data[key]
- return value, exists
- }
- func (m *RWMap[K, V]) Set(key K, value V) {
- m.mutex.Lock()
- defer m.mutex.Unlock()
- m.data[key] = value
- }
- func (m *RWMap[K, V]) AddAll(other map[K]V) {
- m.mutex.Lock()
- defer m.mutex.Unlock()
- for k, v := range other {
- m.data[k] = v
- }
- }
- func (m *RWMap[K, V]) Clear() {
- m.mutex.Lock()
- defer m.mutex.Unlock()
- m.data = make(map[K]V)
- }
- // ReadAll returns a copy of the entire map.
- func (m *RWMap[K, V]) ReadAll() map[K]V {
- m.mutex.RLock()
- defer m.mutex.RUnlock()
- copiedMap := make(map[K]V)
- for k, v := range m.data {
- copiedMap[k] = v
- }
- return copiedMap
- }
- func (m *RWMap[K, V]) Len() int {
- m.mutex.RLock()
- defer m.mutex.RUnlock()
- return len(m.data)
- }
- func LoadFromJsonString[K comparable, V any](m *RWMap[K, V], jsonStr string) error {
- m.mutex.Lock()
- defer m.mutex.Unlock()
- m.data = make(map[K]V)
- return common.Unmarshal([]byte(jsonStr), &m.data)
- }
|