Move count into struct
This commit is contained in:
@@ -2,32 +2,33 @@ package state
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"maps"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
type node struct {
|
type node struct {
|
||||||
symbol byte
|
symbol byte
|
||||||
count int
|
count int
|
||||||
|
index int
|
||||||
}
|
}
|
||||||
|
|
||||||
type State struct {
|
type State struct {
|
||||||
nodes []*node
|
nodes []*node
|
||||||
bySymbol map[byte]int
|
bySymbol map[byte]*node
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewState() *State {
|
func NewState() *State {
|
||||||
st := &State{
|
st := &State{
|
||||||
bySymbol: map[byte]int{},
|
bySymbol: map[byte]*node{},
|
||||||
}
|
}
|
||||||
|
|
||||||
for i := 0; i < 256; i++ {
|
for i := 0; i < 256; i++ {
|
||||||
node := &node{
|
node := &node{
|
||||||
symbol: byte(i),
|
symbol: byte(i),
|
||||||
|
index: i,
|
||||||
}
|
}
|
||||||
|
|
||||||
st.nodes = append(st.nodes, node)
|
st.nodes = append(st.nodes, node)
|
||||||
st.bySymbol[node.symbol] = i
|
st.bySymbol[node.symbol] = node
|
||||||
}
|
}
|
||||||
|
|
||||||
return st
|
return st
|
||||||
@@ -35,12 +36,13 @@ func NewState() *State {
|
|||||||
|
|
||||||
func (st State) Clone() *State {
|
func (st State) Clone() *State {
|
||||||
st2 := &State{
|
st2 := &State{
|
||||||
bySymbol: maps.Clone(st.bySymbol),
|
bySymbol: map[byte]*node{},
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, node := range st.nodes {
|
for _, node := range st.nodes {
|
||||||
tmp := *node
|
tmp := *node
|
||||||
st2.nodes = append(st2.nodes, &tmp)
|
st2.nodes = append(st2.nodes, &tmp)
|
||||||
|
st2.bySymbol[tmp.symbol] = &tmp
|
||||||
}
|
}
|
||||||
|
|
||||||
return st2
|
return st2
|
||||||
@@ -48,10 +50,11 @@ func (st State) Clone() *State {
|
|||||||
|
|
||||||
// Returns old index
|
// Returns old index
|
||||||
func (st *State) IncrementSymbol(symbol byte) int {
|
func (st *State) IncrementSymbol(symbol byte) int {
|
||||||
nodeIndex := st.bySymbol[symbol]
|
node := st.bySymbol[symbol]
|
||||||
st.nodes[nodeIndex].count++
|
node.count++
|
||||||
|
origIndex := node.index
|
||||||
|
|
||||||
for iterIndex := nodeIndex; iterIndex > 0; iterIndex-- {
|
for iterIndex := origIndex; iterIndex > 0; iterIndex-- {
|
||||||
prevIndex := iterIndex - 1
|
prevIndex := iterIndex - 1
|
||||||
iterNode := st.nodes[iterIndex]
|
iterNode := st.nodes[iterIndex]
|
||||||
prevNode := st.nodes[prevIndex]
|
prevNode := st.nodes[prevIndex]
|
||||||
@@ -62,11 +65,11 @@ func (st *State) IncrementSymbol(symbol byte) int {
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
st.nodes[iterIndex], st.nodes[prevIndex] = prevNode, iterNode
|
st.nodes[iterNode.index], st.nodes[prevNode.index] = prevNode, iterNode
|
||||||
st.bySymbol[iterNode.symbol], st.bySymbol[prevNode.symbol] = prevIndex, iterIndex
|
prevNode.index, iterNode.index = iterIndex, prevIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
return nodeIndex
|
return origIndex
|
||||||
}
|
}
|
||||||
|
|
||||||
func (st State) String() string {
|
func (st State) String() string {
|
||||||
|
|||||||
Reference in New Issue
Block a user