Select Git revision
signature.go
bc_ternary_multiplexer.go 1.20 KiB
package ternary
import (
"errors"
"strconv"
. "github.com/iotaledger/iota.go/trinary"
)
type BCTernaryMultiplexer struct {
trinaries []Trits
}
func NewBCTernaryMultiplexer() *BCTernaryMultiplexer {
this := &BCTernaryMultiplexer{make([]Trits, 0)}
return this
}
func (this *BCTernaryMultiplexer) Add(trits Trits) int {
this.trinaries = append(this.trinaries, trits)
return len(this.trinaries) - 1
}
func (this *BCTernaryMultiplexer) Get(index int) Trits {
return this.trinaries[index]
}
func (this *BCTernaryMultiplexer) Extract() (BCTrits, error) {
trinariesCount := len(this.trinaries)
tritsCount := len(this.trinaries[0])
result := BCTrits{
Lo: make([]uint, tritsCount),
Hi: make([]uint, tritsCount),
}
for i := 0; i < tritsCount; i++ {
bcTrit := &BCTrit{0, 0}
for j := 0; j < trinariesCount; j++ {
switch this.trinaries[j][i] {
case -1:
bcTrit.Lo |= 1 << uint(j)
case 1:
bcTrit.Hi |= 1 << uint(j)
case 0:
bcTrit.Lo |= 1 << uint(j)
bcTrit.Hi |= 1 << uint(j)
default:
return result, errors.New("Invalid trit #" + strconv.Itoa(i) + " in trits #" + strconv.Itoa(j))
}
}
result.Lo[i] = bcTrit.Lo
result.Hi[i] = bcTrit.Hi
}
return result, nil
}