Separated pool and linked list implementations.
This commit is contained in:
parent
575c83ef52
commit
f51a8ab74b
3 changed files with 42 additions and 39 deletions
|
@ -3,7 +3,7 @@ package main
|
||||||
import (
|
import (
|
||||||
"github.com/surdeus/godat/src/mapx"
|
"github.com/surdeus/godat/src/mapx"
|
||||||
"github.com/surdeus/godat/src/slicex"
|
"github.com/surdeus/godat/src/slicex"
|
||||||
"github.com/surdeus/godat/src/llx"
|
"github.com/surdeus/godat/src/poolx"
|
||||||
"fmt"
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -41,12 +41,12 @@ func main() {
|
||||||
fmt.Printf("%q\n", mapx.Reverse(m))
|
fmt.Printf("%q\n", mapx.Reverse(m))
|
||||||
fmt.Printf("%v\n", mapx.Reverse(m1))
|
fmt.Printf("%v\n", mapx.Reverse(m1))
|
||||||
|
|
||||||
ll := llx.NewComparable[int]()
|
ll := poolx.New[int]()
|
||||||
ll.Append(0)
|
ll.Append(0)
|
||||||
ll.Append(1)
|
ll.Append(1)
|
||||||
ll.Append(2)
|
ll.Append(2)
|
||||||
ll.Set(1, 256)
|
ll.Del(256)
|
||||||
ll.DelVal(256)
|
ll.Del(1)
|
||||||
for p := range ll.Range() {
|
for p := range ll.Range() {
|
||||||
fmt.Println(p)
|
fmt.Println(p)
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,18 +25,6 @@ type Pair[V any] struct {
|
||||||
V V
|
V V
|
||||||
}
|
}
|
||||||
|
|
||||||
type ComparableLinkedList[V comparable] struct {
|
|
||||||
*LinkedList[V]
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Returns new empty linked list storing any COMPARABLE values
|
|
||||||
// and adds a few more methods.
|
|
||||||
func NewComparable[V comparable]() *ComparableLinkedList[V] {
|
|
||||||
return &ComparableLinkedList[V]{
|
|
||||||
New[V](),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Returns new empty linked list storing the V type.
|
// Returns new empty linked list storing the V type.
|
||||||
func New[V any]() *LinkedList[V] {
|
func New[V any]() *LinkedList[V] {
|
||||||
|
@ -111,22 +99,6 @@ func (ll *LinkedList[V]) Del(i int) (bool) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deletes the first appearance of the value in the list.
|
|
||||||
func (cll *ComparableLinkedList[V]) DelVal(v V) bool {
|
|
||||||
i := 0
|
|
||||||
ll := cll.LinkedList
|
|
||||||
for p:= ll.before.next ; p != nil ; p = p.next {
|
|
||||||
if p.value == v {
|
|
||||||
ll.Del(i)
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
i++
|
|
||||||
}
|
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
// Push in the beginning of the list.
|
// Push in the beginning of the list.
|
||||||
func (ll *LinkedList[V]) Push(v V) {
|
func (ll *LinkedList[V]) Push(v V) {
|
||||||
prevNext := ll.before.next
|
prevNext := ll.before.next
|
||||||
|
@ -161,6 +133,22 @@ func (ll *LinkedList[V]) Append(v V) {
|
||||||
ll.ln++
|
ll.ln++
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ll *LinkedList[V]) First() *Element[V] {
|
||||||
|
return ll.before.next
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ll *Element[V]) Value() V {
|
||||||
|
return ll.value
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ll *Element[V]) Next() *Element[V] {
|
||||||
|
return ll.next
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ll *LinkedList[V]) Last() *Element[V] {
|
||||||
|
return ll.last
|
||||||
|
}
|
||||||
|
|
||||||
// Returns a channel of Pair that contains index and the value.
|
// Returns a channel of Pair that contains index and the value.
|
||||||
func (ll *LinkedList[V]) Range() chan Pair[V] {
|
func (ll *LinkedList[V]) Range() chan Pair[V] {
|
||||||
chn := make(chan Pair[V])
|
chn := make(chan Pair[V])
|
||||||
|
|
|
@ -10,14 +10,12 @@ import (
|
||||||
|
|
||||||
type Pool[V comparable] struct {
|
type Pool[V comparable] struct {
|
||||||
store *llx.LinkedList[V]
|
store *llx.LinkedList[V]
|
||||||
keys map[V] int
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns new empty pool.
|
// Return new empty pool.
|
||||||
func New[V comparable]() *Pool {
|
func New[V comparable]() *Pool[V] {
|
||||||
return &Pool{
|
return &Pool[V]{
|
||||||
llx.New[V]()
|
store: llx.New[V](),
|
||||||
0,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,6 +23,23 @@ func (p *Pool[V]) Append(v V) {
|
||||||
p.store.Append(v)
|
p.store.Append(v)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Deletes the first appearance of the value in the list.
|
||||||
func (p *Pool[V]) Del(v V) bool {
|
func (p *Pool[V]) Del(v V) bool {
|
||||||
|
i := 0
|
||||||
|
ll := p.store
|
||||||
|
for e := ll.First() ; e != nil ; e = e.Next() {
|
||||||
|
if e.Value() == v {
|
||||||
|
ll.Del(i)
|
||||||
return true
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
i++
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Pool[V]) Range() chan llx.Pair[V] {
|
||||||
|
return p.store.Range()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue