commit 86e4b630f45da3bb0aa8ff9efa4b73ba416a5da8
parent 083b06782b614bb2870f2e8ff2b7d8638274cc81
Author: francoispqt <francois@parquet.ninja>
Date: Sat, 28 Apr 2018 22:10:44 +0800
update BorrowDecoder api
Diffstat:
7 files changed, 57 insertions(+), 31 deletions(-)
diff --git a/README.md b/README.md
@@ -117,6 +117,25 @@ You can either get a fresh `*gojay.Decoder` calling `dec := gojay.NewDecoder(io.
After using a decoder, you can release it by calling `dec.Release()`. Beware, if you reuse the decoder after releasing it, it will panic with an error of type `InvalidUsagePooledDecoderError`. If you want to fully benefit from the pooling, you must release your decoders after using.
+Example getting a fresh an releasing:
+```go
+str := ""
+dec := gojay.NewDecoder(strings.NewReader(`"test"`))
+defer dec.Release()
+if err := dec.Decode(&str); err != nil {
+ log.Fatal(err)
+}
+```
+Example borrowing a decoder and releasing:
+```go
+str := ""
+dec := gojay.BorrowDecoder(strings.NewReader(`"test"`))
+defer dec.Release()
+if err := dec.Decode(&str); err != nil {
+ log.Fatal(err)
+}
+```
+
`*gojay.Decoder` has multiple methods to decode to specific types:
* Decode
```go
diff --git a/decode.go b/decode.go
@@ -13,7 +13,7 @@ import (
// If a JSON value is not appropriate for a given target type, or if a JSON number
// overflows the target type, UnmarshalArray skips that field and completes the unmarshaling as best it can.
func UnmarshalArray(data []byte, v UnmarshalerArray) error {
- dec := BorrowDecoder(nil, 0)
+ dec := BorrowDecoder(nil)
defer dec.Release()
dec.data = make([]byte, len(data))
copy(dec.data, data)
@@ -35,7 +35,7 @@ func UnmarshalArray(data []byte, v UnmarshalerArray) error {
// If a JSON value is not appropriate for a given target type, or if a JSON number
// overflows the target type, UnmarshalObject skips that field and completes the unmarshaling as best it can.
func UnmarshalObject(data []byte, v UnmarshalerObject) error {
- dec := BorrowDecoder(nil, 0)
+ dec := BorrowDecoder(nil)
defer dec.Release()
dec.data = make([]byte, len(data))
copy(dec.data, data)
@@ -73,53 +73,53 @@ func Unmarshal(data []byte, v interface{}) error {
var dec *Decoder
switch vt := v.(type) {
case *string:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeString(vt)
case *int:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeInt(vt)
case *int32:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeInt32(vt)
case *uint32:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeUint32(vt)
case *int64:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeInt64(vt)
case *uint64:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeUint64(vt)
case *float64:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeFloat64(vt)
case *bool:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeBool(vt)
case UnmarshalerObject:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = make([]byte, len(data))
copy(dec.data, data)
_, err = dec.decodeObject(vt)
case UnmarshalerArray:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = make([]byte, len(data))
copy(dec.data, data)
diff --git a/decode_pool.go b/decode_pool.go
@@ -22,7 +22,10 @@ func NewDecoder(r io.Reader) *Decoder {
// BorrowDecoder borrows a Decoder from the pool.
// It takes an io.Reader implementation as data input.
// It initiates the done channel returned by Done().
-func BorrowDecoder(r io.Reader, bufSize int) *Decoder {
+func BorrowDecoder(r io.Reader) *Decoder {
+ return borrowDecoder(r, 512)
+}
+func borrowDecoder(r io.Reader, bufSize int) *Decoder {
select {
case dec := <-decPool:
dec.called = 0
diff --git a/decode_stream_pool.go b/decode_stream_pool.go
@@ -19,7 +19,11 @@ func (s stream) NewDecoder(r io.Reader) *StreamDecoder {
// BorrowDecoder borrows a StreamDecoder a decoder from the pool.
// It takes an io.Reader implementation as data input.
// It initiates the done channel returned by Done().
-func (s stream) BorrowDecoder(r io.Reader, bufSize int) *StreamDecoder {
+func (s stream) BorrowDecoder(r io.Reader) *StreamDecoder {
+ return s.borrowDecoder(r, 512)
+}
+
+func (s stream) borrowDecoder(r io.Reader, bufSize int) *StreamDecoder {
select {
case streamDec := <-streamDecPool:
streamDec.called = 0
diff --git a/decode_stream_pool_test.go b/decode_stream_pool_test.go
@@ -13,7 +13,7 @@ func TestDecodeStreamBorrow(t *testing.T) {
dec := Stream.NewDecoder(nil)
streamDecPool <- dec
// borrow one decoder to the channel
- nDec := Stream.BorrowDecoder(nil, 0)
+ nDec := Stream.BorrowDecoder(nil)
// make sure they are the same
assert.Equal(t, dec, nDec, "decoder added to the pool and new decoder should be the same")
}
@@ -27,7 +27,7 @@ func TestDecodeStreamBorrow1(t *testing.T) {
// reset streamDecPool
streamDecPool = make(chan *StreamDecoder, 1)
// borrow one decoder to the channel
- nDec := Stream.BorrowDecoder(nil, 0)
+ nDec := Stream.BorrowDecoder(nil)
// make sure they are the same
assert.NotEqual(t, dec, nDec, "decoder added to the pool and new decoder should be the same")
}
@@ -39,7 +39,7 @@ func TestDecodeStreamBorrow2(t *testing.T) {
dec.data = make([]byte, 128)
streamDecPool <- dec
// borrow one decoder to the channel
- nDec := Stream.BorrowDecoder(nil, 512)
+ nDec := Stream.BorrowDecoder(nil)
// make sure they are the same
assert.Equal(t, dec, nDec, "decoder added to the pool and new decoder should be the same")
assert.Equal(t, 512, len(nDec.data), "len of dec.data should be 512")
@@ -48,7 +48,7 @@ func TestDecodeStreamBorrow3(t *testing.T) {
// we override the pool chan
streamDecPool = make(chan *StreamDecoder, 16)
// borrow one decoder to the channel
- nDec := Stream.BorrowDecoder(nil, 512)
+ nDec := Stream.BorrowDecoder(nil)
// make sure they are the same
assert.Equal(t, 512, len(nDec.data), "len of dec.data should be 512")
}
diff --git a/decode_stream_test.go b/decode_stream_test.go
@@ -375,7 +375,7 @@ func TestStreamDecodingErrNotSet(t *testing.T) {
}
func TestStreamDecodingPoolError(t *testing.T) {
- dec := Stream.BorrowDecoder(nil, 0)
+ dec := Stream.BorrowDecoder(nil)
dec.Release()
defer func() {
err := recover()
diff --git a/decode_unsafe.go b/decode_unsafe.go
@@ -14,7 +14,7 @@ var Unsafe = decUnsafe{}
type decUnsafe struct{}
func (u decUnsafe) UnmarshalArray(data []byte, v UnmarshalerArray) error {
- dec := BorrowDecoder(nil, 0)
+ dec := BorrowDecoder(nil)
defer dec.Release()
dec.data = data
dec.length = len(data)
@@ -29,7 +29,7 @@ func (u decUnsafe) UnmarshalArray(data []byte, v UnmarshalerArray) error {
}
func (u decUnsafe) UnmarshalObject(data []byte, v UnmarshalerObject) error {
- dec := BorrowDecoder(nil, 0)
+ dec := BorrowDecoder(nil)
defer dec.Release()
dec.data = data
dec.length = len(data)
@@ -48,52 +48,52 @@ func (u decUnsafe) Unmarshal(data []byte, v interface{}) error {
var dec *Decoder
switch vt := v.(type) {
case *string:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeString(vt)
case *int:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeInt(vt)
case *int32:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeInt32(vt)
case *uint32:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeUint32(vt)
case *int64:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeInt64(vt)
case *uint64:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeUint64(vt)
case *float64:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeFloat64(vt)
case *bool:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
err = dec.decodeBool(vt)
case UnmarshalerObject:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
_, err = dec.decodeObject(vt)
case UnmarshalerArray:
- dec = BorrowDecoder(nil, 0)
+ dec = BorrowDecoder(nil)
dec.length = len(data)
dec.data = data
_, err = dec.decodeArray(vt)