| 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)
|
| }
|
|
|
|
|
| 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)
|
| }
|
|
|