package sds
import (
"fmt"
"strings"
"unsafe"
)
type Sds *[]byte
type sdshdr struct {
len int64
free int64
buf []byte
}
// Sdsnewlen 初始化sdshdr
func Sdsnewlen(init []byte, initlen int64) Sds {
var sh *sdshdr
sh = new(sdshdr)
sh.buf = make([]byte, initlen+1)
//初始化
sh.len = initlen
sh.free = 0
if initlen > 0 {
if init != nil {
copy(sh.buf, init[:initlen])
}
}
fmt.Printf("sh.buf=%s sh=%p,sh.buf=%p\n", sh.buf, sh, &sh.buf)
//sh.buf[initlen] = 0
return &sh.buf
}
//Sdsnew 创建一个sds
func Sdsnew(init []byte) Sds {
var initlen int64 = 0
if init != nil {
initlen = int64(len(init))
}
return Sdsnewlen(init, initlen)
}
//Sdsempty 设置个空的sds和sdshdr
func Sdsempty() Sds {
return Sdsnewlen([]byte(""), 0)
}
//Sdslen 长度
func Sdslen(s Sds) int64 {
sh := (*sdshdr)(unsafe.Pointer(uintptr(unsafe.Pointer(s)) - uintptr(unsafe.Sizeof(int64(0))*2)))
return sh.len
}
//Sdsdup 传入一个sds获取一个和旧sds值一样的新sds
func Sdsdup(s Sds) Sds {
return Sdsnewlen(*s, Sdslen(s))
}
//Sdsavail 获取free
func Sdsavail(s Sds) int64 {
sh := (*sdshdr)(unsafe.Pointer(uintptr(unsafe.Pointer(s)) - uintptr(unsafe.Sizeof(int64(0))*2)))
return sh.free
}
//Sdsupdatelen 更新sds对应sdshdr的len和free
func Sdsupdatelen(s Sds) {
sh := (*sdshdr)(unsafe.Pointer(uintptr(unsafe.Pointer(s)) - uintptr(unsafe.Sizeof(int64(0))*2)))
realLen := int64(len(*s) - 1) //减去0
sh.free += sh.len - realLen
sh.len = realLen
}
//sdsMakeRoomFor 分配长度 free不够的话 重新分配(slen+addLen)*2的长度
func sdsMakeRoomFor(s Sds, addLen int64) Sds {
free := Sdsavail(s)
if free >= addLen {
return s
}
slen := Sdslen(s)
sh := (*sdshdr)(unsafe.Pointer(uintptr(unsafe.Pointer(s)) - uintptr(unsafe.Sizeof(int64(0))*2)))
newLen := (slen + addLen) * 2
oldBuf := sh.buf
sh.buf = make([]byte, newLen+1)
copy(sh.buf, oldBuf)
sh.free = newLen - slen
return &sh.buf
}
//Sdscatlen 追加指定长度的字符串
func Sdscatlen(s Sds, ns []byte, nsLen int64) Sds {
curLen := Sdslen(s)
s = sdsMakeRoomFor(s, nsLen)
sh := (*sdshdr)(unsafe.Pointer(uintptr(unsafe.Pointer(s)) - uintptr(unsafe.Sizeof(int64(0))*2)))
copy(sh.buf[curLen:], ns[:nsLen])
sh.len = curLen + nsLen
sh.free -= nsLen
sh.buf[curLen+nsLen] = 0
return &sh.buf
}
//Sdscat 将ns字符串追加到s中
func Sdscat(s Sds, ns []byte) Sds {
return Sdscatlen(s, ns, int64(len(ns)))
}
//Sdscpylen 将指定长度的字符串覆盖写入到s中
func Sdscpylen(s Sds, ns []byte, nsLen int64) Sds {
sh := (*sdshdr)(unsafe.Pointer(uintptr(unsafe.Pointer(s)) - uintptr(unsafe.Sizeof(int64(0))*2)))
totLen := sh.len + sh.free
if totLen < nsLen {
sdsMakeRoomFor(s, nsLen)
totLen = sh.len + sh.free
}
copy(sh.buf, ns)
for i, v := range sh.buf[nsLen:] {
if v == 0 {
break
}
sh.buf[nsLen+int64(i)] = 0
}
sh.len = nsLen
sh.free = totLen - sh.len
return &sh.buf
}
//Sdscpy 将字符串覆盖写入到s中
func Sdscpy(s Sds, ns []byte) Sds {
return Sdscpylen(s, ns, int64(len(ns)))
}
//变为小写
func Sdstolower(s Sds) Sds {
//内置
sstr := string(*s)
sstr = strings.ToLower(sstr)
return Sdscpy(s, []byte(sstr))
}
//变为大写
func Sdstoupper(s Sds) Sds {
//内置
sstr := string(*s)
sstr = strings.ToUpper(sstr)
return Sdscpy(s, []byte(sstr))
}
//比较两个字符串
func sdscmp(s1 Sds, s2 Sds) int {
return strings.Compare(string(*s1), string(*s2))
}
main函数测试
func main() {
name := "wwz"
nameSds := sds.Sdsnew([]byte(name))
fmt.Printf("调用 Sdsnew 函数 nameSds=%s nameSds长度:%d nameSds free: %d\n", nameSds, sds.Sdslen(nameSds), sds.Sdsavail(nameSds))
nameSds = sds.Sdscat(nameSds, []byte(" hello world"))
fmt.Printf("调用 Sdscat 函数 nameSds=%s nameSds长度:%d nameSds free: %d\n", nameSds, sds.Sdslen(nameSds), sds.Sdsavail(nameSds))
nameSds = sds.Sdscpy(nameSds, []byte("sds sds"))
fmt.Printf("调用 Sdscpy 函数 nameSds=%s nameSds长度:%d nameSds free: %d\n", nameSds, sds.Sdslen(nameSds), sds.Sdsavail(nameSds))
nameSds = sds.Sdstoupper(nameSds)
fmt.Printf("调用 nameSds 函数 nameSds=%s nameSds长度:%d nameSds free: %d\n", nameSds, sds.Sdslen(nameSds), sds.Sdsavail(nameSds))
nameSds = sds.Sdstolower(nameSds)
fmt.Printf("调用 Sdstolower 函数 nameSds=%s nameSds长度:%d nameSds free: %d\n", nameSds, sds.Sdslen(nameSds), sds.Sdsavail(nameSds))
}
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)