Reorganize state
This commit is contained in:
104
state/cell.go
Normal file
104
state/cell.go
Normal file
@ -0,0 +1,104 @@
|
||||
package state
|
||||
|
||||
const (
|
||||
statebit = 1 // the current state of the cell (for field)
|
||||
flagbit = statebit << 1 // whether or not the cell has been flagged as empty (for field)
|
||||
markbit = statebit << 2 // whether or not the cell has been flagged as full (for field)
|
||||
correctbit = statebit << 3 // whether or not the cell is correct (for field, section)
|
||||
completebit = statebit << 4 // whether or not the cell is complete (for section)
|
||||
)
|
||||
|
||||
// Cells {{{
|
||||
|
||||
// cell represents a single entry in the field managing various states.
|
||||
type cell byte
|
||||
|
||||
// state returns whether the cell is alive or dead.
|
||||
func (c cell) state() bool {
|
||||
return (c & statebit) != 0
|
||||
}
|
||||
|
||||
// correct returns whether or not the cell has been guessed correctly, or the section is made up of entirely correct guesses.
|
||||
func (c cell) correct() bool {
|
||||
return (c & correctbit) != 0
|
||||
}
|
||||
|
||||
// complete marks the section as complete (that is, all sections in its row/column are correct.
|
||||
func (c cell) complete() bool {
|
||||
return (c & completebit) != 0
|
||||
}
|
||||
|
||||
// flagged returns whether or not the cell is suspected to be dead.
|
||||
func (c cell) flagged() bool {
|
||||
return (c & flagbit) != 0
|
||||
}
|
||||
|
||||
// marked returns whether or not the cell is suspected to be alive.
|
||||
func (c cell) marked() bool {
|
||||
return (c & markbit) != 0
|
||||
}
|
||||
|
||||
// vivify sets the state of the cell to alive.
|
||||
func (c cell) vivify() cell {
|
||||
c = c | statebit
|
||||
if c.marked() {
|
||||
return c.setCorrect(true)
|
||||
} else {
|
||||
return c.setCorrect(false)
|
||||
}
|
||||
}
|
||||
|
||||
// kill sets the state of the cell to dead.
|
||||
func (c cell) kill() cell {
|
||||
c = c &^ statebit
|
||||
if c.flagged() {
|
||||
return c.setCorrect(true)
|
||||
} else {
|
||||
return c.setCorrect(false)
|
||||
}
|
||||
}
|
||||
|
||||
// setCorrect marks the cell as being guessed correctly, or the section being made up of entirely correct guesses.
|
||||
func (c cell) setCorrect(to bool) cell {
|
||||
if to {
|
||||
return c | correctbit
|
||||
} else {
|
||||
return c &^ correctbit
|
||||
}
|
||||
}
|
||||
|
||||
// setComplete marks the section as complete (that is, all sections in its row/column are correct).
|
||||
func (c cell) setComplete(to bool) cell {
|
||||
if to {
|
||||
return c | completebit
|
||||
} else {
|
||||
return c &^ completebit
|
||||
}
|
||||
}
|
||||
|
||||
// mark marks a bit as suspected alive.
|
||||
func (c cell) mark() cell {
|
||||
c |= markbit
|
||||
c = c &^ flagbit
|
||||
if c.state() {
|
||||
return c.setCorrect(true)
|
||||
} else {
|
||||
return c.setCorrect(false)
|
||||
}
|
||||
}
|
||||
|
||||
// flag marks a bit as suspected dead.
|
||||
func (c cell) flag() cell {
|
||||
c |= flagbit
|
||||
c = c &^ markbit
|
||||
if c.state() {
|
||||
return c.setCorrect(false)
|
||||
} else {
|
||||
return c.setCorrect(true)
|
||||
}
|
||||
}
|
||||
|
||||
// clear clears all bits except for the status.
|
||||
func (c cell) clear() cell {
|
||||
return c &^ (markbit | flagbit | correctbit | completebit)
|
||||
}
|
||||
Reference in New Issue
Block a user