set/threadsafeset/threadsafeset.go

70 lines
1.2 KiB
Go

package threadsafeset
import (
"sync"
"code.wmdillon.com/GoApi/set/simpleset"
)
type ThreadsafeSet[T comparable] struct {
mutex sync.RWMutex
set *simpleset.SimpleSet[T]
}
func New[T comparable]() *ThreadsafeSet[T] {
return &ThreadsafeSet[T]{
set: simpleset.New[T](),
}
}
func (s *ThreadsafeSet[T]) lockedInitMapIfNil() {
if s.set == nil {
s.set = simpleset.New[T]()
}
}
func (s *ThreadsafeSet[T]) Insert(t T) (inserted bool) {
s.mutex.Lock()
defer s.mutex.Unlock()
s.lockedInitMapIfNil()
return s.set.Insert(t)
}
func (s *ThreadsafeSet[T]) Contains(t T) bool {
s.mutex.RLock()
defer s.mutex.RUnlock()
return s.set != nil && s.set.Contains(t)
}
func (s *ThreadsafeSet[T]) Len() int {
s.mutex.RLock()
defer s.mutex.RUnlock()
if s.set == nil {
return 0
}
return s.set.Len()
}
func (s *ThreadsafeSet[T]) ToSlice() []T {
s.mutex.RLock()
defer s.mutex.RUnlock()
if s.set == nil {
return nil
}
return s.set.ToSlice()
}
func (s *ThreadsafeSet[T]) Clear() {
s.mutex.Lock()
defer s.mutex.Unlock()
s.lockedInitMapIfNil()
s.set.Clear()
}
func (s *ThreadsafeSet[T]) Remove(t T) (removed bool) {
s.mutex.Lock()
defer s.mutex.Unlock()
s.lockedInitMapIfNil()
return s.set.Remove(t)
}