Overview
Comment: | Use a lookup table for fibonacci's encoding of bytes. |
---|---|
Downloads: | Tarball | ZIP archive | SQL archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
9ded78a6597b6db8e07d755976eac376 |
User & Date: | spaskalev on 2015-01-04 16:45:56 |
Other Links: | manifest | tags |
Context
2015-01-10
| ||
21:28 | encoding/mtf optimizations check-in: 5c9c0a2164 user: spaskalev tags: trunk | |
2015-01-04
| ||
16:45 | Use a lookup table for fibonacci's encoding of bytes. check-in: 9ded78a659 user: spaskalev tags: trunk | |
12:52 | commands/mtf now uses fibonacci representation when encoding check-in: 6bd6e6d5c7 user: spaskalev tags: trunk | |
Changes
Modified src/0dev.org/encoding/fibonacci/fib.go from [4b4dfe919b] to [32c0b16287].
︙ | ︙ | |||
15 16 17 18 19 20 21 | "io" ) // Alias type with methods for encoding and decoding integers type Numbers []uint64 var ( | > > | < > > > > > > > > > > > > | 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | "io" ) // Alias type with methods for encoding and decoding integers type Numbers []uint64 var ( // Used for decoding byte values codec Numbers // Used for encoding byte values // The lower 16 bits store the encoded value itself // while the remaining upper ones store its length lookup [256]uint32 ) func init() { codec = New(16) for i := uint64(0); i < 256; i++ { val, len := codec.Code(i) lookup[i] |= uint32(val) lookup[i] |= uint32(len) << 16 } } // Returns a slice with fibonacci numbers up to the given length func New(size int) Numbers { var fibs Numbers = make(Numbers, size) copy(fibs, []uint64{1, 1}) for i := 2; i < size; i++ { fibs[i] = fibs[i-1] + fibs[i-2] |
︙ | ︙ | |||
104 105 106 107 108 109 110 | if input == nil { _, err = e.target.Write([]byte{byte(e.remaining)}) return 0, err } for _, currentByte := range input { // Get the fibonacci code and bit length for the current byte | | | 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | if input == nil { _, err = e.target.Write([]byte{byte(e.remaining)}) return 0, err } for _, currentByte := range input { // Get the fibonacci code and bit length for the current byte enc, len := uint16(lookup[currentByte]), byte(lookup[currentByte]>>16) // Add current bits to higher positions e.remaining |= byte(enc << e.length) // maximum length of added bits to e.remaining added := 8 - e.length |
︙ | ︙ | |||
185 186 187 188 189 190 191 | total int err error ) start: // While we have suitable buffered data and enough output space for (len(output) > 0) && ((d.buffer & (d.buffer >> 1)) > 0) { | | | 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 | total int err error ) start: // While we have suitable buffered data and enough output space for (len(output) > 0) && ((d.buffer & (d.buffer >> 1)) > 0) { val, len := codec.Decode(d.buffer) // Store the decoded byte output[0] = byte(val) // Advance the internal and output buffers output = output[1:] d.buffer >>= len |
︙ | ︙ |