| Index: service/rawdatastore/invertible.go
|
| diff --git a/service/rawdatastore/invertible.go b/service/rawdatastore/invertible.go
|
| deleted file mode 100644
|
| index c8b40b148596aeb8c4ed6d5667cc56a525401a79..0000000000000000000000000000000000000000
|
| --- a/service/rawdatastore/invertible.go
|
| +++ /dev/null
|
| @@ -1,115 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -package rawdatastore
|
| -
|
| -import (
|
| - "bytes"
|
| -)
|
| -
|
| -// Buffer is the interface which corresponds to the subset of *bytes.Buffer
|
| -// that this package requires.
|
| -type Buffer interface {
|
| - String() string
|
| - Grow(int)
|
| -
|
| - Read([]byte) (int, error)
|
| - ReadByte() (byte, error)
|
| -
|
| - Write([]byte) (int, error)
|
| - WriteByte(c byte) error
|
| - WriteString(s string) (int, error)
|
| -}
|
| -
|
| -var _ Buffer = (*bytes.Buffer)(nil)
|
| -
|
| -// InvertibleBuffer is just like Buffer, except that it also has a stateful
|
| -// Invert() method, which will cause all reads and writes to/from it to be
|
| -// inverted (e.g. every byte XOR 0xFF).
|
| -//
|
| -// Implementing queries requires manipulating the index entries (e.g.
|
| -// synthesizing them, parsing them, etc.). In particular, when you have
|
| -// a reverse-sorted field (e.g. high to low instead of low to high), it's
|
| -// achieved by having all the bits inverted.
|
| -//
|
| -// All the serialization formats include delimiter information, which the
|
| -// parsers only know to parse non-inverted. If we don't have this buffer, we'd
|
| -// basically have to invert every byte in the []byte array when we're trying to
|
| -// decode a reverse-ordered field (including the bytes of all fields after the
|
| -// one we intend to parse) so that the parser can consume as many bytes as it
|
| -// needs (and it only knows the number of bytes it needs as it decodes them).
|
| -// This InvertibleBuffer lets that happen on the fly without having to flip the
|
| -// whole []byte.
|
| -//
|
| -// If you know you need it, you'll know it's the right thing. If you're not sure
|
| -// then you definitely don't need it!
|
| -type InvertibleBuffer interface {
|
| - Buffer
|
| - Invert()
|
| -}
|
| -
|
| -type invertibleBuffer struct {
|
| - Buffer
|
| - invert bool
|
| -}
|
| -
|
| -// Invertible returns an InvertibleBuffer based on the Buffer.
|
| -func Invertible(b Buffer) InvertibleBuffer {
|
| - return &invertibleBuffer{b, false}
|
| -}
|
| -
|
| -func (ib *invertibleBuffer) Read(bs []byte) (int, error) {
|
| - n, err := ib.Buffer.Read(bs)
|
| - if ib.invert {
|
| - for i, b := range bs {
|
| - bs[i] = b ^ 0xFF
|
| - }
|
| - }
|
| - return n, err
|
| -}
|
| -
|
| -func (ib *invertibleBuffer) WriteString(s string) (int, error) {
|
| - if ib.invert {
|
| - ib.Grow(len(s))
|
| - for i := 0; i < len(s); i++ {
|
| - if err := ib.Buffer.WriteByte(s[i] ^ 0xFF); err != nil {
|
| - return i, err
|
| - }
|
| - }
|
| - return len(s), nil
|
| - }
|
| - return ib.Buffer.WriteString(s)
|
| -}
|
| -
|
| -func (ib *invertibleBuffer) Write(bs []byte) (int, error) {
|
| - if ib.invert {
|
| - ib.Grow(len(bs))
|
| - for i, b := range bs {
|
| - if err := ib.Buffer.WriteByte(b ^ 0xFF); err != nil {
|
| - return i, err
|
| - }
|
| - }
|
| - return len(bs), nil
|
| - }
|
| - return ib.Buffer.Write(bs)
|
| -}
|
| -
|
| -func (ib *invertibleBuffer) WriteByte(b byte) error {
|
| - if ib.invert {
|
| - b = b ^ 0xFF
|
| - }
|
| - return ib.Buffer.WriteByte(b)
|
| -}
|
| -
|
| -func (ib *invertibleBuffer) ReadByte() (byte, error) {
|
| - ret, err := ib.Buffer.ReadByte()
|
| - if ib.invert {
|
| - ret = ret ^ 0xFF
|
| - }
|
| - return ret, err
|
| -}
|
| -
|
| -func (ib *invertibleBuffer) Invert() {
|
| - ib.invert = !ib.invert
|
| -}
|
|
|