| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- // package dict_rec -- потокобезопасный словарь KV-бакета.
- package dict_rec
- import (
- "gitp78su.ipnodns.ru/svi/kern/v4/d0"
- "gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_key"
- "gitp78su.ipnodns.ru/svi/kern/v4/d2/lsi/store_ent/rec_kv"
- )
- // IDictRec -- интерфейс потокобезопасного словаря KV-бакета.
- type IDictRec interface {
- // Get -- возвращает значение по ключу
- Get(key rec_key.IRecKeyFix) *d0.Option[rec_kv.IRecKvFix]
- // Set -- устанавливает значение по ключу
- Set(val rec_kv.IRecKvFix) *d0.Result[d0.Bool]
- // Del -- удаляет значение по ключу
- Del(key rec_key.IRecKeyFix)
- // Len -- возвращает количество записей
- Len() d0.Num
- }
- // DictRec -- потокобезопасный словарь KV-бакета.
- type DictRec struct {
- dict map[rec_key.ARecKey]rec_kv.IRecKvFix
- block *d0.MSafeMutex
- }
- // NewDictRec -- создание нового потокобезопасного словаря KV.
- func NewDictRec() *DictRec {
- sf := &DictRec{
- dict: map[rec_key.ARecKey]rec_kv.IRecKvFix{},
- block: d0.MutSafeMutex(),
- }
- _ = IDictRec(sf)
- return sf
- }
- // Get -- получение значения по ключу.
- func (sf *DictRec) Get(key rec_key.IRecKeyFix) *d0.Option[rec_kv.IRecKvFix] {
- sf.block.RLock()
- defer sf.block.RUnlock()
- rec, isOk := sf.dict[key.Get()]
- if !isOk {
- return d0.NewNone[rec_kv.IRecKvFix]()
- }
- return d0.NewSome(rec)
- }
- // Set -- установка значения по ключу.
- func (sf *DictRec) Set(rec rec_kv.IRecKvFix) *d0.Result[d0.Bool] {
- if rec == nil {
- err := d0.LetErr("DictRec.Set(): rec is nil")
- return d0.ResErr[d0.Bool](err)
- }
- sf.block.Lock()
- defer sf.block.Unlock()
- sf.dict[rec.Key().Get()] = rec
- return d0.ResOk(d0.Bool(true))
- }
- // Del -- удаление значения по ключу.
- func (sf *DictRec) Del(key rec_key.IRecKeyFix) {
- sf.block.Lock()
- defer sf.block.Unlock()
- delete(sf.dict, key.Get())
- }
- // Len -- количество элементов в словаре.
- func (sf *DictRec) Len() d0.Num {
- sf.block.RLock()
- defer sf.block.RUnlock()
- return d0.Num(len(sf.dict))
- }
|