1
0
mirror of https://github.com/fumiama/unibase2n.git synced 2026-06-10 03:30:23 +08:00

优化性能

This commit is contained in:
源文雨
2022-09-30 23:01:22 +08:00
parent 71948481ee
commit ec2f2580cf
7 changed files with 93 additions and 67 deletions

67
pack.go
View File

@@ -2,67 +2,44 @@ package unibase2n
import (
"encoding/binary"
"errors"
"unsafe"
)
type Pack uint64
var (
// Base16384 CJK Unified Ideographs
// see https://github.com/fumiama/base16384
Base16384 = newbasepack(0x4e00, 0x3d00, 14)
// Base8192 谚文音節 Hangul Syllables
Base8192 = newbasepack(0xac00, 0xcc00, 13)
// Base256 谚文字母 Hangul Jamo
Base256 = newbasepack(0x1100, 0, 8)
// BaseMath (256) 數學運算符 Mathematical Operators
BaseMath = newbasepack(0x2200, 0, 8)
// Base128 帶圈或括號的字母數字 Enclosed Alphanumerics
Base128 = newbasepack(0x2460, 0x24f4, 7)
// Base64 箭頭 Arrows
Base64 = newbasepack(0x2190, 0x21d0, 6)
// Base64Gua 六十四卦 YiJing Hexagram Symbols
Base64Gua = newbasepack(0x3400, 0x262f, 6)
// Base32 方塊元素 Block Elements
Base32 = newbasepack(0x2580, 0x259f, 5)
// Base16 漢文訓讀點 Kanbun Kundoku Den
Base16 = newbasepack(0x3190, 0, 4)
// Base8 八卦 YiJing Hexagram Symbols
Base8 = newbasepack(0x2630, 0x2689, 3)
ErrInvalidPack = errors.New("invalid pack")
)
func newbasepack(off, til uint16, bit uint8) Pack {
b, err := NewBase(off, til, bit)
if err != nil {
panic(err)
}
return b.Pack()
}
// New base2n from a packed config
func New(pack Pack) *Base {
b := &Base{}
func New(pack Pack) (bs Base, err error) {
if pack&0xff == 0 && pack&0xff000000_00000000 == 0 {
err = ErrInvalidPack
return
}
ismele := isLittleEndian()
isitle := pack&0xffffff != 0
if ismele == isitle { // same endian
*(*Pack)(unsafe.Pointer(b)) = pack
return b
*(*Pack)(unsafe.Pointer(&bs)) = pack
} else {
field := (*[8]byte)(unsafe.Pointer(&pack))
if isitle { // packed in little endian but I am big
bs.off = binary.BigEndian.Uint16(field[6:8])
bs.til = binary.BigEndian.Uint16(field[4:6])
} else { // packed in big endian but I am little
bs.off = binary.LittleEndian.Uint16(field[6:8])
bs.til = binary.LittleEndian.Uint16(field[4:6])
}
bs.bit = field[3]
}
field := (*[8]byte)(unsafe.Pointer(&pack))
if isitle { // packed in little endian but I am big
b.off = binary.BigEndian.Uint16(field[6:8])
b.til = binary.BigEndian.Uint16(field[4:6])
} else { // packed in big endian but I am little
b.off = binary.LittleEndian.Uint16(field[6:8])
b.til = binary.LittleEndian.Uint16(field[4:6])
}
b.bit = field[3]
return b
err = bs.check()
return
}
// Pack this config into an integer
func (bs *Base) Pack() Pack {
return *(*Pack)(unsafe.Pointer(bs))
func (bs Base) Pack() Pack {
return *(*Pack)(unsafe.Pointer(&bs))
}
func isLittleEndian() bool {