Skip to content

Commit 7581017

Browse files
committed
remove n from stream
1 parent 6a8f9fa commit 7581017

6 files changed

+99
-363
lines changed

feature_reflect_native.go

+8-8
Original file line numberDiff line numberDiff line change
@@ -599,10 +599,10 @@ func (codec *base64Codec) Encode(ptr unsafe.Pointer, stream *Stream) {
599599
}
600600
encoding := base64.StdEncoding
601601
stream.writeByte('"')
602-
toGrow := encoding.EncodedLen(len(src))
603-
stream.ensure(toGrow)
604-
encoding.Encode(stream.buf[stream.n:], src)
605-
stream.n += toGrow
602+
size := encoding.EncodedLen(len(src))
603+
buf := make([]byte, size)
604+
encoding.Encode(buf, src)
605+
stream.buf = append(stream.buf, buf...)
606606
stream.writeByte('"')
607607
}
608608

@@ -615,10 +615,10 @@ func (codec *base64Codec) EncodeInterface(val interface{}, stream *Stream) {
615615
}
616616
encoding := base64.StdEncoding
617617
stream.writeByte('"')
618-
toGrow := encoding.EncodedLen(len(src))
619-
stream.ensure(toGrow)
620-
encoding.Encode(stream.buf[stream.n:], src)
621-
stream.n += toGrow
618+
size := encoding.EncodedLen(len(src))
619+
buf := make([]byte, size)
620+
encoding.Encode(buf, src)
621+
stream.buf = append(stream.buf, buf...)
622622
stream.writeByte('"')
623623
}
624624

feature_stream.go

+24-128
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@ type Stream struct {
1010
cfg *frozenConfig
1111
out io.Writer
1212
buf []byte
13-
n int
1413
Error error
1514
indention int
1615
Attachment interface{} // open for customized encoder
17-
floatBuf []byte
1816
}
1917

2018
// NewStream create new stream instance.
@@ -25,11 +23,9 @@ func NewStream(cfg API, out io.Writer, bufSize int) *Stream {
2523
return &Stream{
2624
cfg: cfg.(*frozenConfig),
2725
out: out,
28-
buf: make([]byte, bufSize),
29-
n: 0,
26+
buf: make([]byte, 0, bufSize),
3027
Error: nil,
3128
indention: 0,
32-
floatBuf: make([]byte, 0, 32),
3329
}
3430
}
3531

