blob: a605953d46660d8759543eee4cecda0b78c06b94 [file] [log] [blame]
Pragya Arya324337e2020-02-20 14:35:08 +05301// Copyright 2018, The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
David K. Bainbridgec415efe2021-08-19 13:05:21 +00003// license that can be found in the LICENSE file.
Pragya Arya324337e2020-02-20 14:35:08 +05304
5// +build !purego
6
7package value
8
9import (
10 "reflect"
11 "unsafe"
12)
13
14// Pointer is an opaque typed pointer and is guaranteed to be comparable.
15type Pointer struct {
16 p unsafe.Pointer
17 t reflect.Type
18}
19
20// PointerOf returns a Pointer from v, which must be a
21// reflect.Ptr, reflect.Slice, or reflect.Map.
22func PointerOf(v reflect.Value) Pointer {
23 // The proper representation of a pointer is unsafe.Pointer,
24 // which is necessary if the GC ever uses a moving collector.
25 return Pointer{unsafe.Pointer(v.Pointer()), v.Type()}
26}
David K. Bainbridgec415efe2021-08-19 13:05:21 +000027
28// IsNil reports whether the pointer is nil.
29func (p Pointer) IsNil() bool {
30 return p.p == nil
31}
32
33// Uintptr returns the pointer as a uintptr.
34func (p Pointer) Uintptr() uintptr {
35 return uintptr(p.p)
36}