2020-01-26 00:39:13 -05:00
|
|
|
package d2common
|
|
|
|
|
2020-06-22 18:56:20 -04:00
|
|
|
import "bytes"
|
|
|
|
|
2020-07-18 18:07:38 -04:00
|
|
|
const (
|
|
|
|
byteMask = 0xFF
|
|
|
|
)
|
|
|
|
|
2020-01-26 00:39:13 -05:00
|
|
|
// StreamWriter allows you to create a byte array by streaming in writes of various sizes
|
|
|
|
type StreamWriter struct {
|
2020-06-22 18:56:20 -04:00
|
|
|
data *bytes.Buffer
|
2020-01-26 00:39:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// CreateStreamWriter creates a new StreamWriter instance
|
|
|
|
func CreateStreamWriter() *StreamWriter {
|
|
|
|
result := &StreamWriter{
|
2020-06-22 18:56:20 -04:00
|
|
|
data: new(bytes.Buffer),
|
2020-01-26 00:39:13 -05:00
|
|
|
}
|
2020-07-08 09:16:56 -04:00
|
|
|
|
2020-01-26 00:39:13 -05:00
|
|
|
return result
|
|
|
|
}
|
|
|
|
|
|
|
|
// PushByte writes a byte to the stream
|
|
|
|
func (v *StreamWriter) PushByte(val byte) {
|
2020-06-22 18:56:20 -04:00
|
|
|
v.data.WriteByte(val)
|
2020-01-26 00:39:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// PushUint16 writes an uint16 word to the stream
|
|
|
|
func (v *StreamWriter) PushUint16(val uint16) {
|
2020-07-18 18:07:38 -04:00
|
|
|
for count := 0; count < bytesPerInt16; count++ {
|
|
|
|
shift := count * bitsPerByte
|
|
|
|
v.data.WriteByte(byte(val>>shift) & byteMask)
|
|
|
|
}
|
2020-01-26 00:39:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// PushInt16 writes a int16 word to the stream
|
|
|
|
func (v *StreamWriter) PushInt16(val int16) {
|
2020-07-18 18:07:38 -04:00
|
|
|
for count := 0; count < bytesPerInt16; count++ {
|
|
|
|
shift := count * bitsPerByte
|
|
|
|
v.data.WriteByte(byte(val>>shift) & byteMask)
|
|
|
|
}
|
2020-01-26 00:39:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// PushUint32 writes a uint32 dword to the stream
|
|
|
|
func (v *StreamWriter) PushUint32(val uint32) {
|
2020-07-18 18:07:38 -04:00
|
|
|
for count := 0; count < bytesPerInt32; count++ {
|
|
|
|
shift := count * bitsPerByte
|
|
|
|
v.data.WriteByte(byte(val>>shift) & byteMask)
|
|
|
|
}
|
2020-01-26 00:39:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// PushUint64 writes a uint64 qword to the stream
|
|
|
|
func (v *StreamWriter) PushUint64(val uint64) {
|
2020-07-18 18:07:38 -04:00
|
|
|
for count := 0; count < bytesPerInt64; count++ {
|
|
|
|
shift := count * bitsPerByte
|
|
|
|
v.data.WriteByte(byte(val>>shift) & byteMask)
|
|
|
|
}
|
2020-01-26 00:39:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// PushInt64 writes a uint64 qword to the stream
|
|
|
|
func (v *StreamWriter) PushInt64(val int64) {
|
2020-06-22 18:56:20 -04:00
|
|
|
v.PushUint64(uint64(val))
|
2020-01-26 00:39:13 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
// GetBytes returns the the byte slice of the underlying data
|
|
|
|
func (v *StreamWriter) GetBytes() []byte {
|
2020-06-22 18:56:20 -04:00
|
|
|
return v.data.Bytes()
|
2020-01-26 00:39:13 -05:00
|
|
|
}
|