73 lines
960 B
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
|
||
|
}
|