lst_sort.go 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. // package lst_sort -- сортированный список значений контекста.
  2. package lst_sort
  3. import (
  4. "sort"
  5. "sync"
  6. mL0 "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  7. mKs "gitp78su.ipnodns.ru/svi/kern/v4/lev0/kspec"
  8. )
  9. // LstSort -- сортированный список значений контекста.
  10. type LstSort struct {
  11. sync.RWMutex
  12. lstVal []mKs.ICtxValue // Сортированный список значений
  13. }
  14. // NewLstSort -- возвращает новый сортированный список значений контекста.
  15. func NewLstSort() *LstSort {
  16. sf := &LstSort{
  17. lstVal: []mKs.ICtxValue{},
  18. }
  19. return sf
  20. }
  21. // Add -- добавляет значение в список.
  22. func (sf *LstSort) Add(val mKs.ICtxValue) {
  23. sf.Lock()
  24. defer sf.Unlock()
  25. mL0.Hassert(val != nil, "LstSort.Add(): ICtxValue==nil")
  26. sf.lstVal = append(sf.lstVal, val)
  27. sf.sort()
  28. }
  29. // Del -- удаляет элемент из списка.
  30. func (sf *LstSort) Del(val mKs.ICtxValue) {
  31. sf.Lock()
  32. defer sf.Unlock()
  33. if val == nil {
  34. return
  35. }
  36. sf.del(val)
  37. }
  38. // List -- возвращает сортированный список.
  39. func (sf *LstSort) List() []mKs.ICtxValue {
  40. sf.RLock()
  41. defer sf.RUnlock()
  42. return sf.list()
  43. }
  44. // Size -- возвращает длину списка.
  45. func (sf *LstSort) Size() int {
  46. sf.RLock()
  47. defer sf.RUnlock()
  48. return len(sf.lstVal)
  49. }
  50. // Get -- возвращает по индексу.
  51. func (sf *LstSort) Get(ind int) mKs.ICtxValue {
  52. sf.RLock()
  53. defer sf.RUnlock()
  54. mL0.Hassert(ind >= 0, "LstSort.Get(): ind(%v)<0", ind)
  55. mL0.Hassert(ind < len(sf.lstVal), "LstSort.Get(): ind(%v)>=len(%v)", ind, len(sf.lstVal))
  56. return sf.lstVal[ind]
  57. }
  58. // удаляет элемент из списка.
  59. func (sf *LstSort) del(val mKs.ICtxValue) {
  60. var (
  61. ind int
  62. _val mKs.ICtxValue
  63. )
  64. for ind, _val = range sf.lstVal {
  65. if val == _val {
  66. break
  67. }
  68. _val = nil
  69. }
  70. if _val == nil {
  71. return
  72. }
  73. lst0 := sf.lstVal[:ind]
  74. lst1 := []mKs.ICtxValue{}
  75. if ind < len(sf.lstVal)-1 {
  76. lst1 = sf.lstVal[ind+1:]
  77. }
  78. sf.lstVal = sf.lstVal[:0]
  79. sf.lstVal = append(sf.lstVal, lst0...)
  80. sf.lstVal = append(sf.lstVal, lst1...)
  81. sf.sort()
  82. }
  83. // возвращает сортированный список.
  84. func (sf *LstSort) list() []mKs.ICtxValue {
  85. lst := make([]mKs.ICtxValue, 0, len(sf.lstVal))
  86. lst = append(lst, sf.lstVal...)
  87. return lst
  88. }
  89. // Сортирует элементы в списке.
  90. func (sf *LstSort) sort() {
  91. sort.Sort(sf)
  92. }
  93. // Swap -- НЕ ИСПОЛЬЗОВАТЬ меняет местами два элемента.
  94. func (sf *LstSort) Swap(ind1, ind2 int) {
  95. sf.lstVal[ind1], sf.lstVal[ind2] = sf.lstVal[ind2], sf.lstVal[ind1]
  96. }
  97. // Less -- НЕ ИСПОЛЬЗОВАТЬ сравнивает элементы по индексам.
  98. func (sf *LstSort) Less(ind1, ind2 int) bool {
  99. return sf.lstVal[ind1].Key() < sf.lstVal[ind2].Key()
  100. }
  101. // Len -- НЕ ИСПОЛЬЗОВАТЬ возвращает длину списка.
  102. func (sf *LstSort) Len() int {
  103. return len(sf.lstVal)
  104. }