12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- // Copyright 2014 beego Author. All Rights Reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
- package utils
- import (
- "sync"
- )
- // BeeMap is a map with lock
- type BeeMap struct {
- lock *sync.RWMutex
- bm map[interface{}]interface{}
- }
- // NewBeeMap return new safemap
- func NewBeeMap() *BeeMap {
- return &BeeMap{
- lock: new(sync.RWMutex),
- bm: make(map[interface{}]interface{}),
- }
- }
- // Get from maps return the k's value
- func (m *BeeMap) Get(k interface{}) interface{} {
- m.lock.RLock()
- defer m.lock.RUnlock()
- if val, ok := m.bm[k]; ok {
- return val
- }
- return nil
- }
- // Set Maps the given key and value. Returns false
- // if the key is already in the map and changes nothing.
- func (m *BeeMap) Set(k interface{}, v interface{}) bool {
- m.lock.Lock()
- defer m.lock.Unlock()
- if val, ok := m.bm[k]; !ok {
- m.bm[k] = v
- } else if val != v {
- m.bm[k] = v
- } else {
- return false
- }
- return true
- }
- // Check Returns true if k is exist in the map.
- func (m *BeeMap) Check(k interface{}) bool {
- m.lock.RLock()
- defer m.lock.RUnlock()
- _, ok := m.bm[k]
- return ok
- }
- // Delete the given key and value.
- func (m *BeeMap) Delete(k interface{}) {
- m.lock.Lock()
- defer m.lock.Unlock()
- delete(m.bm, k)
- }
- // Items returns all items in safemap.
- func (m *BeeMap) Items() map[interface{}]interface{} {
- m.lock.RLock()
- defer m.lock.RUnlock()
- r := make(map[interface{}]interface{})
- for k, v := range m.bm {
- r[k] = v
- }
- return r
- }
- // Count returns the number of items within the map.
- func (m *BeeMap) Count() int {
- m.lock.RLock()
- defer m.lock.RUnlock()
- return len(m.bm)
- }
|