cdatatypes/cslice.go

73 lines
960 B
Go

package cdatatypes
import (
"sync"
)
type CSlice struct {
sync.RWMutex
items []interface{}
}
func NewCSlice() *CSlice {
return &CSlice{sync.RWMutex{}, []interface{}{}}
}
func (s *CSlice) Append(value interface{}) {
s.Lock()
defer s.Unlock()
s.items = append(s.items, value)
}
func (s *CSlice) Clear() {
s.Lock()
defer s.Unlock()
s.items = []interface{}{}
}
func (s *CSlice) Pop() (ret interface{}, ok bool) {
s.Lock()
defer s.Unlock()
switch len(s.items) {
case 0:
ret = nil
ok = false
break
case 1:
ret = s.items[0]
ok = true
s.items = []interface{}{}
break
default:
ret = s.items[0]
ok = true
s.items = s.items[1:]
break
}
return ret, ok
}
func (s *CSlice) Len() (ret int) {
s.RLock()
defer s.RUnlock()
ret = len(s.items)
return ret
}
func (s *CSlice) Items() []interface{} {
s.RLock()
defer s.RUnlock()
ret := []interface{}{}
for _, v := range s.items {
ret = append(ret, v)
}
return ret
}