// 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 }