ctx_value.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // package ctx_value -- потокобезопасное значение локального контекста.
  2. package ctx_value
  3. import (
  4. "sync"
  5. "gitp78su.ipnodns.ru/svi/kern/v4/lev0"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/core_spec"
  7. )
  8. // ICtxValue -- интерфейс к значению локального контекста.
  9. type ICtxValue interface {
  10. core_spec.IRWMutex
  11. // Key -- возвращает ключ значения
  12. Key() *lev0.LTxt
  13. // Val -- возвращает хранимое значение
  14. Val() any
  15. // CreateAt -- возвращает метку времени создания
  16. CreateAt() *lev0.LTime
  17. // UpdateAt -- возвращает метку времени обновления
  18. UpdateAt() *lev0.MTime
  19. // Comment -- возвращает комментарий значения
  20. Comment() *lev0.LTxt
  21. }
  22. // CtxValue -- потокобезопасное значение локального контекста.
  23. type CtxValue struct {
  24. sync.RWMutex
  25. key *lev0.LTxt
  26. createAt *lev0.LTime
  27. Val_ any
  28. UpdateAt_ *lev0.MTime
  29. Comment_ *lev0.LTxt
  30. }
  31. // NewCtxValue -- возвращает новое потокобезопасное значение локального контекста.
  32. func NewCtxValue[T lev0.TxtConstraint](key lev0.ATxt, val any, comment T) ICtxValue {
  33. lev0.If(key == "").Hassert("NewCtxValue(): key is empty", []any{})
  34. sf := &CtxValue{
  35. key: lev0.LetTxt(key),
  36. createAt: lev0.LetTimeAuto(),
  37. UpdateAt_: lev0.MutTimeAuto(),
  38. Val_: val,
  39. Comment_: lev0.LetTxt(comment),
  40. }
  41. return sf
  42. }
  43. // Key -- возвращает ключ значения.
  44. func (sf *CtxValue) Key() *lev0.LTxt {
  45. return sf.key
  46. }
  47. // Val -- возвращает хранимое значение.
  48. func (sf *CtxValue) Val() any {
  49. sf.RLock()
  50. defer sf.RUnlock()
  51. return sf.Val_
  52. }
  53. // UpdateAt -- возвращает время обновления значения.
  54. func (sf *CtxValue) UpdateAt() *lev0.MTime {
  55. sf.RLock()
  56. defer sf.RUnlock()
  57. return sf.UpdateAt_
  58. }
  59. // CreateAt -- возвращает время создания значения.
  60. func (sf *CtxValue) CreateAt() *lev0.LTime {
  61. return sf.createAt
  62. }
  63. // Comment -- возвращает комментарий значения.
  64. func (sf *CtxValue) Comment() *lev0.LTxt {
  65. sf.RLock()
  66. defer sf.RUnlock()
  67. return sf.Comment_
  68. }