跳到主要内容

pkg/common/string.go


Content

package common

import (
"bytes"
"unsafe"

"github.com/daviszhen/plan/pkg/util"
)

type String struct {
Len int
Data unsafe.Pointer
}

func (s *String) DataSlice() []byte {
return util.PointerToSlice[byte](s.Data, s.Len)
}

func (s *String) DataPtr() unsafe.Pointer {
return s.Data
}

func (s *String) String() string {
t := s.DataSlice()
return string(t)
}

func (s *String) Equal(o *String) bool {
if s.Len != o.Len {
return false
}
sSlice := util.PointerToSlice[byte](s.Data, s.Len)
oSlice := util.PointerToSlice[byte](o.Data, o.Len)
return bytes.Equal(sSlice, oSlice)
}

func (s *String) Less(o *String) bool {
sSlice := util.PointerToSlice[byte](s.Data, s.Len)
oSlice := util.PointerToSlice[byte](o.Data, o.Len)
return bytes.Compare(sSlice, oSlice) < 0
}

func (s *String) Length() int {
return s.Len
}

func (s String) NullLen() int {
return 0
}

func WriteString(val String, serial util.Serialize) error {
err := util.Write[uint32](uint32(val.Length()), serial)
if err != nil {
return err
}

if val.Length() > 0 {
err = serial.WriteData(val.DataSlice(), val.Length())
if err != nil {
return err
}
}
return err
}

func ReadString(val *String, deserial util.Deserialize) error {
var len uint32
err := util.Read[uint32](&len, deserial)
if err != nil {
return err
}
if len > 0 {
val.Data = util.CMalloc(int(len))
val.Len = int(len)
err = deserial.ReadData(val.DataSlice(), val.Length())
if err != nil {
return err
}
}
return err
}