150 lines
3.7 KiB
Go
150 lines
3.7 KiB
Go
package ext
|
|
|
|
import (
|
|
"io"
|
|
"reflect"
|
|
|
|
"github.com/shamaton/msgpack/v2/internal/common"
|
|
)
|
|
|
|
// StreamEncoder is an interface that extended encoders should implement.
|
|
// It defines methods for encoding data into a stream.
|
|
type StreamEncoder interface {
|
|
// Code returns the unique code for the encoder.
|
|
Code() int8
|
|
// Type returns the reflect.Type of the value being encoded.
|
|
Type() reflect.Type
|
|
// Write encodes the given value and writes it to the provided StreamWriter.
|
|
Write(w StreamWriter, value reflect.Value) error
|
|
}
|
|
|
|
// StreamWriter provides methods for writing data in extended formats.
|
|
// It wraps an io.Writer and a buffer for efficient writing.
|
|
type StreamWriter struct {
|
|
w io.Writer // The underlying writer to write data to.
|
|
buf *common.Buffer // A buffer used for temporary storage during writing.
|
|
}
|
|
|
|
// CreateStreamWriter creates and returns a new StreamWriter instance.
|
|
func CreateStreamWriter(w io.Writer, buf *common.Buffer) StreamWriter {
|
|
return StreamWriter{w, buf}
|
|
}
|
|
|
|
// WriteByte1Int64 writes a single byte representation of an int64 value.
|
|
func (w *StreamWriter) WriteByte1Int64(value int64) error {
|
|
return w.buf.Write(w.w,
|
|
byte(value),
|
|
)
|
|
}
|
|
|
|
// WriteByte2Int64 writes a two-byte representation of an int64 value.
|
|
func (w *StreamWriter) WriteByte2Int64(value int64) error {
|
|
return w.buf.Write(w.w,
|
|
byte(value>>8),
|
|
byte(value),
|
|
)
|
|
}
|
|
|
|
// WriteByte4Int64 writes a four-byte representation of an int64 value.
|
|
func (w *StreamWriter) WriteByte4Int64(value int64) error {
|
|
return w.buf.Write(w.w,
|
|
byte(value>>24),
|
|
byte(value>>16),
|
|
byte(value>>8),
|
|
byte(value),
|
|
)
|
|
}
|
|
|
|
// WriteByte8Int64 writes an eight-byte representation of an int64 value.
|
|
func (w *StreamWriter) WriteByte8Int64(value int64) error {
|
|
return w.buf.Write(w.w,
|
|
byte(value>>56),
|
|
byte(value>>48),
|
|
byte(value>>40),
|
|
byte(value>>32),
|
|
byte(value>>24),
|
|
byte(value>>16),
|
|
byte(value>>8),
|
|
byte(value),
|
|
)
|
|
}
|
|
|
|
// WriteByte1Uint64 writes a single byte representation of a uint64 value.
|
|
func (w *StreamWriter) WriteByte1Uint64(value uint64) error {
|
|
return w.buf.Write(w.w,
|
|
byte(value),
|
|
)
|
|
}
|
|
|
|
// WriteByte2Uint64 writes a two-byte representation of a uint64 value.
|
|
func (w *StreamWriter) WriteByte2Uint64(value uint64) error {
|
|
return w.buf.Write(w.w,
|
|
byte(value>>8),
|
|
byte(value),
|
|
)
|
|
}
|
|
|
|
// WriteByte4Uint64 writes a four-byte representation of a uint64 value.
|
|
func (w *StreamWriter) WriteByte4Uint64(value uint64) error {
|
|
return w.buf.Write(w.w,
|
|
byte(value>>24),
|
|
byte(value>>16),
|
|
byte(value>>8),
|
|
byte(value),
|
|
)
|
|
}
|
|
|
|
// WriteByte8Uint64 writes an eight-byte representation of a uint64 value.
|
|
func (w *StreamWriter) WriteByte8Uint64(value uint64) error {
|
|
return w.buf.Write(w.w,
|
|
byte(value>>56),
|
|
byte(value>>48),
|
|
byte(value>>40),
|
|
byte(value>>32),
|
|
byte(value>>24),
|
|
byte(value>>16),
|
|
byte(value>>8),
|
|
byte(value),
|
|
)
|
|
}
|
|
|
|
// WriteByte1Int writes a single byte representation of an int value.
|
|
func (w *StreamWriter) WriteByte1Int(value int) error {
|
|
return w.buf.Write(w.w,
|
|
byte(value),
|
|
)
|
|
}
|
|
|
|
// WriteByte2Int writes a two-byte representation of an int value.
|
|
func (w *StreamWriter) WriteByte2Int(value int) error {
|
|
return w.buf.Write(w.w,
|
|
byte(value>>8),
|
|
byte(value),
|
|
)
|
|
}
|
|
|
|
// WriteByte4Int writes a four-byte representation of an int value.
|
|
func (w *StreamWriter) WriteByte4Int(value int) error {
|
|
return w.buf.Write(w.w,
|
|
byte(value>>24),
|
|
byte(value>>16),
|
|
byte(value>>8),
|
|
byte(value),
|
|
)
|
|
}
|
|
|
|
// WriteByte4Uint32 writes a four-byte representation of a uint32 value.
|
|
func (w *StreamWriter) WriteByte4Uint32(value uint32) error {
|
|
return w.buf.Write(w.w,
|
|
byte(value>>24),
|
|
byte(value>>16),
|
|
byte(value>>8),
|
|
byte(value),
|
|
)
|
|
}
|
|
|
|
// WriteBytes writes a slice of bytes to the underlying writer.
|
|
func (w *StreamWriter) WriteBytes(bs []byte) error {
|
|
return w.buf.Write(w.w, bs...)
|
|
}
|