common/ptr: fix scalar implementation

This commit is contained in:
Helmut Merz 2023-07-26 14:57:24 +02:00
parent 10386651a4
commit 7b191b1eb2
2 changed files with 38 additions and 71 deletions

View file

@ -1,67 +1,5 @@
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] {
@ -82,16 +20,16 @@ func NewVP[V any](vp *V) Ptr[V] {
// scalar implementation using accessor functions
type acc[V any] struct {
*scb[V]
getter func() V
setter func(v V)
started bool
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},
started: false,
getter: g,
setter: s,
}
}
@ -104,6 +42,14 @@ func (p *acc[V]) Insert(v V, pos int) Ptr[V] {
return p.Append(v)
}
func (p *acc[V]) Next() Ptr[V] {
if p.started {
return nil
}
p.started = true
return p
}
func (p *acc[V]) Value() V {
return p.getter()
}
@ -113,11 +59,29 @@ func (p *acc[V]) Set(v V) Ptr[V] {
return p
}
func (p *acc[V]) Size() int {
return 1
}
func (p *acc[V]) Started() bool {
return p.started
}
func (p *acc[V]) Seek(i int) Ptr[V] {
p.started = true
return p
}
func (p *acc[V]) Reset() Ptr[V] {
p.started = false
return p
}
func (p *acc[V]) Clone() Ptr[V] {
return &acc[V]{
getter: p.getter,
setter: p.setter,
scb: &scb[V]{p.started},
started: p.started,
getter: p.getter,
setter: p.setter,
}
}

View file

@ -63,6 +63,9 @@ func PtrValuePointerTest(t *testing.T) {
sp3.Set(46)
t.AssertEqual(sp3.Value(), 46)
t.AssertEqual(sp1.Value(), 46)
sp4 := sp1.Reset()
sp4.Append(33)
t.AssertEqual(sp4.Value(), 33)
}
func PtrScalarTest(t *testing.T) {