1
0
Protocol/types/primitives.go

81 lines
1.8 KiB
Go

package types
import (
"encoding/binary"
"io"
"math"
)
// Float32 provides serialization methods for float32
type Float32 float32
func (f Float32) Serialize(w io.Writer) error {
return binary.Write(w, binary.LittleEndian, math.Float32bits(float32(f)))
}
func (f Float32) SerializeToBytes(dest []byte, offset *uint32) {
binary.LittleEndian.PutUint32(dest[*offset:], math.Float32bits(float32(f)))
*offset += 4
}
func (f Float32) Size() uint32 {
return 4
}
func (f *Float32) Deserialize(r io.Reader) error {
var bits uint32
if err := binary.Read(r, binary.LittleEndian, &bits); err != nil {
return err
}
*f = Float32(math.Float32frombits(bits))
return nil
}
// Float64 provides serialization methods for float64
type Float64 float64
func (f Float64) Serialize(w io.Writer) error {
return binary.Write(w, binary.LittleEndian, math.Float64bits(float64(f)))
}
func (f Float64) SerializeToBytes(dest []byte, offset *uint32) {
binary.LittleEndian.PutUint64(dest[*offset:], math.Float64bits(float64(f)))
*offset += 8
}
func (f Float64) Size() uint32 {
return 8
}
func (f *Float64) Deserialize(r io.Reader) error {
var bits uint64
if err := binary.Read(r, binary.LittleEndian, &bits); err != nil {
return err
}
*f = Float64(math.Float64frombits(bits))
return nil
}
// GetTypeSize returns the size in bytes for common EQ2 types
func GetTypeSize(typeName string) uint32 {
switch typeName {
case "int8", "uint8", "byte", "char":
return 1
case "int16", "uint16":
return 2
case "int32", "uint32", "float", "float32", "color":
return 4
case "int64", "uint64", "double", "float64":
return 8
default:
return 0
}
}
// Serializable interface for types that can be serialized
type Serializable interface {
Serialize(w io.Writer) error
SerializeToBytes(dest []byte, offset *uint32)
Size() uint32
Deserialize(r io.Reader) error
}