]> Sergey Matveev's repositories - btrtrc.git/commitdiff
bencode: Unembed the Reader type, and minimize the interface surface
authorMatt Joiner <anacrolix@gmail.com>
Wed, 15 Jun 2016 04:51:58 +0000 (14:51 +1000)
committerMatt Joiner <anacrolix@gmail.com>
Wed, 15 Jun 2016 04:51:58 +0000 (14:51 +1000)
Want to remove some unnecessary allocations.

bencode/api.go
bencode/decode.go

index bf368cf9f4014b8f4e36159996ae3926021dbfe8..9a77583e84b98175dabac10496815dd0bae8e9f4 100644 (file)
@@ -128,7 +128,7 @@ func Marshal(v interface{}) ([]byte, error) {
 // Unmarshal the bencode value in the 'data' to a value pointed by the 'v'
 // pointer, return a non-nil error if any.
 func Unmarshal(data []byte, v interface{}) error {
-       e := decoder{Reader: bufio.NewReader(bytes.NewBuffer(data))}
+       e := decoder{r: bufio.NewReader(bytes.NewBuffer(data))}
        return e.decode(v)
 }
 
@@ -141,7 +141,7 @@ type Decoder struct {
 }
 
 func NewDecoder(r io.Reader) *Decoder {
-       return &Decoder{decoder{Reader: bufio.NewReader(r)}}
+       return &Decoder{decoder{r: bufio.NewReader(r)}}
 }
 
 func (d *Decoder) Decode(v interface{}) error {
index 9cb2a0d65e453c51e610352a414dbd0f97302731..ebd4684e2c956f140571d5526ecc9842de4b8e80 100644 (file)
@@ -1,7 +1,6 @@
 package bencode
 
 import (
-       "bufio"
        "bytes"
        "errors"
        "fmt"
@@ -14,7 +13,10 @@ import (
 )
 
 type decoder struct {
-       *bufio.Reader
+       r interface {
+               io.ByteScanner
+               io.Reader
+       }
        offset int64
        buf    bytes.Buffer
        key    string
@@ -51,7 +53,7 @@ func check_for_unexpected_eof(err error, offset int64) {
 }
 
 func (d *decoder) read_byte() byte {
-       b, err := d.ReadByte()
+       b, err := d.r.ReadByte()
        if err != nil {
                check_for_unexpected_eof(err, d.offset)
                panic(err)
@@ -145,7 +147,7 @@ func (d *decoder) parse_string(v reflect.Value) {
        check_for_int_parse_error(err, start)
 
        d.buf.Reset()
-       n, err := io.CopyN(&d.buf, d, length)
+       n, err := io.CopyN(&d.buf, d.r, length)
        d.offset += n
        if err != nil {
                check_for_unexpected_eof(err, d.offset)
@@ -329,12 +331,12 @@ func (d *decoder) parse_list(v reflect.Value) {
 }
 
 func (d *decoder) read_one_value() bool {
-       b, err := d.ReadByte()
+       b, err := d.r.ReadByte()
        if err != nil {
                panic(err)
        }
        if b == 'e' {
-               d.UnreadByte()
+               d.r.UnreadByte()
                return false
        } else {
                d.offset++
@@ -360,7 +362,7 @@ func (d *decoder) read_one_value() bool {
                        check_for_int_parse_error(err, d.offset-1)
 
                        d.buf.WriteString(":")
-                       n, err := io.CopyN(&d.buf, d, length)
+                       n, err := io.CopyN(&d.buf, d.r, length)
                        d.offset += n
                        if err != nil {
                                check_for_unexpected_eof(err, d.offset)
@@ -429,7 +431,7 @@ func (d *decoder) parse_value(v reflect.Value) bool {
                return true
        }
 
-       b, err := d.ReadByte()
+       b, err := d.r.ReadByte()
        if err != nil {
                panic(err)
        }
@@ -468,7 +470,7 @@ func (d *decoder) raiseUnknownValueType(b byte, offset int64) {
 }
 
 func (d *decoder) parse_value_interface() (interface{}, bool) {
-       b, err := d.ReadByte()
+       b, err := d.r.ReadByte()
        if err != nil {
                panic(err)
        }
@@ -535,7 +537,7 @@ func (d *decoder) parse_string_interface() interface{} {
        check_for_int_parse_error(err, start)
 
        d.buf.Reset()
-       n, err := io.CopyN(&d.buf, d, length)
+       n, err := io.CopyN(&d.buf, d.r, length)
        d.offset += n
        if err != nil {
                check_for_unexpected_eof(err, d.offset)