diff --git a/cmap.go b/cmap.go new file mode 100644 index 0000000..096f1a9 --- /dev/null +++ b/cmap.go @@ -0,0 +1,63 @@ +package cdatatypes + +import ( + "sync" +) + +type CMap struct { + sync.RWMutex + items map[interface{}]interface{} +} + +func NewCMap() *CMap { + return &CMap{sync.RWMutex{}, make(map[interface{}]interface{})} +} + +func (m *CMap) Set(key interface{}, value interface{}) { + m.Lock() + defer m.Unlock() + + m.items[key] = value +} + +func (m *CMap) Get(key interface{}) (value interface{}, ok bool) { + m.RLock() + defer m.RUnlock() + + value, ok = m.items[key] + return value, ok +} + +func (m *CMap) Delete(key interface{}) { + m.Lock() + defer m.Unlock() + + delete(m.items, key) +} + +func (m *CMap) Clear() { + m.Lock() + defer m.Unlock() + + m.items = make(map[interface{}]interface{}) +} + +func (m *CMap) Len() int { + m.RLock() + defer m.RUnlock() + + ret := len(m.items) + return ret +} + +func (m *CMap) Items() map[interface{}]interface{} { + m.RLock() + defer m.RUnlock() + + ret := make(map[interface{}]interface{}) + for k, v := range m.items { + ret[k] = v + } + + return ret +} diff --git a/cslice.go b/cslice.go new file mode 100644 index 0000000..ecb0020 --- /dev/null +++ b/cslice.go @@ -0,0 +1,72 @@ +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 +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..255a9b5 --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module gitea.olznet.de/OlzNet/cdatatypes + +go 1.15