Move count into struct

This commit is contained in:
Ian Gulliver
2023-12-31 14:28:28 -08:00
parent b4edf15b40
commit 089e96dca3

View File

@@ -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 {