ctx_value.go 2.3 KB

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