| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- // package def_move -- параметрический контейнер с семантикой перемещения.
- package def_move
- import (
- "reflect"
- "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/def_spec_base"
- "gitp78su.ipnodns.ru/svi/kern/v4/d0/defs/table/owner"
- "gitp78su.ipnodns.ru/svi/kern/v4/d0/helpers"
- )
- // Move -- параметрический контейнер с семантикой перемещения
- type Move[T any] struct {
- owner *owner.LOwner
- val *T // Фактическое значение
- }
- const (
- str5 = def_spec_base.Txt("NewBox(): val==nil")
- )
- // NewMove -- возвращает новый параметрический контейнер с семантикой перемещения
- func NewMove[T any](owner *owner.LOwner, val T) *Move[T] {
- helpers.If(owner == nil).Hassert("NewMove[%T](): owner==nil", val)
- v := reflect.ValueOf(val)
- switch v.Kind() {
- case reflect.Pointer, reflect.Slice, reflect.Map, reflect.Chan, reflect.Func, reflect.Interface:
- isNil := def_spec_base.Bool(v.IsNil())
- helpers.If(isNil).Hassert(str5)
- }
- sf := &Move[T]{
- owner: owner,
- val: &val,
- }
- return sf
- }
- // Set -- устанавливает внутреннее значение
- func (sf *Move[T]) Set(val T) {
- sf.owner.Pass().CheckOwner()
- v := reflect.ValueOf(val)
- switch v.Kind() {
- case reflect.Pointer, reflect.Slice, reflect.Map, reflect.Chan, reflect.Func, reflect.Interface:
- isNil := def_spec_base.Bool(v.IsNil())
- helpers.If(isNil).Hassert(str5)
- }
- sf.val = &val
- }
- // Move -- перемещает другому владельцу хранимое значение
- func (sf *Move[T]) Move() T {
- sf.owner.Pass().CheckOwner()
- defer func() {
- sf.val = nil
- }()
- helpers.If(sf.val == nil).Hassert("Box.Move[%T]: val already moved", sf.val)
- return *sf.val
- }
|