mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-03-30 00:46:42 +00:00
feat: add special user usable group setting
This commit is contained in:
82
types/rw_map.go
Normal file
82
types/rw_map.go
Normal file
@@ -0,0 +1,82 @@
|
||||
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)
|
||||
}
|
||||
Reference in New Issue
Block a user