diff options
Diffstat (limited to 'vendor/github.com/modern-go/reflect2/unsafe_struct.go')
-rw-r--r-- | vendor/github.com/modern-go/reflect2/unsafe_struct.go | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/vendor/github.com/modern-go/reflect2/unsafe_struct.go b/vendor/github.com/modern-go/reflect2/unsafe_struct.go new file mode 100644 index 0000000..804d916 --- /dev/null +++ b/vendor/github.com/modern-go/reflect2/unsafe_struct.go | |||
@@ -0,0 +1,59 @@ | |||
1 | package reflect2 | ||
2 | |||
3 | import ( | ||
4 | "reflect" | ||
5 | "unsafe" | ||
6 | ) | ||
7 | |||
8 | type UnsafeStructType struct { | ||
9 | unsafeType | ||
10 | likePtr bool | ||
11 | } | ||
12 | |||
13 | func newUnsafeStructType(cfg *frozenConfig, type1 reflect.Type) *UnsafeStructType { | ||
14 | return &UnsafeStructType{ | ||
15 | unsafeType: *newUnsafeType(cfg, type1), | ||
16 | likePtr: likePtrType(type1), | ||
17 | } | ||
18 | } | ||
19 | |||
20 | func (type2 *UnsafeStructType) LikePtr() bool { | ||
21 | return type2.likePtr | ||
22 | } | ||
23 | |||
24 | func (type2 *UnsafeStructType) Indirect(obj interface{}) interface{} { | ||
25 | objEFace := unpackEFace(obj) | ||
26 | assertType("Type.Indirect argument 1", type2.ptrRType, objEFace.rtype) | ||
27 | return type2.UnsafeIndirect(objEFace.data) | ||
28 | } | ||
29 | |||
30 | func (type2 *UnsafeStructType) UnsafeIndirect(ptr unsafe.Pointer) interface{} { | ||
31 | if type2.likePtr { | ||
32 | return packEFace(type2.rtype, *(*unsafe.Pointer)(ptr)) | ||
33 | } | ||
34 | return packEFace(type2.rtype, ptr) | ||
35 | } | ||
36 | |||
37 | func (type2 *UnsafeStructType) FieldByName(name string) StructField { | ||
38 | structField, found := type2.Type.FieldByName(name) | ||
39 | if !found { | ||
40 | return nil | ||
41 | } | ||
42 | return newUnsafeStructField(type2, structField) | ||
43 | } | ||
44 | |||
45 | func (type2 *UnsafeStructType) Field(i int) StructField { | ||
46 | return newUnsafeStructField(type2, type2.Type.Field(i)) | ||
47 | } | ||
48 | |||
49 | func (type2 *UnsafeStructType) FieldByIndex(index []int) StructField { | ||
50 | return newUnsafeStructField(type2, type2.Type.FieldByIndex(index)) | ||
51 | } | ||
52 | |||
53 | func (type2 *UnsafeStructType) FieldByNameFunc(match func(string) bool) StructField { | ||
54 | structField, found := type2.Type.FieldByNameFunc(match) | ||
55 | if !found { | ||
56 | panic("field match condition not found in " + type2.Type.String()) | ||
57 | } | ||
58 | return newUnsafeStructField(type2, structField) | ||
59 | } | ||