@@ -41,120 +37,57 @@ func (stream *Stream) Pool() StreamPool {
4137
// Reset reuse this stream instance by assign a new writer
4238
func (stream *Stream) Reset(out io.Writer) {
4339
stream.out = out
44-
stream.n = 0
40+
stream.buf = stream.buf[:0]
4541
}
4642

4743
// Available returns how many bytes are unused in the buffer.
4844
func (stream *Stream) Available() int {
49-
return len(stream.buf) - stream.n
45+
return cap(stream.buf) - len(stream.buf)
5046
}
5147

5248
// Buffered returns the number of bytes that have been written into the current buffer.
5349
func (stream *Stream) Buffered() int {
54-
return stream.n
50+
return len(stream.buf)
5551
}
5652

5753
// Buffer if writer is nil, use this method to take the result
5854
func (stream *Stream) Buffer() []byte {
59-
return stream.buf[:stream.n]
55+
return stream.buf
6056
}
6157

6258
// Write writes the contents of p into the buffer.
6359
// It returns the number of bytes written.
6460
// If nn < len(p), it also returns an error explaining
6561
// why the write is short.
6662
func (stream *Stream) Write(p []byte) (nn int, err error) {
67-
for len(p) > stream.Available() && stream.Error == nil {
68-
if stream.out == nil {
69-
stream.growAtLeast(len(p))
70-
} else {
71-
var n int
72-
if stream.Buffered() == 0 {
73-
// Large write, empty buffer.
74-
// Write directly from p to avoid copy.
75-
n, stream.Error = stream.out.Write(p)
76-
} else {
77-
n = copy(stream.buf[stream.n:], p)
78-
stream.n += n
79-
stream.Flush()
80-
}
81-
nn += n
82-
p = p[n:]
83-
}
84-
}
85-
if stream.Error != nil {
86-
return nn, stream.Error
63+
stream.buf = append(stream.buf, p...)
64+
if stream.out != nil {
65+
nn, err = stream.out.Write(stream.buf)
66+
stream.buf = stream.buf[nn:]
67+
return
8768
}
88-
n := copy(stream.buf[stream.n:], p)
89-
stream.n += n
90-
nn += n
91-
return nn, nil
69+
return len(p), nil
9270
}
9371

9472
// WriteByte writes a single byte.
9573
func (stream *Stream) writeByte(c byte) {
96-
if stream.Error != nil {
97-
return
98-
}
99-
if stream.Available() < 1 {
100-
stream.growAtLeast(1)
101-
}
102-
stream.buf[stream.n] = c
103-
stream.n++
74+
stream.buf = append(stream.buf, c)
10475
}
10576

10677
func (stream *Stream) writeTwoBytes(c1 byte, c2 byte) {
107-
if stream.Error != nil {
108-
return
109-
}
110-
if stream.Available() < 2 {
111-
stream.growAtLeast(2)
112-
}
113-
stream.buf[stream.n] = c1
114-
stream.buf[stream.n+1] = c2
115-
stream.n += 2
78+
stream.buf = append(stream.buf, c1, c2)
11679
}
11780

11881
func (stream *Stream) writeThreeBytes(c1 byte, c2 byte, c3 byte) {
119-
if stream.Error != nil {
120-
return
121-
}
122-
if stream.Available() < 3 {
123-
stream.growAtLeast(3)
124-
}
125-
stream.buf[stream.n] = c1
126-
stream.buf[stream.n+1] = c2
127-
stream.buf[stream.n+2] = c3
128-
stream.n += 3
82+
stream.buf = append(stream.buf, c1, c2, c3)
12983
}
13084

13185
func (stream *Stream) writeFourBytes(c1 byte, c2 byte, c3 byte, c4 byte) {
132-
if stream.Error != nil {
133-
return
134-
}
135-
if stream.Available() < 4 {
136-
stream.growAtLeast(4)
137-
}
138-
stream.buf[stream.n] = c1
139-
stream.buf[stream.n+1] = c2
140-
stream.buf[stream.n+2] = c3
141-
stream.buf[stream.n+3] = c4
142-
stream.n += 4
86+
stream.buf = append(stream.buf, c1, c2, c3, c4)
14387
}
14488

14589
func (stream *Stream) writeFiveBytes(c1 byte, c2 byte, c3 byte, c4 byte, c5 byte) {
146-
if stream.Error != nil {
147-
return
148-
}
149-
if stream.Available() < 5 {
150-
stream.growAtLeast(5)
151-
}
152-
stream.buf[stream.n] = c1
153-
stream.buf[stream.n+1] = c2
154-
stream.buf[stream.n+2] = c3
155-
stream.buf[stream.n+3] = c4
156-
stream.buf[stream.n+4] = c5
157-
stream.n += 5
90+
stream.buf = append(stream.buf, c1, c2, c3, c4, c5)
15891
}
15992

16093
// Flush writes any buffered data to the underlying io.Writer.
@@ -165,56 +98,20 @@ func (stream *Stream) Flush() error {
16598
if stream.Error != nil {
16699
return stream.Error
167100
}
168-
if stream.n == 0 {
169-
return nil
170-
}
171-
n, err := stream.out.Write(stream.buf[0:stream.n])
172-
if n < stream.n && err == nil {
173-
err = io.ErrShortWrite
174-
}
101+
n, err := stream.out.Write(stream.buf)
175102
if err != nil {
176-
if n > 0 && n < stream.n {
177-
copy(stream.buf[0:stream.n-n], stream.buf[n:stream.n])
103+
if stream.Error == nil {
104+
stream.Error = err
178105
}
179-
stream.n -= n
180-
stream.Error = err
181106
return err
182107
}
183-
stream.n = 0
108+
stream.buf = stream.buf[n:]
184109
return nil
185110
}
186111

187-
func (stream *Stream) ensure(minimal int) {
188-
available := stream.Available()
189-
if available < minimal {
190-
stream.growAtLeast(minimal)
191-
}
192-
}
193-
194-
func (stream *Stream) growAtLeast(minimal int) {
195-
if stream.out != nil {
196-
stream.Flush()
197-
if stream.Available() >= minimal {
198-
return
199-
}
200-
}
201-
toGrow := len(stream.buf)
202-
if toGrow < minimal {
203-
toGrow = minimal
204-
}
205-
newBuf := make([]byte, len(stream.buf)+toGrow)
206-
copy(newBuf, stream.Buffer())
207-
stream.buf = newBuf
208-
}
209-
210112
// WriteRaw write string out without quotes, just like []byte
211113
func (stream *Stream) WriteRaw(s string) {
212-
stream.ensure(len(s))
213-
if stream.Error != nil {
214-
return
215-
}
216-
n := copy(stream.buf[stream.n:], s)
217-
stream.n += n
114+
stream.buf = append(stream.buf, s...)
218115
}
219116

220117
// WriteNil write null to stream
@@ -275,6 +172,7 @@ func (stream *Stream) WriteEmptyObject() {
275172
func (stream *Stream) WriteMore() {
276173
stream.writeByte(',')
277174
stream.writeIndention(0)
175+
stream.Flush()
278176
}
279177

280178
// WriteArrayStart write [ with possible indention
@@ -302,9 +200,7 @@ func (stream *Stream) writeIndention(delta int) {
302200
}
303201
stream.writeByte('\n')
304202
toWrite := stream.indention - delta
305-
stream.ensure(toWrite)
306-
for i := 0; i < toWrite && stream.n < len(stream.buf); i++ {
307-
stream.buf[stream.n] = ' '
308-
stream.n++
203+
for i := 0; i < toWrite; i++ {
204+
stream.buf = append(stream.buf, ' ')
309205
}
310206
}

feature_stream_float.go

+6-12
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ func (stream *Stream) WriteFloat32(val float32) {
2121
fmt = 'e'
2222
}
2323
}
24-
stream.floatBuf = strconv.AppendFloat(stream.floatBuf, float64(val), fmt, -1, 32)
25-
stream.Write(stream.floatBuf)
26-
stream.floatBuf = stream.floatBuf[:0]
24+
stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 32)
2725
}
2826

2927
// WriteFloat32Lossy write float32 to stream with ONLY 6 digits precision although much much faster
@@ -45,13 +43,12 @@ func (stream *Stream) WriteFloat32Lossy(val float32) {
4543
return
4644
}
4745
stream.writeByte('.')
48-
stream.ensure(10)
4946
for p := precision - 1; p > 0 && fval < pow10[p]; p-- {
5047
stream.writeByte('0')
5148
}
5249
stream.WriteUint64(fval)
53-
for stream.buf[stream.n-1] == '0' {
54-
stream.n--
50+
for stream.buf[len(stream.buf)-1] == '0' {
51+
stream.buf = stream.buf[:len(stream.buf)-1]
5552
}
5653
}
5754

@@ -65,9 +62,7 @@ func (stream *Stream) WriteFloat64(val float64) {
6562
fmt = 'e'
6663
}
6764
}
68-
stream.floatBuf = strconv.AppendFloat(stream.floatBuf, float64(val), fmt, -1, 64)
69-
stream.Write(stream.floatBuf)
70-
stream.floatBuf = stream.floatBuf[:0]
65+
stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 64)
7166
}
7267

7368
// WriteFloat64Lossy write float64 to stream with ONLY 6 digits precision although much much faster
@@ -89,12 +84,11 @@ func (stream *Stream) WriteFloat64Lossy(val float64) {
8984
return
9085
}
9186
stream.writeByte('.')
92-
stream.ensure(10)
9387
for p := precision - 1; p > 0 && fval < pow10[p]; p-- {
9488
stream.writeByte('0')
9589
}
9690
stream.WriteUint64(fval)
97-
for stream.buf[stream.n-1] == '0' {
98-
stream.n--
91+
for stream.buf[len(stream.buf)-1] == '0' {
92+
stream.buf = stream.buf[:len(stream.buf)-1]
9993
}
10094
}

0 commit comments

Comments
 (0)