quark_base.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. // package quark_base -- базовый кварк.
  2. package quark_base
  3. import (
  4. // mKh "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers".
  5. "fmt"
  6. "gitp78su.ipnodns.ru/svi/kern/v4/lev0/quark/quark_val"
  7. )
  8. // QBase -- базовый кварк.
  9. type QBase[M quark_val.CMod, T any] struct {
  10. mass int // Масса кварка
  11. val *quark_val.Val[M, T] // хранимое значение
  12. }
  13. // QBaseOpt -- опции для базового кварка.
  14. type QBaseOpt[M quark_val.CMod, T any] func(qBase *QBase[M, T])
  15. // QBaseOptMass -- опция для массы кварка.
  16. func QBaseOptMass[M quark_val.CMod, T any](mass int) QBaseOpt[M, T] {
  17. return func(sf *QBase[M, T]) {
  18. sf.mass = mass
  19. }
  20. }
  21. // QBaseOptVal -- опция для значения кварка.
  22. func QBaseOptVal[M quark_val.Fix, T any](val T) QBaseOpt[quark_val.Fix, T] {
  23. return func(qBase *QBase[quark_val.Fix, T]) {
  24. qBase.val = quark_val.NewVal(val)
  25. }
  26. }
  27. // QBaseOptValMut -- опция для изменяемого значения кварка.
  28. func QBaseOptValMut[M quark_val.Mut, T any](val T) QBaseOpt[quark_val.Mut, T] {
  29. return func(sf *QBase[quark_val.Mut, T]) {
  30. sf.val = quark_val.NewValMut(val)
  31. }
  32. }
  33. // NewQBase -- создать новый фиксированный базовый кварк.
  34. func NewQBase[M quark_val.Fix, T any](opts ...QBaseOpt[M, T]) *QBase[M, T] {
  35. sf := &QBase[M, T]{}
  36. for _, opt := range opts {
  37. opt(sf)
  38. }
  39. if sf.mass <= 0 {
  40. panic(fmt.Sprintf("NewQBase(): нулевая масса запрещена! mass=%v\n", sf.mass))
  41. }
  42. if sf.val == nil {
  43. panic("NewQBase(): значение не создано! val==nil\n")
  44. }
  45. return sf
  46. }
  47. // NewQBaseMut -- создать новый мутабельный базовый кварк.
  48. func NewQBaseMut[M quark_val.Mut, T any](opts ...QBaseOpt[M, T]) *QBase[M, T] {
  49. sf := &QBase[M, T]{}
  50. for _, opt := range opts {
  51. opt(sf)
  52. }
  53. if sf.mass <= 0 {
  54. panic("NewQBaseMut(): нулевая масса запрещена!\n")
  55. }
  56. return sf
  57. }
  58. // Mass -- получить массу кварка.
  59. //
  60. //go:fix inline
  61. func (sf *QBase[M, T]) Mass() int {
  62. return sf.mass
  63. }
  64. // Val -- возвращает хранимое значение.
  65. func (sf *QBase[M, T]) Val() *quark_val.Val[M, T] {
  66. return sf.val
  67. }