1
2
3
4
5 package trace
6
7 import (
8 "fmt"
9 "unsafe"
10 )
11
12
13 type Value struct {
14 kind ValueKind
15 pointer unsafe.Pointer
16 scalar uint64
17 }
18
19
20 type ValueKind uint8
21
22 const (
23 ValueBad ValueKind = iota
24 ValueUint64
25 ValueString
26 )
27
28
29
30
31
32
33
34 func (v Value) Kind() ValueKind {
35 return v.kind
36 }
37
38
39
40
41 func (v Value) Uint64() uint64 {
42 if v.kind != ValueUint64 {
43 panic("Uint64 called on Value of a different Kind")
44 }
45 return v.scalar
46 }
47
48
49
50 func (v Value) String() string {
51 if v.kind == ValueString {
52 return unsafe.String((*byte)(v.pointer), int(v.scalar))
53 }
54 switch v.kind {
55 case ValueUint64:
56 return fmt.Sprintf("Value{Uint64(%d)}", v.Uint64())
57 }
58 return "Value{Bad}"
59 }
60
61 func uint64Value(x uint64) Value {
62 return Value{kind: ValueUint64, scalar: x}
63 }
64
65 func stringValue(s string) Value {
66 return Value{kind: ValueString, scalar: uint64(len(s)), pointer: unsafe.Pointer(unsafe.StringData(s))}
67 }
68
View as plain text