1*88d15eacSSasha Smundak// Copyright 2018, The Go Authors. All rights reserved. 2*88d15eacSSasha Smundak// Use of this source code is governed by a BSD-style 3*88d15eacSSasha Smundak// license that can be found in the LICENSE file. 4*88d15eacSSasha Smundak 5*88d15eacSSasha Smundak//go:build !purego 6*88d15eacSSasha Smundak// +build !purego 7*88d15eacSSasha Smundak 8*88d15eacSSasha Smundakpackage value 9*88d15eacSSasha Smundak 10*88d15eacSSasha Smundakimport ( 11*88d15eacSSasha Smundak "reflect" 12*88d15eacSSasha Smundak "unsafe" 13*88d15eacSSasha Smundak) 14*88d15eacSSasha Smundak 15*88d15eacSSasha Smundak// Pointer is an opaque typed pointer and is guaranteed to be comparable. 16*88d15eacSSasha Smundaktype Pointer struct { 17*88d15eacSSasha Smundak p unsafe.Pointer 18*88d15eacSSasha Smundak t reflect.Type 19*88d15eacSSasha Smundak} 20*88d15eacSSasha Smundak 21*88d15eacSSasha Smundak// PointerOf returns a Pointer from v, which must be a 22*88d15eacSSasha Smundak// reflect.Ptr, reflect.Slice, or reflect.Map. 23*88d15eacSSasha Smundakfunc PointerOf(v reflect.Value) Pointer { 24*88d15eacSSasha Smundak // The proper representation of a pointer is unsafe.Pointer, 25*88d15eacSSasha Smundak // which is necessary if the GC ever uses a moving collector. 26*88d15eacSSasha Smundak return Pointer{unsafe.Pointer(v.Pointer()), v.Type()} 27*88d15eacSSasha Smundak} 28*88d15eacSSasha Smundak 29*88d15eacSSasha Smundak// IsNil reports whether the pointer is nil. 30*88d15eacSSasha Smundakfunc (p Pointer) IsNil() bool { 31*88d15eacSSasha Smundak return p.p == nil 32*88d15eacSSasha Smundak} 33*88d15eacSSasha Smundak 34*88d15eacSSasha Smundak// Uintptr returns the pointer as a uintptr. 35*88d15eacSSasha Smundakfunc (p Pointer) Uintptr() uintptr { 36*88d15eacSSasha Smundak return uintptr(p.p) 37*88d15eacSSasha Smundak} 38