github.com/insolar/vanilla@v0.0.0-20201023172447-248fdf805322/longbits/bit_reader.go (about)

     1  // Copyright 2020 Insolar Network Ltd.
     2  // All rights reserved.
     3  // This material is licensed under the Insolar License version 1.0,
     4  // available at https://github.com/insolar/assured-ledger/blob/master/LICENSE.md.
     5  
     6  package longbits
     7  
     8  import (
     9  	"io"
    10  	"math/bits"
    11  )
    12  
    13  type bitReader struct {
    14  	accumulator byte
    15  	accInit     byte
    16  	accBit      byte
    17  }
    18  
    19  func (p *bitReader) _rightShift() bool {
    20  	switch p.accInit {
    21  	case initLSB:
    22  		return false
    23  	case initMSB:
    24  		return true
    25  	default:
    26  		panic("illegal state")
    27  	}
    28  }
    29  
    30  func (p *bitReader) align() (rightShift bool, ofs uint8) {
    31  	if p._rightShift() {
    32  		if p.accBit == 0 {
    33  			return true, 0
    34  		}
    35  		return true, uint8(bits.LeadingZeros8(p.accBit))
    36  	}
    37  	if p.accBit == 0 {
    38  		return false, 0
    39  	}
    40  	return false, uint8(bits.TrailingZeros8(p.accBit))
    41  }
    42  
    43  func (p *bitReader) AlignOffset() uint8 {
    44  	_, ofs := p.align()
    45  	return ofs
    46  }
    47  
    48  func (p *bitReader) ensure(readFn func() (byte, error)) error {
    49  	if p.accBit != 0 {
    50  		return nil
    51  	}
    52  	if p.accInit == 0 {
    53  		p.accInit = initLSB
    54  	}
    55  	b, err := readFn()
    56  	if err != nil {
    57  		return err
    58  	}
    59  	p.accumulator = b
    60  	p.accBit = p.accInit
    61  	return nil
    62  }
    63  
    64  func (p *bitReader) readNext(readFn func() (byte, error)) (int, error) {
    65  	if e := p.ensure(readFn); e != nil {
    66  		return 0, e
    67  	}
    68  
    69  	m := p.accBit
    70  	if rightShift, _ := p.align(); rightShift {
    71  		p.accBit >>= 1
    72  	} else {
    73  		p.accBit <<= 1
    74  	}
    75  	return int(p.accumulator & m), nil
    76  }
    77  
    78  func (p *bitReader) readByte(readFn func() (byte, error)) (byte, error) {
    79  	switch p.accBit {
    80  	case 0:
    81  		if p.accInit == 0 {
    82  			p.accInit = initLSB
    83  		}
    84  		if p._rightShift() {
    85  			v, e := readFn()
    86  			return bits.Reverse8(v), e
    87  		}
    88  		return readFn()
    89  	case p.accInit:
    90  		p.accBit = 0
    91  		if p._rightShift() {
    92  			return bits.Reverse8(p.accumulator), nil
    93  		}
    94  		return p.accumulator, nil
    95  	}
    96  
    97  	v := p.accumulator
    98  	b, err := readFn()
    99  	if err != nil {
   100  		return 0, err
   101  	}
   102  	p.accumulator = b
   103  
   104  	w := p.accumulator
   105  	if rightShift, usedBits := p.align(); rightShift {
   106  		v <<= usedBits
   107  		w >>= 8 - usedBits
   108  		v = bits.Reverse8(v | w)
   109  	} else {
   110  		v >>= usedBits
   111  		w <<= 8 - usedBits
   112  		v |= w
   113  	}
   114  
   115  	return v, nil
   116  }
   117  
   118  func (p *bitReader) readSubByte(bitLen uint8, readFn func() (byte, error)) (uint8, error) {
   119  	switch {
   120  	case bitLen == 0:
   121  		return 0, nil
   122  	case bitLen == 1:
   123  		switch v, e := p.readNext(readFn); {
   124  		case e != nil:
   125  			return 0, e
   126  		case v != 0:
   127  			return 1, nil
   128  		default:
   129  			return 0, nil
   130  		}
   131  	case bitLen == 8:
   132  		return p.readByte(readFn)
   133  	case bitLen > 8:
   134  		panic("illegal value")
   135  	}
   136  
   137  	if e := p.ensure(readFn); e != nil {
   138  		return 0, e
   139  	}
   140  
   141  	rightShift, usedBits := p.align()
   142  	remainBits := 8 - usedBits
   143  
   144  	if bitLen <= remainBits {
   145  		if rightShift {
   146  			p.accBit >>= bitLen
   147  			v := p.accumulator
   148  			if p.accBit != 0 {
   149  				v &^= (p.accBit << 1) - 1
   150  			}
   151  			return bits.Reverse8(v << usedBits), nil
   152  		}
   153  
   154  		p.accBit <<= bitLen
   155  		v := p.accumulator & (p.accBit - 1)
   156  		return v >> usedBits, nil
   157  	}
   158  	bitLen -= remainBits
   159  
   160  	v := p.accumulator
   161  	p.accBit = 0
   162  	if e := p.ensure(readFn); e != nil {
   163  		return 0, e
   164  	}
   165  
   166  	if rightShift {
   167  		p.accBit >>= bitLen
   168  		v &= 0xFF >> usedBits
   169  		w := uint16(v)<<8 | uint16(p.accumulator)
   170  		w <<= bitLen
   171  		v = uint8(w >> 8)
   172  		v <<= usedBits - bitLen
   173  		v = bits.Reverse8(v)
   174  	} else {
   175  		p.accBit <<= bitLen
   176  		v &= 0xFF << usedBits
   177  		w := uint16(v) | uint16(p.accumulator)<<8
   178  		w >>= bitLen
   179  		v = uint8(w)
   180  		v >>= usedBits - bitLen
   181  	}
   182  	return v, nil
   183  }
   184  
   185  func newBitReader(order BitBuilderOrder) bitReader {
   186  	switch order {
   187  	case LSB:
   188  		return bitReader{accInit: initLSB}
   189  	case MSB:
   190  		return bitReader{accInit: initMSB}
   191  	default:
   192  		panic("illegal value")
   193  	}
   194  }
   195  
   196  func NewBitIoReader(order BitBuilderOrder, byteReader io.ByteReader) *BitIoReader {
   197  	if byteReader == nil {
   198  		panic("illegal value")
   199  	}
   200  	return &BitIoReader{byteReader: byteReader, bitReader: newBitReader(order)}
   201  }
   202  
   203  type BitIoReader struct {
   204  	byteReader io.ByteReader
   205  	bitReader
   206  }
   207  
   208  func (p *BitIoReader) ReadBool() (bool, error) {
   209  	v, e := p.ReadNext()
   210  	return v != 0, e
   211  }
   212  
   213  func (p *BitIoReader) ReadBit() (int, error) {
   214  	v, e := p.ReadNext()
   215  	if v != 0 {
   216  		return 1, e
   217  	}
   218  	return 0, e
   219  }
   220  
   221  func (p *BitIoReader) ReadNext() (int, error) {
   222  	return p.readNext(p.byteReader.ReadByte)
   223  }
   224  
   225  func (p *BitIoReader) ReadByte() (byte, error) {
   226  	return p.readByte(p.byteReader.ReadByte)
   227  }
   228  
   229  func (p *BitIoReader) ReadSubByte(bitLen uint8) (byte, error) {
   230  	return p.readSubByte(bitLen, p.byteReader.ReadByte)
   231  }
   232  
   233  func NewBitArrayReader(direction BitBuilderOrder, bytes []byte) *BitArrayReader {
   234  	return &BitArrayReader{bytes: bytes, bitReader: newBitReader(direction)}
   235  }
   236  
   237  type BitArrayReader struct {
   238  	bytes []byte
   239  	bitReader
   240  }
   241  
   242  func (p *BitArrayReader) _read() (uint8, error) {
   243  	v := p.bytes[0]
   244  	p.bytes = p.bytes[1:]
   245  	return v, nil
   246  }
   247  
   248  func (p *BitArrayReader) IsArrayDepleted() bool {
   249  	return len(p.bytes) == 0
   250  }
   251  
   252  func (p *BitArrayReader) ReadBool() (bool, error) {
   253  	v, e := p.ReadNext()
   254  	return v != 0, e
   255  }
   256  
   257  func (p *BitArrayReader) ReadBit() (int, error) {
   258  	v, e := p.ReadNext()
   259  	if v != 0 {
   260  		return 1, e
   261  	}
   262  	return 0, e
   263  }
   264  
   265  func (p *BitArrayReader) ReadNext() (int, error) {
   266  	return p.readNext(p._read)
   267  }
   268  
   269  func (p *BitArrayReader) ReadByte() (byte, error) {
   270  	return p.readByte(p._read)
   271  }
   272  
   273  func (p *BitArrayReader) ReadSubByte(bitLen uint8) (byte, error) {
   274  	return p.readSubByte(bitLen, p._read)
   275  }
   276  
   277  func NewBitStrReader(direction BitBuilderOrder, bytes ByteString) *BitStrReader {
   278  	return &BitStrReader{bytes: string(bytes), bitReader: newBitReader(direction)}
   279  }
   280  
   281  type BitStrReader struct {
   282  	bytes string
   283  	bitReader
   284  }
   285  
   286  func (p *BitStrReader) _read() (uint8, error) {
   287  	v := p.bytes[0]
   288  	p.bytes = p.bytes[1:]
   289  	return v, nil
   290  }
   291  
   292  func (p *BitStrReader) IsArrayDepleted() bool {
   293  	return len(p.bytes) == 0
   294  }
   295  
   296  func (p *BitStrReader) ReadBool() (bool, error) {
   297  	v, e := p.ReadNext()
   298  	return v != 0, e
   299  }
   300  
   301  func (p *BitStrReader) ReadBit() (int, error) {
   302  	v, e := p.ReadNext()
   303  	if v != 0 {
   304  		return 1, e
   305  	}
   306  	return 0, e
   307  }
   308  
   309  func (p *BitStrReader) ReadNext() (int, error) {
   310  	return p.readNext(p._read)
   311  }
   312  
   313  func (p *BitStrReader) ReadByte() (byte, error) {
   314  	return p.readByte(p._read)
   315  }
   316  
   317  func (p *BitStrReader) ReadSubByte(bitLen uint8) (byte, error) {
   318  	return p.readSubByte(bitLen, p._read)
   319  }