-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathslice.go
114 lines (87 loc) · 1.95 KB
/
slice.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
package asdf
import (
"reflect"
"unsafe"
)
type Slice []byte
func (me *Slice) Header() *reflect.SliceHeader {
return (*reflect.SliceHeader)(unsafe.Pointer(me))
}
func (me Slice) IsValue(Value byte) bool {
for i := 0; i < len(me); i++ {
if Value != me[i] {
return false
}
}
return true
}
func (me Slice) IsZero() bool {
return me.IsValue(0)
}
func (me Slice) IsFull() bool {
return me.IsValue(255)
}
func (me Slice) Slice() []byte {
return me
}
func (me Slice) Eq(it interface{}) bool {
v, ok := it.(ISlice)
if !ok {
return false
}
b := v.Slice()
if len(me) != len(b) {
return false
}
for i := 0; i < len(me); i++ {
if me[i] != b[i] {
return false
}
}
return true
}
func ObjToSlice(obj unsafe.Pointer, size int) []byte {
if nil != obj {
bin := Slice{}
hdr := bin.Header()
hdr.Data = uintptr(obj)
hdr.Len = size
hdr.Cap = size
return bin
} else {
return nil
}
}
func AddPointer(obj unsafe.Pointer, offset uintptr) unsafe.Pointer {
return unsafe.Pointer(uintptr(obj) + offset)
}
func SubPointer(obj unsafe.Pointer, offset uintptr) unsafe.Pointer {
return unsafe.Pointer(uintptr(obj) - offset)
}
func MemberToSlice(obj unsafe.Pointer, offset, size uintptr) []byte {
member := unsafe.Pointer(uintptr(obj) + offset)
return ObjToSlice(member, int(size))
}
func MakeSliceEx(Data uintptr, Len, Cap int) []byte {
s := Slice{}
h := s.Header()
h.Data = Data
h.Len = Len
h.Cap = Cap
return s
}
func MakeSlice(obj unsafe.Pointer, Len, Cap int) []byte {
return MakeSliceEx(uintptr(obj), Len, Cap)
}
func StructSliceEx(Data uintptr, size int) []byte {
return MakeSliceEx(Data, size, size)
}
func StructSlice(obj unsafe.Pointer, size int) []byte {
return MakeSliceEx(uintptr(obj), size, size)
}
func SliceAddress(buf []byte) uintptr {
return ((*reflect.SliceHeader)(unsafe.Pointer(&buf))).Data
}
func SlicePointer(buf []byte) unsafe.Pointer {
return unsafe.Pointer(((*reflect.SliceHeader)(unsafe.Pointer(&buf))).Data)
}