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
|
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
|
// scalar implementation using a value pointer
|
||||||
|
|
||||||
func NewScalar[V any]() Ptr[V] {
|
func NewScalar[V any]() Ptr[V] {
|
||||||
|
@ -82,16 +20,16 @@ func NewVP[V any](vp *V) Ptr[V] {
|
||||||
// scalar implementation using accessor functions
|
// scalar implementation using accessor functions
|
||||||
|
|
||||||
type acc[V any] struct {
|
type acc[V any] struct {
|
||||||
*scb[V]
|
started bool
|
||||||
getter func() V
|
getter func() V
|
||||||
setter func(v V)
|
setter func(v V)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewAcc[V any](g func() V, s func(v V)) *acc[V] {
|
func NewAcc[V any](g func() V, s func(v V)) *acc[V] {
|
||||||
return &acc[V]{
|
return &acc[V]{
|
||||||
getter: g,
|
started: false,
|
||||||
setter: s,
|
getter: g,
|
||||||
scb: &scb[V]{false},
|
setter: s,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -104,6 +42,14 @@ func (p *acc[V]) Insert(v V, pos int) Ptr[V] {
|
||||||
return p.Append(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 {
|
func (p *acc[V]) Value() V {
|
||||||
return p.getter()
|
return p.getter()
|
||||||
}
|
}
|
||||||
|
@ -113,11 +59,29 @@ func (p *acc[V]) Set(v V) Ptr[V] {
|
||||||
return p
|
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] {
|
func (p *acc[V]) Clone() Ptr[V] {
|
||||||
return &acc[V]{
|
return &acc[V]{
|
||||||
getter: p.getter,
|
started: p.started,
|
||||||
setter: p.setter,
|
getter: p.getter,
|
||||||
scb: &scb[V]{p.started},
|
setter: p.setter,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,9 @@ func PtrValuePointerTest(t *testing.T) {
|
||||||
sp3.Set(46)
|
sp3.Set(46)
|
||||||
t.AssertEqual(sp3.Value(), 46)
|
t.AssertEqual(sp3.Value(), 46)
|
||||||
t.AssertEqual(sp1.Value(), 46)
|
t.AssertEqual(sp1.Value(), 46)
|
||||||
|
sp4 := sp1.Reset()
|
||||||
|
sp4.Append(33)
|
||||||
|
t.AssertEqual(sp4.Value(), 33)
|
||||||
}
|
}
|
||||||
|
|
||||||
func PtrScalarTest(t *testing.T) {
|
func PtrScalarTest(t *testing.T) {
|
||||||
|
|
Loading…
Add table
Reference in a new issue