common/ptr: fix scalar implementation
This commit is contained in:
parent
10386651a4
commit
7b191b1eb2
2 changed files with 38 additions and 71 deletions
|
@ -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,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
Loading…
Add table
Reference in a new issue