| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- // package lst_sort -- сортированный список значений контекста.
- package lst_sort
- import (
- "sort"
- "sync"
- mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
- mKt "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec"
- )
- // LstSort -- сортированный список значений контекста.
- type LstSort struct {
- sync.RWMutex
- lstVal []mKt.ICtxValue // Сортированный список значений
- }
- // NewLstSort -- возвращает новый сортированный список значений контекста.
- func NewLstSort() *LstSort {
- sf := &LstSort{
- lstVal: []mKt.ICtxValue{},
- }
- return sf
- }
- // Add -- добавляет значение в список.
- func (sf *LstSort) Add(val mKt.ICtxValue) {
- sf.Lock()
- defer sf.Unlock()
- mL0.Hassert(val != nil, "LstSort.Add(): ICtxValue==nil")
- sf.lstVal = append(sf.lstVal, val)
- sf.sort()
- }
- // Del -- удаляет элемент из списка.
- func (sf *LstSort) Del(val mKt.ICtxValue) {
- sf.Lock()
- defer sf.Unlock()
- if val == nil {
- return
- }
- sf.del(val)
- }
- // List -- возвращает сортированный список.
- func (sf *LstSort) List() []mKt.ICtxValue {
- sf.RLock()
- defer sf.RUnlock()
- return sf.list()
- }
- // Size -- возвращает длину списка.
- func (sf *LstSort) Size() int {
- sf.RLock()
- defer sf.RUnlock()
- return len(sf.lstVal)
- }
- // Get -- возвращает по индексу.
- func (sf *LstSort) Get(ind int) mKt.ICtxValue {
- sf.RLock()
- defer sf.RUnlock()
- mL0.Hassert(ind >= 0, "LstSort.Get(): ind(%v)<0", ind)
- mL0.Hassert(ind < len(sf.lstVal), "LstSort.Get(): ind(%v)>=len(%v)", ind, len(sf.lstVal))
- return sf.lstVal[ind]
- }
- // удаляет элемент из списка.
- func (sf *LstSort) del(val mKt.ICtxValue) {
- var (
- ind int
- _val mKt.ICtxValue
- )
- for ind, _val = range sf.lstVal {
- if val == _val {
- break
- }
- _val = nil
- }
- if _val == nil {
- return
- }
- lst0 := sf.lstVal[:ind]
- lst1 := []mKt.ICtxValue{}
- if ind < len(sf.lstVal)-1 {
- lst1 = sf.lstVal[ind+1:]
- }
- sf.lstVal = sf.lstVal[:0]
- sf.lstVal = append(sf.lstVal, lst0...)
- sf.lstVal = append(sf.lstVal, lst1...)
- sf.sort()
- }
- // возвращает сортированный список.
- func (sf *LstSort) list() []mKt.ICtxValue {
- lst := make([]mKt.ICtxValue, 0, len(sf.lstVal))
- lst = append(lst, sf.lstVal...)
- return lst
- }
- // Сортирует элементы в списке.
- func (sf *LstSort) sort() {
- sort.Sort(sf)
- }
- // Swap -- НЕ ИСПОЛЬЗОВАТЬ меняет местами два элемента.
- func (sf *LstSort) Swap(ind1, ind2 int) {
- sf.lstVal[ind1], sf.lstVal[ind2] = sf.lstVal[ind2], sf.lstVal[ind1]
- }
- // Less -- НЕ ИСПОЛЬЗОВАТЬ сравнивает элементы по индексам.
- func (sf *LstSort) Less(ind1, ind2 int) bool {
- return sf.lstVal[ind1].Key() < sf.lstVal[ind2].Key()
- }
- // Len -- НЕ ИСПОЛЬЗОВАТЬ возвращает длину списка.
- func (sf *LstSort) Len() int {
- return len(sf.lstVal)
- }
|