OSDN Git Service

Hulk did something
[bytom/vapor.git] / vendor / github.com / syndtr / goleveldb / leveldb / util / buffer.go
1 // Copyright 2009 The Go Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style
3 // license that can be found in the LICENSE file.
4
5 package util
6
7 // This a copy of Go std bytes.Buffer with some modification
8 // and some features stripped.
9
10 import (
11         "bytes"
12         "io"
13 )
14
15 // A Buffer is a variable-sized buffer of bytes with Read and Write methods.
16 // The zero value for Buffer is an empty buffer ready to use.
17 type Buffer struct {
18         buf       []byte   // contents are the bytes buf[off : len(buf)]
19         off       int      // read at &buf[off], write at &buf[len(buf)]
20         bootstrap [64]byte // memory to hold first slice; helps small buffers (Printf) avoid allocation.
21 }
22
23 // Bytes returns a slice of the contents of the unread portion of the buffer;
24 // len(b.Bytes()) == b.Len().  If the caller changes the contents of the
25 // returned slice, the contents of the buffer will change provided there
26 // are no intervening method calls on the Buffer.
27 func (b *Buffer) Bytes() []byte { return b.buf[b.off:] }
28
29 // String returns the contents of the unread portion of the buffer
30 // as a string.  If the Buffer is a nil pointer, it returns "<nil>".
31 func (b *Buffer) String() string {
32         if b == nil {
33                 // Special case, useful in debugging.
34                 return "<nil>"
35         }
36         return string(b.buf[b.off:])
37 }
38
39 // Len returns the number of bytes of the unread portion of the buffer;
40 // b.Len() == len(b.Bytes()).
41 func (b *Buffer) Len() int { return len(b.buf) - b.off }
42
43 // Truncate discards all but the first n unread bytes from the buffer.
44 // It panics if n is negative or greater than the length of the buffer.
45 func (b *Buffer) Truncate(n int) {
46         switch {
47         case n < 0 || n > b.Len():
48                 panic("leveldb/util.Buffer: truncation out of range")
49         case n == 0:
50                 // Reuse buffer space.
51                 b.off = 0
52         }
53         b.buf = b.buf[0 : b.off+n]
54 }
55
56 // Reset resets the buffer so it has no content.
57 // b.Reset() is the same as b.Truncate(0).
58 func (b *Buffer) Reset() { b.Truncate(0) }
59
60 // grow grows the buffer to guarantee space for n more bytes.
61 // It returns the index where bytes should be written.
62 // If the buffer can't grow it will panic with bytes.ErrTooLarge.
63 func (b *Buffer) grow(n int) int {
64         m := b.Len()
65         // If buffer is empty, reset to recover space.
66         if m == 0 && b.off != 0 {
67                 b.Truncate(0)
68         }
69         if len(b.buf)+n > cap(b.buf) {
70                 var buf []byte
71                 if b.buf == nil && n <= len(b.bootstrap) {
72                         buf = b.bootstrap[0:]
73                 } else if m+n <= cap(b.buf)/2 {
74                         // We can slide things down instead of allocating a new
75                         // slice. We only need m+n <= cap(b.buf) to slide, but
76                         // we instead let capacity get twice as large so we
77                         // don't spend all our time copying.
78                         copy(b.buf[:], b.buf[b.off:])
79                         buf = b.buf[:m]
80                 } else {
81                         // not enough space anywhere
82                         buf = makeSlice(2*cap(b.buf) + n)
83                         copy(buf, b.buf[b.off:])
84                 }
85                 b.buf = buf
86                 b.off = 0
87         }
88         b.buf = b.buf[0 : b.off+m+n]
89         return b.off + m
90 }
91
92 // Alloc allocs n bytes of slice from the buffer, growing the buffer as
93 // needed. If n is negative, Alloc will panic.
94 // If the buffer can't grow it will panic with bytes.ErrTooLarge.
95 func (b *Buffer) Alloc(n int) []byte {
96         if n < 0 {
97                 panic("leveldb/util.Buffer.Alloc: negative count")
98         }
99         m := b.grow(n)
100         return b.buf[m:]
101 }
102
103 // Grow grows the buffer's capacity, if necessary, to guarantee space for
104 // another n bytes. After Grow(n), at least n bytes can be written to the
105 // buffer without another allocation.
106 // If n is negative, Grow will panic.
107 // If the buffer can't grow it will panic with bytes.ErrTooLarge.
108 func (b *Buffer) Grow(n int) {
109         if n < 0 {
110                 panic("leveldb/util.Buffer.Grow: negative count")
111         }
112         m := b.grow(n)
113         b.buf = b.buf[0:m]
114 }
115
116 // Write appends the contents of p to the buffer, growing the buffer as
117 // needed. The return value n is the length of p; err is always nil. If the
118 // buffer becomes too large, Write will panic with bytes.ErrTooLarge.
119 func (b *Buffer) Write(p []byte) (n int, err error) {
120         m := b.grow(len(p))
121         return copy(b.buf[m:], p), nil
122 }
123
124 // MinRead is the minimum slice size passed to a Read call by
125 // Buffer.ReadFrom.  As long as the Buffer has at least MinRead bytes beyond
126 // what is required to hold the contents of r, ReadFrom will not grow the
127 // underlying buffer.
128 const MinRead = 512
129
130 // ReadFrom reads data from r until EOF and appends it to the buffer, growing
131 // the buffer as needed. The return value n is the number of bytes read. Any
132 // error except io.EOF encountered during the read is also returned. If the
133 // buffer becomes too large, ReadFrom will panic with bytes.ErrTooLarge.
134 func (b *Buffer) ReadFrom(r io.Reader) (n int64, err error) {
135         // If buffer is empty, reset to recover space.
136         if b.off >= len(b.buf) {
137                 b.Truncate(0)
138         }
139         for {
140                 if free := cap(b.buf) - len(b.buf); free < MinRead {
141                         // not enough space at end
142                         newBuf := b.buf
143                         if b.off+free < MinRead {
144                                 // not enough space using beginning of buffer;
145                                 // double buffer capacity
146                                 newBuf = makeSlice(2*cap(b.buf) + MinRead)
147                         }
148                         copy(newBuf, b.buf[b.off:])
149                         b.buf = newBuf[:len(b.buf)-b.off]
150                         b.off = 0
151                 }
152                 m, e := r.Read(b.buf[len(b.buf):cap(b.buf)])
153                 b.buf = b.buf[0 : len(b.buf)+m]
154                 n += int64(m)
155                 if e == io.EOF {
156                         break
157                 }
158                 if e != nil {
159                         return n, e
160                 }
161         }
162         return n, nil // err is EOF, so return nil explicitly
163 }
164
165 // makeSlice allocates a slice of size n. If the allocation fails, it panics
166 // with bytes.ErrTooLarge.
167 func makeSlice(n int) []byte {
168         // If the make fails, give a known error.
169         defer func() {
170                 if recover() != nil {
171                         panic(bytes.ErrTooLarge)
172                 }
173         }()
174         return make([]byte, n)
175 }
176
177 // WriteTo writes data to w until the buffer is drained or an error occurs.
178 // The return value n is the number of bytes written; it always fits into an
179 // int, but it is int64 to match the io.WriterTo interface. Any error
180 // encountered during the write is also returned.
181 func (b *Buffer) WriteTo(w io.Writer) (n int64, err error) {
182         if b.off < len(b.buf) {
183                 nBytes := b.Len()
184                 m, e := w.Write(b.buf[b.off:])
185                 if m > nBytes {
186                         panic("leveldb/util.Buffer.WriteTo: invalid Write count")
187                 }
188                 b.off += m
189                 n = int64(m)
190                 if e != nil {
191                         return n, e
192                 }
193                 // all bytes should have been written, by definition of
194                 // Write method in io.Writer
195                 if m != nBytes {
196                         return n, io.ErrShortWrite
197                 }
198         }
199         // Buffer is now empty; reset.
200         b.Truncate(0)
201         return
202 }
203
204 // WriteByte appends the byte c to the buffer, growing the buffer as needed.
205 // The returned error is always nil, but is included to match bufio.Writer's
206 // WriteByte. If the buffer becomes too large, WriteByte will panic with
207 // bytes.ErrTooLarge.
208 func (b *Buffer) WriteByte(c byte) error {
209         m := b.grow(1)
210         b.buf[m] = c
211         return nil
212 }
213
214 // Read reads the next len(p) bytes from the buffer or until the buffer
215 // is drained.  The return value n is the number of bytes read.  If the
216 // buffer has no data to return, err is io.EOF (unless len(p) is zero);
217 // otherwise it is nil.
218 func (b *Buffer) Read(p []byte) (n int, err error) {
219         if b.off >= len(b.buf) {
220                 // Buffer is empty, reset to recover space.
221                 b.Truncate(0)
222                 if len(p) == 0 {
223                         return
224                 }
225                 return 0, io.EOF
226         }
227         n = copy(p, b.buf[b.off:])
228         b.off += n
229         return
230 }
231
232 // Next returns a slice containing the next n bytes from the buffer,
233 // advancing the buffer as if the bytes had been returned by Read.
234 // If there are fewer than n bytes in the buffer, Next returns the entire buffer.
235 // The slice is only valid until the next call to a read or write method.
236 func (b *Buffer) Next(n int) []byte {
237         m := b.Len()
238         if n > m {
239                 n = m
240         }
241         data := b.buf[b.off : b.off+n]
242         b.off += n
243         return data
244 }
245
246 // ReadByte reads and returns the next byte from the buffer.
247 // If no byte is available, it returns error io.EOF.
248 func (b *Buffer) ReadByte() (c byte, err error) {
249         if b.off >= len(b.buf) {
250                 // Buffer is empty, reset to recover space.
251                 b.Truncate(0)
252                 return 0, io.EOF
253         }
254         c = b.buf[b.off]
255         b.off++
256         return c, nil
257 }
258
259 // ReadBytes reads until the first occurrence of delim in the input,
260 // returning a slice containing the data up to and including the delimiter.
261 // If ReadBytes encounters an error before finding a delimiter,
262 // it returns the data read before the error and the error itself (often io.EOF).
263 // ReadBytes returns err != nil if and only if the returned data does not end in
264 // delim.
265 func (b *Buffer) ReadBytes(delim byte) (line []byte, err error) {
266         slice, err := b.readSlice(delim)
267         // return a copy of slice. The buffer's backing array may
268         // be overwritten by later calls.
269         line = append(line, slice...)
270         return
271 }
272
273 // readSlice is like ReadBytes but returns a reference to internal buffer data.
274 func (b *Buffer) readSlice(delim byte) (line []byte, err error) {
275         i := bytes.IndexByte(b.buf[b.off:], delim)
276         end := b.off + i + 1
277         if i < 0 {
278                 end = len(b.buf)
279                 err = io.EOF
280         }
281         line = b.buf[b.off:end]
282         b.off = end
283         return line, err
284 }
285
286 // NewBuffer creates and initializes a new Buffer using buf as its initial
287 // contents.  It is intended to prepare a Buffer to read existing data.  It
288 // can also be used to size the internal buffer for writing. To do that,
289 // buf should have the desired capacity but a length of zero.
290 //
291 // In most cases, new(Buffer) (or just declaring a Buffer variable) is
292 // sufficient to initialize a Buffer.
293 func NewBuffer(buf []byte) *Buffer { return &Buffer{buf: buf} }