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 | } | ||