|
|
- package common
-
- import (
- "bytes"
- "sort"
- )
-
- var (
- Zero256 = Word256{0}
- One256 = Word256{1}
- )
-
- type Word256 [32]byte
-
- func (w Word256) String() string { return string(w[:]) }
- func (w Word256) TrimmedString() string { return TrimmedString(w.Bytes()) }
- func (w Word256) Copy() Word256 { return w }
- func (w Word256) Bytes() []byte { return w[:] } // copied.
- func (w Word256) Prefix(n int) []byte { return w[:n] }
- func (w Word256) Postfix(n int) []byte { return w[32-n:] }
- func (w Word256) IsZero() bool {
- accum := byte(0)
- for _, byt := range w {
- accum |= byt
- }
- return accum == 0
- }
- func (w Word256) Compare(other Word256) int {
- return bytes.Compare(w[:], other[:])
- }
-
- func Uint64ToWord256(i uint64) Word256 {
- buf := [8]byte{}
- PutUint64BE(buf[:], i)
- return LeftPadWord256(buf[:])
- }
-
- func Int64ToWord256(i int64) Word256 {
- buf := [8]byte{}
- PutInt64BE(buf[:], i)
- return LeftPadWord256(buf[:])
- }
-
- func RightPadWord256(bz []byte) (word Word256) {
- copy(word[:], bz)
- return
- }
-
- func LeftPadWord256(bz []byte) (word Word256) {
- copy(word[32-len(bz):], bz)
- return
- }
-
- func Uint64FromWord256(word Word256) uint64 {
- buf := word.Postfix(8)
- return GetUint64BE(buf)
- }
-
- func Int64FromWord256(word Word256) int64 {
- buf := word.Postfix(8)
- return GetInt64BE(buf)
- }
-
- //-------------------------------------
-
- type Tuple256 struct {
- First Word256
- Second Word256
- }
-
- func (tuple Tuple256) Compare(other Tuple256) int {
- firstCompare := tuple.First.Compare(other.First)
- if firstCompare == 0 {
- return tuple.Second.Compare(other.Second)
- }
- return firstCompare
- }
-
- func Tuple256Split(t Tuple256) (Word256, Word256) {
- return t.First, t.Second
- }
-
- type Tuple256Slice []Tuple256
-
- func (p Tuple256Slice) Len() int { return len(p) }
- func (p Tuple256Slice) Less(i, j int) bool {
- return p[i].Compare(p[j]) < 0
- }
- func (p Tuple256Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
- func (p Tuple256Slice) Sort() { sort.Sort(p) }
|