// package def_move -- параметрический контейнер с семантикой перемещения. package def_move import ( "reflect" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_base" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/defs/def_spec_fn" "gitp78su.ipnodns.ru/svi/kern/v4/lev0/helpers" ) // Move -- параметрический контейнер с семантикой перемещения type Move[T any] struct { type_ def_spec_base.Txt val *T // Фактическое значение } const ( str5 = def_spec_base.Txt("NewBox(): val==nil") ) // NewMove -- возвращает новый параметрический контейнер с семантикой перемещения func NewMove[T any](val T) *Move[T] { 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]{ val: &val, type_: def_spec_fn.Sprintf("%T", val), } return sf } // Set -- устанавливает внутреннее значение func (sf *Move[T]) Set(val T) { 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 { defer func() { sf.val = nil }() helpers.If(sf.val == nil).Hassert("Box.Move[%v]: val already moved", sf.type_) return *sf.val }