77 lines
1.2 KiB
Go
77 lines
1.2 KiB
Go
package cache
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
type SafeDoubleMap struct {
|
|
sync.RWMutex
|
|
M map[string]map[string]struct{}
|
|
}
|
|
|
|
// res_ident -> classpath_path -> struct{}{}
|
|
var ResClasspath = &SafeDoubleMap{M: make(map[string]map[string]struct{})}
|
|
|
|
func (s *SafeDoubleMap) GetKeys() []string {
|
|
s.RLock()
|
|
defer s.RUnlock()
|
|
|
|
keys := make([]string, 0, len(s.M))
|
|
for key := range s.M {
|
|
keys = append(keys, key)
|
|
}
|
|
|
|
return keys
|
|
}
|
|
|
|
func (s *SafeDoubleMap) GetValues(key string) []string {
|
|
s.RLock()
|
|
defer s.RUnlock()
|
|
|
|
valueMap, exists := s.M[key]
|
|
if !exists {
|
|
return []string{}
|
|
}
|
|
|
|
values := make([]string, 0, len(valueMap))
|
|
|
|
for value := range valueMap {
|
|
values = append(values, value)
|
|
}
|
|
|
|
return values
|
|
}
|
|
|
|
func (s *SafeDoubleMap) Exists(key string, value string) bool {
|
|
s.RLock()
|
|
defer s.RUnlock()
|
|
|
|
if _, exists := s.M[key]; !exists {
|
|
return false
|
|
}
|
|
|
|
if _, exists := s.M[key][value]; !exists {
|
|
return false
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
func (s *SafeDoubleMap) Set(key string, value string) {
|
|
s.Lock()
|
|
defer s.Unlock()
|
|
|
|
if _, exists := s.M[key]; !exists {
|
|
s.M[key] = make(map[string]struct{})
|
|
}
|
|
|
|
s.M[key][value] = struct{}{}
|
|
}
|
|
|
|
func (s *SafeDoubleMap) SetAll(data map[string]map[string]struct{}) {
|
|
s.Lock()
|
|
defer s.Unlock()
|
|
|
|
s.M = data
|
|
}
|