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 }