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