go-scopes/common/ptr/scalar.go

130 lines
1.8 KiB
Go

package ptr
// scb: scalar base / common stuff
type scb[V any] struct {
started bool
}
func (p *scb[V]) Size() int {
return 1
}
func (p *scb[V]) Started() bool {
return p.started
}
func (p *scb[V]) Append(v V) Ptr[V] {
p.started = true
return p.Set(v)
}
func (p *scb[V]) Insert(v V, pos int) Ptr[V] {
return p.Append(v)
}
func (p *scb[V]) Next() Ptr[V] {
if p.started {
return nil
}
p.started = true
return p
}
func (p *scb[V]) Value() V {
var v V
return v
}
func (p *scb[V]) Set(v V) Ptr[V] {
return p
}
func (p *scb[V]) Seek(i int) Ptr[V] {
p.started = true
return p
}
func (p *scb[V]) Reset() Ptr[V] {
p.started = false
return p
}
func (p *scb[V]) Clone() Ptr[V] {
return &scb[V]{p.started}
}
func (p *scb[V]) New() Ptr[V] {
return New[V](p)
}
func (p *scb[V]) Copy() Ptr[V] {
return Copy[V](p, &scb[V]{false})
}
// scalar implementation using a value pointer
func NewScalar[V any]() Ptr[V] {
var v V
return NewVP(&v)
}
func NewVP[V any](vp *V) Ptr[V] {
get := func() V {
return *vp
}
set := func(v V) {
*vp = v
}
return NewAcc(get, set)
}
// scalar implementation using accessor functions
type acc[V any] struct {
*scb[V]
getter func() V
setter func(v V)
}
func NewAcc[V any](g func() V, s func(v V)) *acc[V] {
return &acc[V]{
getter: g,
setter: s,
scb: &scb[V]{false},
}
}
func (p *acc[V]) Append(v V) Ptr[V] {
p.started = true
return p.Set(v)
}
func (p *acc[V]) Insert(v V, pos int) Ptr[V] {
return p.Append(v)
}
func (p *acc[V]) Value() V {
return p.getter()
}
func (p *acc[V]) Set(v V) Ptr[V] {
p.setter(v)
return p
}
func (p *acc[V]) Clone() Ptr[V] {
return &acc[V]{
getter: p.getter,
setter: p.setter,
scb: &scb[V]{p.started},
}
}
func (p *acc[V]) New() Ptr[V] {
return New[V](p)
}
func (p *acc[V]) Copy() Ptr[V] {
return Copy[V](p, NewScalar[V]())
}