[
  {
    "path": ".github/workflows/go.yml",
    "content": "---\nname: Go\non:\n  push:\n    branches:\n      - main\n  pull_request:\n  schedule:\n    - cron: '42 3 * * 4'\n\njobs:\n  test:\n    name: Test\n    runs-on: ubuntu-20.04\n\n    steps:\n      - name: Checkout code\n        uses: actions/checkout@v2\n\n      - name: Install Go tip\n        run: |\n          sudo rm -fr /opt/hostedtoolcache/go /usr/local/go /usr/bin/go /bin/go\n          curl -o go.tar.gz -L \\\n            https://github.com/AlekSi/golang-tip/releases/download/tip/master.linux-amd64.tar.gz\n          sudo tar -C /usr/local -xzf go.tar.gz\n          sudo ln -s /usr/local/go/bin/* /usr/local/bin/\n          go version\n          rm go.tar.gz\n\n      - name: Run tests\n        run: go test -v\n"
  },
  {
    "path": "LICENSE",
    "content": "The MIT License (MIT)\n\nCopyright (c) 2015 Alexey Palazhchenko\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n"
  },
  {
    "path": "README.md",
    "content": "# pointer\n\n[![Go Reference](https://pkg.go.dev/badge/github.com/AlekSi/pointer.svg)](https://pkg.go.dev/github.com/AlekSi/pointer)\n\nGo package `pointer` provides helpers to convert between pointers and values of built-in\n(and, with Go 1.18+ generics, of any) types.\n\n```\ngo get github.com/AlekSi/pointer\n```\n\nAPI is stable. [Documentation](https://pkg.go.dev/github.com/AlekSi/pointer).\n\n```go\npackage motivationalexample\n\nimport (\n\t\"encoding/json\"\n\n\t\"github.com/AlekSi/pointer\"\n)\n\nconst (\n\tdefaultName = \"some name\"\n)\n\n// Stuff contains optional fields.\ntype Stuff struct {\n\tName    *string\n\tComment *string\n\tValue   *int64\n\tTime    *time.Time\n}\n\n// SomeStuff makes some JSON-encoded stuff.\nfunc SomeStuff() (data []byte, err error) {\n\treturn json.Marshal(&Stuff{\n\t\tName:    pointer.ToString(defaultName),                                   // can't say &defaultName\n\t\tComment: pointer.ToString(\"not yet\"),                                     // can't say &\"not yet\"\n\t\tValue:   pointer.ToInt64(42),                                             // can't say &42 or &int64(42)\n\t\tTime:    pointer.ToTime(time.Date(2014, 6, 25, 12, 24, 40, 0, time.UTC)), // can't say &time.Date(…)\n\t})\n}\n```\n"
  },
  {
    "path": "generic.go",
    "content": "//go:build go1.18\n// +build go1.18\n\npackage pointer\n\n// To returns a pointer to the passed value.\nfunc To[T any](t T) *T {\n\treturn &t\n}\n\n// ToOrNil returns a pointer to the passed value, or nil, if the passed value is a zero value.\n// If the passed value has `IsZero() bool` method (for example, time.Time instance),\n// it is used to determine if the value is zero.\nfunc ToOrNil[T comparable](t T) *T {\n\tif z, ok := any(t).(interface{ IsZero() bool }); ok {\n\t\tif z.IsZero() {\n\t\t\treturn nil\n\t\t}\n\t\treturn &t\n\t}\n\n\tvar zero T\n\tif t == zero {\n\t\treturn nil\n\t}\n\treturn &t\n}\n\n// Get returns the value from the passed pointer or the zero value if the pointer is nil.\nfunc Get[T any](t *T) T {\n\tif t == nil {\n\t\tvar zero T\n\t\treturn zero\n\t}\n\treturn *t\n}\n"
  },
  {
    "path": "generic_test.go",
    "content": "//go:build go1.18\n// +build go1.18\n\npackage pointer\n\nimport (\n\t\"testing\"\n\t\"time\"\n)\n\nfunc TestGeneric(t *testing.T) {\n\tvar x time.Time\n\tif *To(x) != x {\n\t\tt.Errorf(\"*To(%v)\", x)\n\t}\n\tif ToOrNil(x) != nil {\n\t\tt.Errorf(\"ToOrNil(%v)\", x)\n\t}\n\tif Get((*time.Time)(nil)) != x {\n\t\tt.Errorf(\"Time(%v)\", nil)\n\t}\n\n\tx = time.Date(2014, 6, 25, 12, 24, 40, 0, time.UTC)\n\tif *To(x) != x {\n\t\tt.Errorf(\"*To(%v)\", x)\n\t}\n\tif *ToOrNil(x) != x {\n\t\tt.Errorf(\"*ToOrNil(%v)\", x)\n\t}\n\tif Get(&x) != x {\n\t\tt.Errorf(\"Get(%v)\", &x)\n\t}\n}\n"
  },
  {
    "path": "go.mod",
    "content": "module github.com/AlekSi/pointer\n\ngo 1.18\n"
  },
  {
    "path": "pointer.go",
    "content": "// Package pointer provides helpers to convert between pointers and values of built-in (and, with generics, of any) types.\npackage pointer // import \"github.com/AlekSi/pointer\"\n\nimport (\n\t\"time\"\n)\n\n/*\nOrder as in spec:\n\tbool byte complex64 complex128 error float32 float64\n\tint int8 int16 int32 int64 rune string\n\tuint uint8 uint16 uint32 uint64 uintptr\n\ttime.Duration time.Time\n*/\n\n// ToBool returns a pointer to the passed bool value.\nfunc ToBool(b bool) *bool {\n\treturn &b\n}\n\n// ToByte returns a pointer to the passed byte value.\nfunc ToByte(b byte) *byte {\n\treturn &b\n}\n\n// ToComplex64 returns a pointer to the passed complex64 value.\nfunc ToComplex64(c complex64) *complex64 {\n\treturn &c\n}\n\n// ToComplex128 returns a pointer to the passed complex128 value.\nfunc ToComplex128(c complex128) *complex128 {\n\treturn &c\n}\n\n// ToError returns a pointer to the passed error value.\nfunc ToError(e error) *error {\n\treturn &e\n}\n\n// ToFloat32 returns a pointer to the passed float32 value.\nfunc ToFloat32(f float32) *float32 {\n\treturn &f\n}\n\n// ToFloat64 returns a pointer to the passed float64 value.\nfunc ToFloat64(f float64) *float64 {\n\treturn &f\n}\n\n// ToInt returns a pointer to the passed int value.\nfunc ToInt(i int) *int {\n\treturn &i\n}\n\n// ToInt8 returns a pointer to the passed int8 value.\nfunc ToInt8(i int8) *int8 {\n\treturn &i\n}\n\n// ToInt16 returns a pointer to the passed int16 value.\nfunc ToInt16(i int16) *int16 {\n\treturn &i\n}\n\n// ToInt32 returns a pointer to the passed int32 value.\nfunc ToInt32(i int32) *int32 {\n\treturn &i\n}\n\n// ToInt64 returns a pointer to the passed int64 value.\nfunc ToInt64(i int64) *int64 {\n\treturn &i\n}\n\n// ToRune returns a pointer to the passed rune value.\nfunc ToRune(r rune) *rune {\n\treturn &r\n}\n\n// ToString returns a pointer to the passed string value.\nfunc ToString(s string) *string {\n\treturn &s\n}\n\n// ToUint returns a pointer to the passed uint value.\nfunc ToUint(u uint) *uint {\n\treturn &u\n}\n\n// ToUint8 returns a pointer to the passed uint8 value.\nfunc ToUint8(u uint8) *uint8 {\n\treturn &u\n}\n\n// ToUint16 returns a pointer to the passed uint16 value.\nfunc ToUint16(u uint16) *uint16 {\n\treturn &u\n}\n\n// ToUint32 returns a pointer to the passed uint32 value.\nfunc ToUint32(u uint32) *uint32 {\n\treturn &u\n}\n\n// ToUint64 returns a pointer to the passed uint64 value.\nfunc ToUint64(u uint64) *uint64 {\n\treturn &u\n}\n\n// ToUintptr returns a pointer to the passed uintptr value.\nfunc ToUintptr(u uintptr) *uintptr {\n\treturn &u\n}\n\n// ToDuration returns a pointer to the passed time.Duration value.\nfunc ToDuration(d time.Duration) *time.Duration {\n\treturn &d\n}\n\n// ToTime returns a pointer to the passed time.Time value.\nfunc ToTime(t time.Time) *time.Time {\n\treturn &t\n}\n"
  },
  {
    "path": "pointer_or_nil.go",
    "content": "package pointer\n\nimport (\n\t\"time\"\n)\n\n/*\nOrder as in spec:\n\tbool byte complex64 complex128 error float32 float64\n\tint int8 int16 int32 int64 rune string\n\tuint uint8 uint16 uint32 uint64 uintptr\n\ttime.Duration time.Time\n*/\n\n// ToBoolOrNil returns a pointer to the passed bool value, or nil, if passed value is a zero value.\nfunc ToBoolOrNil(b bool) *bool {\n\tif b == false {\n\t\treturn nil\n\t}\n\treturn &b\n}\n\n// ToByteOrNil returns a pointer to the passed byte value, or nil, if passed value is a zero value.\nfunc ToByteOrNil(b byte) *byte {\n\tif b == 0 {\n\t\treturn nil\n\t}\n\treturn &b\n}\n\n// ToComplex64OrNil returns a pointer to the passed complex64 value, or nil, if passed value is a zero value.\nfunc ToComplex64OrNil(c complex64) *complex64 {\n\tif c == 0 {\n\t\treturn nil\n\t}\n\treturn &c\n}\n\n// ToComplex128OrNil returns a pointer to the passed complex128 value, or nil, if passed value is a zero value.\nfunc ToComplex128OrNil(c complex128) *complex128 {\n\tif c == 0 {\n\t\treturn nil\n\t}\n\treturn &c\n}\n\n// ToErrorOrNil returns a pointer to the passed error value, or nil, if passed value is a zero value.\nfunc ToErrorOrNil(e error) *error {\n\tif e == nil {\n\t\treturn nil\n\t}\n\treturn &e\n}\n\n// ToFloat32OrNil returns a pointer to the passed float32 value, or nil, if passed value is a zero value.\nfunc ToFloat32OrNil(f float32) *float32 {\n\tif f == 0 {\n\t\treturn nil\n\t}\n\treturn &f\n}\n\n// ToFloat64OrNil returns a pointer to the passed float64 value, or nil, if passed value is a zero value.\nfunc ToFloat64OrNil(f float64) *float64 {\n\tif f == 0 {\n\t\treturn nil\n\t}\n\treturn &f\n}\n\n// ToIntOrNil returns a pointer to the passed int value, or nil, if passed value is a zero value.\nfunc ToIntOrNil(i int) *int {\n\tif i == 0 {\n\t\treturn nil\n\t}\n\treturn &i\n}\n\n// ToInt8OrNil returns a pointer to the passed int8 value, or nil, if passed value is a zero value.\nfunc ToInt8OrNil(i int8) *int8 {\n\tif i == 0 {\n\t\treturn nil\n\t}\n\treturn &i\n}\n\n// ToInt16OrNil returns a pointer to the passed int16 value, or nil, if passed value is a zero value.\nfunc ToInt16OrNil(i int16) *int16 {\n\tif i == 0 {\n\t\treturn nil\n\t}\n\treturn &i\n}\n\n// ToInt32OrNil returns a pointer to the passed int32 value, or nil, if passed value is a zero value.\nfunc ToInt32OrNil(i int32) *int32 {\n\tif i == 0 {\n\t\treturn nil\n\t}\n\treturn &i\n}\n\n// ToInt64OrNil returns a pointer to the passed int64 value, or nil, if passed value is a zero value.\nfunc ToInt64OrNil(i int64) *int64 {\n\tif i == 0 {\n\t\treturn nil\n\t}\n\treturn &i\n}\n\n// ToRuneOrNil returns a pointer to the passed rune value, or nil, if passed value is a zero value.\nfunc ToRuneOrNil(r rune) *rune {\n\tif r == 0 {\n\t\treturn nil\n\t}\n\treturn &r\n}\n\n// ToStringOrNil returns a pointer to the passed string value, or nil, if passed value is a zero value.\nfunc ToStringOrNil(s string) *string {\n\tif s == \"\" {\n\t\treturn nil\n\t}\n\treturn &s\n}\n\n// ToUintOrNil returns a pointer to the passed uint value, or nil, if passed value is a zero value.\nfunc ToUintOrNil(u uint) *uint {\n\tif u == 0 {\n\t\treturn nil\n\t}\n\treturn &u\n}\n\n// ToUint8OrNil returns a pointer to the passed uint8 value, or nil, if passed value is a zero value.\nfunc ToUint8OrNil(u uint8) *uint8 {\n\tif u == 0 {\n\t\treturn nil\n\t}\n\treturn &u\n}\n\n// ToUint16OrNil returns a pointer to the passed uint16 value, or nil, if passed value is a zero value.\nfunc ToUint16OrNil(u uint16) *uint16 {\n\tif u == 0 {\n\t\treturn nil\n\t}\n\treturn &u\n}\n\n// ToUint32OrNil returns a pointer to the passed uint32 value, or nil, if passed value is a zero value.\nfunc ToUint32OrNil(u uint32) *uint32 {\n\tif u == 0 {\n\t\treturn nil\n\t}\n\treturn &u\n}\n\n// ToUint64OrNil returns a pointer to the passed uint64 value, or nil, if passed value is a zero value.\nfunc ToUint64OrNil(u uint64) *uint64 {\n\tif u == 0 {\n\t\treturn nil\n\t}\n\treturn &u\n}\n\n// ToUintptrOrNil returns a pointer to the passed uintptr value, or nil, if passed value is a zero value.\nfunc ToUintptrOrNil(u uintptr) *uintptr {\n\tif u == 0 {\n\t\treturn nil\n\t}\n\treturn &u\n}\n\n// ToDurationOrNil returns a pointer to the passed time.Duration value, or nil, if passed value is a zero value.\nfunc ToDurationOrNil(d time.Duration) *time.Duration {\n\tif d == 0 {\n\t\treturn nil\n\t}\n\treturn &d\n}\n\n// ToTimeOrNil returns a pointer to the passed time.Time value, or nil, if passed value is a zero value (t.IsZero() returns true).\nfunc ToTimeOrNil(t time.Time) *time.Time {\n\tif t.IsZero() {\n\t\treturn nil\n\t}\n\treturn &t\n}\n"
  },
  {
    "path": "pointer_test.go",
    "content": "package pointer\n\nimport (\n\t\"encoding/json\"\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\t\"time\"\n)\n\n/*\nOrder as in spec:\n\tbool byte complex64 complex128 error float32 float64\n\tint int8 int16 int32 int64 rune string\n\tuint uint8 uint16 uint32 uint64 uintptr\n\ttime.Duration time.Time\n*/\n\nfunc TestBool(t *testing.T) {\n\tvar x bool\n\tif *ToBool(x) != x {\n\t\tt.Errorf(\"*ToBool(%v)\", x)\n\t}\n\tif ToBoolOrNil(x) != nil {\n\t\tt.Errorf(\"ToBoolOrNil(%v)\", x)\n\t}\n\tif GetBool(nil) != x {\n\t\tt.Errorf(\"GetBool(%v)\", nil)\n\t}\n\n\tx = true\n\tif *ToBool(x) != x {\n\t\tt.Errorf(\"*ToBool(%v)\", x)\n\t}\n\tif *ToBoolOrNil(x) != x {\n\t\tt.Errorf(\"*ToBoolOrNil(%v)\", x)\n\t}\n\tif GetBool(&x) != x {\n\t\tt.Errorf(\"GetBool(%v)\", &x)\n\t}\n}\n\nfunc TestByte(t *testing.T) {\n\tvar x byte\n\tif *ToByte(x) != x {\n\t\tt.Errorf(\"*ToByte(%v)\", x)\n\t}\n\tif ToByteOrNil(x) != nil {\n\t\tt.Errorf(\"ToByteOrNil(%v)\", x)\n\t}\n\tif GetByte(nil) != x {\n\t\tt.Errorf(\"GetByte(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToByte(x) != x {\n\t\tt.Errorf(\"*ToByte(%v)\", x)\n\t}\n\tif *ToByteOrNil(x) != x {\n\t\tt.Errorf(\"*ToByteOrNil(%v)\", x)\n\t}\n\tif GetByte(&x) != x {\n\t\tt.Errorf(\"GetByte(%v)\", &x)\n\t}\n}\n\nfunc TestComplex64(t *testing.T) {\n\tvar x complex64\n\tif *ToComplex64(x) != x {\n\t\tt.Errorf(\"*ToComplex64(%v)\", x)\n\t}\n\tif ToComplex64OrNil(x) != nil {\n\t\tt.Errorf(\"ToComplex64OrNil(%v)\", x)\n\t}\n\tif GetComplex64(nil) != x {\n\t\tt.Errorf(\"GetComplex64(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToComplex64(x) != x {\n\t\tt.Errorf(\"*ToComplex64(%v)\", x)\n\t}\n\tif *ToComplex64OrNil(x) != x {\n\t\tt.Errorf(\"*ToComplex64OrNil(%v)\", x)\n\t}\n\tif GetComplex64(&x) != x {\n\t\tt.Errorf(\"GetComplex64(%v)\", &x)\n\t}\n}\n\nfunc TestComplex128(t *testing.T) {\n\tvar x complex128\n\tif *ToComplex128(x) != x {\n\t\tt.Errorf(\"*ToComplex128(%v)\", x)\n\t}\n\tif ToComplex128OrNil(x) != nil {\n\t\tt.Errorf(\"ToComplex128OrNil(%v)\", x)\n\t}\n\tif GetComplex128(nil) != x {\n\t\tt.Errorf(\"GetComplex128(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToComplex128(x) != x {\n\t\tt.Errorf(\"*ToComplex128(%v)\", x)\n\t}\n\tif *ToComplex128OrNil(x) != x {\n\t\tt.Errorf(\"*ToComplex128OrNil(%v)\", x)\n\t}\n\tif GetComplex128(&x) != x {\n\t\tt.Errorf(\"GetComplex128(%v)\", &x)\n\t}\n}\n\nfunc TestError(t *testing.T) {\n\tvar x error\n\tif *ToError(x) != x {\n\t\tt.Errorf(\"*ToError(%v)\", x)\n\t}\n\tif ToErrorOrNil(x) != nil {\n\t\tt.Errorf(\"ToErrorOrNil(%v)\", x)\n\t}\n\tif GetError(nil) != x {\n\t\tt.Errorf(\"GetError(%v)\", nil)\n\t}\n\n\tx = errors.New(\"error\")\n\tif *ToError(x) != x {\n\t\tt.Errorf(\"*ToError(%v)\", x)\n\t}\n\tif *ToErrorOrNil(x) != x {\n\t\tt.Errorf(\"*ToErrorOrNil(%v)\", x)\n\t}\n\tif GetError(&x) != x {\n\t\tt.Errorf(\"GetError(%v)\", &x)\n\t}\n}\n\nfunc TestFloat32(t *testing.T) {\n\tvar x float32\n\tif *ToFloat32(x) != x {\n\t\tt.Errorf(\"*ToFloat32(%v)\", x)\n\t}\n\tif ToFloat32OrNil(x) != nil {\n\t\tt.Errorf(\"ToFloat32OrNil(%v)\", x)\n\t}\n\tif GetFloat32(nil) != x {\n\t\tt.Errorf(\"GetFloat32(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToFloat32(x) != x {\n\t\tt.Errorf(\"*ToFloat32(%v)\", x)\n\t}\n\tif *ToFloat32OrNil(x) != x {\n\t\tt.Errorf(\"*ToFloat32OrNil(%v)\", x)\n\t}\n\tif GetFloat32(&x) != x {\n\t\tt.Errorf(\"GetFloat32(%v)\", &x)\n\t}\n}\n\nfunc TestFloat64(t *testing.T) {\n\tvar x float64\n\tif *ToFloat64(x) != x {\n\t\tt.Errorf(\"*ToFloat64(%v)\", x)\n\t}\n\tif ToFloat64OrNil(x) != nil {\n\t\tt.Errorf(\"ToFloat64OrNil(%v)\", x)\n\t}\n\tif GetFloat64(nil) != x {\n\t\tt.Errorf(\"GetFloat64(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToFloat64(x) != x {\n\t\tt.Errorf(\"*ToFloat64(%v)\", x)\n\t}\n\tif *ToFloat64OrNil(x) != x {\n\t\tt.Errorf(\"*ToFloat64OrNil(%v)\", x)\n\t}\n\tif GetFloat64(&x) != x {\n\t\tt.Errorf(\"GetFloat64(%v)\", &x)\n\t}\n}\n\nfunc TestInt(t *testing.T) {\n\tvar x int\n\tif *ToInt(x) != x {\n\t\tt.Errorf(\"*ToInt(%v)\", x)\n\t}\n\tif ToIntOrNil(x) != nil {\n\t\tt.Errorf(\"ToIntOrNil(%v)\", x)\n\t}\n\tif GetInt(nil) != x {\n\t\tt.Errorf(\"GetInt(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToInt(x) != x {\n\t\tt.Errorf(\"*ToInt(%v)\", x)\n\t}\n\tif *ToIntOrNil(x) != x {\n\t\tt.Errorf(\"*ToIntOrNil(%v)\", x)\n\t}\n\tif GetInt(&x) != x {\n\t\tt.Errorf(\"GetInt(%v)\", &x)\n\t}\n}\n\nfunc TestInt8(t *testing.T) {\n\tvar x int8\n\tif *ToInt8(x) != x {\n\t\tt.Errorf(\"*ToInt8(%v)\", x)\n\t}\n\tif ToInt8OrNil(x) != nil {\n\t\tt.Errorf(\"ToInt8OrNil(%v)\", x)\n\t}\n\tif GetInt8(nil) != x {\n\t\tt.Errorf(\"GetInt8(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToInt8(x) != x {\n\t\tt.Errorf(\"*ToInt8(%v)\", x)\n\t}\n\tif *ToInt8OrNil(x) != x {\n\t\tt.Errorf(\"*ToInt8OrNil(%v)\", x)\n\t}\n\tif GetInt8(&x) != x {\n\t\tt.Errorf(\"GetInt8(%v)\", &x)\n\t}\n}\n\nfunc TestInt16(t *testing.T) {\n\tvar x int16\n\tif *ToInt16(x) != x {\n\t\tt.Errorf(\"*ToInt16(%v)\", x)\n\t}\n\tif ToInt16OrNil(x) != nil {\n\t\tt.Errorf(\"ToInt16OrNil(%v)\", x)\n\t}\n\tif GetInt16(nil) != x {\n\t\tt.Errorf(\"GetInt16(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToInt16(x) != x {\n\t\tt.Errorf(\"*ToInt16(%v)\", x)\n\t}\n\tif *ToInt16OrNil(x) != x {\n\t\tt.Errorf(\"*ToInt16OrNil(%v)\", x)\n\t}\n\tif GetInt16(&x) != x {\n\t\tt.Errorf(\"GetInt16(%v)\", &x)\n\t}\n}\n\nfunc TestInt32(t *testing.T) {\n\tvar x int32\n\tif *ToInt32(x) != x {\n\t\tt.Errorf(\"*ToInt32(%v)\", x)\n\t}\n\tif ToInt32OrNil(x) != nil {\n\t\tt.Errorf(\"ToInt32OrNil(%v)\", x)\n\t}\n\tif GetInt32(nil) != x {\n\t\tt.Errorf(\"GetInt32(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToInt32(x) != x {\n\t\tt.Errorf(\"*ToInt32(%v)\", x)\n\t}\n\tif *ToInt32OrNil(x) != x {\n\t\tt.Errorf(\"*ToInt32OrNil(%v)\", x)\n\t}\n\tif GetInt32(&x) != x {\n\t\tt.Errorf(\"GetInt32(%v)\", &x)\n\t}\n}\n\nfunc TestInt64(t *testing.T) {\n\tvar x int64\n\tif *ToInt64(x) != x {\n\t\tt.Errorf(\"*ToInt64(%v)\", x)\n\t}\n\tif ToInt64OrNil(x) != nil {\n\t\tt.Errorf(\"ToInt64OrNil(%v)\", x)\n\t}\n\tif GetInt64(nil) != x {\n\t\tt.Errorf(\"GetInt64(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToInt64(x) != x {\n\t\tt.Errorf(\"*ToInt64(%v)\", x)\n\t}\n\tif *ToInt64OrNil(x) != x {\n\t\tt.Errorf(\"*ToInt64OrNil(%v)\", x)\n\t}\n\tif GetInt64(&x) != x {\n\t\tt.Errorf(\"GetInt64(%v)\", &x)\n\t}\n}\n\nfunc TestRune(t *testing.T) {\n\tvar x rune\n\tif *ToRune(x) != x {\n\t\tt.Errorf(\"*ToRune(%v)\", x)\n\t}\n\tif ToRuneOrNil(x) != nil {\n\t\tt.Errorf(\"ToRuneOrNil(%v)\", x)\n\t}\n\tif GetRune(nil) != x {\n\t\tt.Errorf(\"GetRune(%v)\", nil)\n\t}\n\n\tx = 'x'\n\tif *ToRune(x) != x {\n\t\tt.Errorf(\"*ToRune(%v)\", x)\n\t}\n\tif *ToRuneOrNil(x) != x {\n\t\tt.Errorf(\"*ToRuneOrNil(%v)\", x)\n\t}\n\tif GetRune(&x) != x {\n\t\tt.Errorf(\"GetRune(%v)\", &x)\n\t}\n}\n\nfunc TestString(t *testing.T) {\n\tvar x string\n\tif *ToString(x) != x {\n\t\tt.Errorf(\"*ToString(%v)\", x)\n\t}\n\tif ToStringOrNil(x) != nil {\n\t\tt.Errorf(\"ToStringOrNil(%v)\", x)\n\t}\n\tif GetString(nil) != x {\n\t\tt.Errorf(\"GetString(%v)\", nil)\n\t}\n\n\tx = \"x\"\n\tif *ToString(x) != x {\n\t\tt.Errorf(\"*ToString(%v)\", x)\n\t}\n\tif *ToStringOrNil(x) != x {\n\t\tt.Errorf(\"*ToStringOrNil(%v)\", x)\n\t}\n\tif GetString(&x) != x {\n\t\tt.Errorf(\"GetString(%v)\", &x)\n\t}\n}\n\nfunc TestUint(t *testing.T) {\n\tvar x uint\n\tif *ToUint(x) != x {\n\t\tt.Errorf(\"*ToUint(%v)\", x)\n\t}\n\tif ToUintOrNil(x) != nil {\n\t\tt.Errorf(\"ToUintOrNil(%v)\", x)\n\t}\n\tif GetUint(nil) != x {\n\t\tt.Errorf(\"GetUint(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToUint(x) != x {\n\t\tt.Errorf(\"*ToUint(%v)\", x)\n\t}\n\tif *ToUintOrNil(x) != x {\n\t\tt.Errorf(\"*ToUintOrNil(%v)\", x)\n\t}\n\tif GetUint(&x) != x {\n\t\tt.Errorf(\"GetUint(%v)\", &x)\n\t}\n}\n\nfunc TestUint8(t *testing.T) {\n\tvar x uint8\n\tif *ToUint8(x) != x {\n\t\tt.Errorf(\"*ToUint8(%v)\", x)\n\t}\n\tif ToUint8OrNil(x) != nil {\n\t\tt.Errorf(\"ToUint8OrNil(%v)\", x)\n\t}\n\tif GetUint8(nil) != x {\n\t\tt.Errorf(\"GetUint8(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToUint8(x) != x {\n\t\tt.Errorf(\"*ToUint8(%v)\", x)\n\t}\n\tif *ToUint8OrNil(x) != x {\n\t\tt.Errorf(\"*ToUint8OrNil(%v)\", x)\n\t}\n\tif GetUint8(&x) != x {\n\t\tt.Errorf(\"GetUint8(%v)\", &x)\n\t}\n}\n\nfunc TestUint16(t *testing.T) {\n\tvar x uint16\n\tif *ToUint16(x) != x {\n\t\tt.Errorf(\"*ToUint16(%v)\", x)\n\t}\n\tif ToUint16OrNil(x) != nil {\n\t\tt.Errorf(\"ToUint16OrNil(%v)\", x)\n\t}\n\tif GetUint16(nil) != x {\n\t\tt.Errorf(\"GetUint16(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToUint16(x) != x {\n\t\tt.Errorf(\"*ToUint16(%v)\", x)\n\t}\n\tif *ToUint16OrNil(x) != x {\n\t\tt.Errorf(\"*ToUint16OrNil(%v)\", x)\n\t}\n\tif GetUint16(&x) != x {\n\t\tt.Errorf(\"GetUint16(%v)\", &x)\n\t}\n}\n\nfunc TestUint32(t *testing.T) {\n\tvar x uint32\n\tif *ToUint32(x) != x {\n\t\tt.Errorf(\"*ToUint32(%v)\", x)\n\t}\n\tif ToUint32OrNil(x) != nil {\n\t\tt.Errorf(\"ToUint32OrNil(%v)\", x)\n\t}\n\tif GetUint32(nil) != x {\n\t\tt.Errorf(\"GetUint32(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToUint32(x) != x {\n\t\tt.Errorf(\"*ToUint32(%v)\", x)\n\t}\n\tif *ToUint32OrNil(x) != x {\n\t\tt.Errorf(\"*ToUint32OrNil(%v)\", x)\n\t}\n\tif GetUint32(&x) != x {\n\t\tt.Errorf(\"GetUint32(%v)\", &x)\n\t}\n}\n\nfunc TestUint64(t *testing.T) {\n\tvar x uint64\n\tif *ToUint64(x) != x {\n\t\tt.Errorf(\"*ToUint64(%v)\", x)\n\t}\n\tif ToUint64OrNil(x) != nil {\n\t\tt.Errorf(\"ToUint64OrNil(%v)\", x)\n\t}\n\tif GetUint64(nil) != x {\n\t\tt.Errorf(\"GetUint64(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToUint64(x) != x {\n\t\tt.Errorf(\"*ToUint64(%v)\", x)\n\t}\n\tif *ToUint64OrNil(x) != x {\n\t\tt.Errorf(\"*ToUint64OrNil(%v)\", x)\n\t}\n\tif GetUint64(&x) != x {\n\t\tt.Errorf(\"GetUint64(%v)\", &x)\n\t}\n}\n\nfunc TestUintptr(t *testing.T) {\n\tvar x uintptr\n\tif *ToUintptr(x) != x {\n\t\tt.Errorf(\"*ToUintptr(%v)\", x)\n\t}\n\tif ToUintptrOrNil(x) != nil {\n\t\tt.Errorf(\"ToUintptrOrNil(%v)\", x)\n\t}\n\tif GetUintptr(nil) != x {\n\t\tt.Errorf(\"GetUintptr(%v)\", nil)\n\t}\n\n\tx = 42\n\tif *ToUintptr(x) != x {\n\t\tt.Errorf(\"*ToUintptr(%v)\", x)\n\t}\n\tif *ToUintptrOrNil(x) != x {\n\t\tt.Errorf(\"*ToUintptrOrNil(%v)\", x)\n\t}\n\tif GetUintptr(&x) != x {\n\t\tt.Errorf(\"GetUintptr(%v)\", &x)\n\t}\n}\n\nfunc TestDuration(t *testing.T) {\n\tvar x time.Duration\n\tif *ToDuration(x) != x {\n\t\tt.Errorf(\"*ToDuration(%v)\", x)\n\t}\n\tif ToDurationOrNil(x) != nil {\n\t\tt.Errorf(\"ToDurationOrNil(%v)\", x)\n\t}\n\tif GetDuration(nil) != x {\n\t\tt.Errorf(\"GetDuration(%v)\", nil)\n\t}\n\n\tx = time.Second\n\tif *ToDuration(x) != x {\n\t\tt.Errorf(\"*ToDuration(%v)\", x)\n\t}\n\tif *ToDurationOrNil(x) != x {\n\t\tt.Errorf(\"*ToDurationOrNil(%v)\", x)\n\t}\n\tif GetDuration(&x) != x {\n\t\tt.Errorf(\"GetDuration(%v)\", &x)\n\t}\n}\n\nfunc TestTime(t *testing.T) {\n\tvar x time.Time\n\tif *ToTime(x) != x {\n\t\tt.Errorf(\"*ToTime(%v)\", x)\n\t}\n\tif ToTimeOrNil(x) != nil {\n\t\tt.Errorf(\"ToTimeOrNil(%v)\", x)\n\t}\n\tif GetTime(nil) != x {\n\t\tt.Errorf(\"GetTime(%v)\", nil)\n\t}\n\n\tx = time.Date(2014, 6, 25, 12, 24, 40, 0, time.UTC)\n\tif *ToTime(x) != x {\n\t\tt.Errorf(\"*ToTime(%v)\", x)\n\t}\n\tif *ToTimeOrNil(x) != x {\n\t\tt.Errorf(\"*ToTimeOrNil(%v)\", x)\n\t}\n\tif GetTime(&x) != x {\n\t\tt.Errorf(\"GetTime(%v)\", &x)\n\t}\n}\n\nfunc Example() {\n\tconst (\n\t\tdefaultName = \"some name\"\n\t)\n\n\t// Stuff contains optional fields.\n\ttype Stuff struct {\n\t\tName    *string\n\t\tComment *string\n\t\tValue   *int64\n\t\tTime    *time.Time\n\t}\n\n\tb, _ := json.Marshal(&Stuff{\n\t\tName:    ToString(defaultName),                                   // can't say &defaultName\n\t\tComment: ToString(\"not yet\"),                                     // can't say &\"not yet\"\n\t\tValue:   ToInt64(42),                                             // can't say &42 or &int64(42)\n\t\tTime:    ToTime(time.Date(2014, 6, 25, 12, 24, 40, 0, time.UTC)), // can't say &time.Date(…)\n\t})\n\n\tfmt.Printf(\"%s\", b)\n\n\t// Output: {\"Name\":\"some name\",\"Comment\":\"not yet\",\"Value\":42,\"Time\":\"2014-06-25T12:24:40Z\"}\n}\n"
  },
  {
    "path": "value.go",
    "content": "package pointer\n\nimport (\n\t\"time\"\n)\n\n/*\nOrder as in spec:\n\tbool byte complex64 complex128 error float32 float64\n\tint int8 int16 int32 int64 rune string\n\tuint uint8 uint16 uint32 uint64 uintptr\n\ttime.Duration time.Time\n*/\n\n// GetBool returns the value of the bool pointer passed in or false if the pointer is nil.\nfunc GetBool(b *bool) bool {\n\tif b == nil {\n\t\treturn false\n\t}\n\treturn *b\n}\n\n// GetByte returns the value of the byte pointer passed in or 0 if the pointer is nil.\nfunc GetByte(b *byte) byte {\n\tif b == nil {\n\t\treturn 0\n\t}\n\treturn *b\n}\n\n// GetComplex64 returns the value of the complex64 pointer passed in or 0 if the pointer is nil.\nfunc GetComplex64(c *complex64) complex64 {\n\tif c == nil {\n\t\treturn 0\n\t}\n\treturn *c\n}\n\n// GetComplex128 returns the value of the complex128 pointer passed in or 0 if the pointer is nil.\nfunc GetComplex128(c *complex128) complex128 {\n\tif c == nil {\n\t\treturn 0\n\t}\n\treturn *c\n}\n\n// GetError returns the value of the error pointer passed in or nil if the pointer is nil.\nfunc GetError(e *error) error {\n\tif e == nil {\n\t\treturn nil\n\t}\n\treturn *e\n}\n\n// GetFloat32 returns the value of the float32 pointer passed in or 0 if the pointer is nil.\nfunc GetFloat32(f *float32) float32 {\n\tif f == nil {\n\t\treturn 0\n\t}\n\treturn *f\n}\n\n// GetFloat64 returns the value of the float64 pointer passed in or 0 if the pointer is nil.\nfunc GetFloat64(f *float64) float64 {\n\tif f == nil {\n\t\treturn 0\n\t}\n\treturn *f\n}\n\n// GetInt returns the value of the int pointer passed in or 0 if the pointer is nil.\nfunc GetInt(i *int) int {\n\tif i == nil {\n\t\treturn 0\n\t}\n\treturn *i\n}\n\n// GetInt8 returns the value of the int8 pointer passed in or 0 if the pointer is nil.\nfunc GetInt8(i *int8) int8 {\n\tif i == nil {\n\t\treturn 0\n\t}\n\treturn *i\n}\n\n// GetInt16 returns the value of the int16 pointer passed in or 0 if the pointer is nil.\nfunc GetInt16(i *int16) int16 {\n\tif i == nil {\n\t\treturn 0\n\t}\n\treturn *i\n}\n\n// GetInt32 returns the value of the int32 pointer passed in or 0 if the pointer is nil.\nfunc GetInt32(i *int32) int32 {\n\tif i == nil {\n\t\treturn 0\n\t}\n\treturn *i\n}\n\n// GetInt64 returns the value of the int64 pointer passed in or 0 if the pointer is nil.\nfunc GetInt64(i *int64) int64 {\n\tif i == nil {\n\t\treturn 0\n\t}\n\treturn *i\n}\n\n// GetRune returns the value of the rune pointer passed in or 0 if the pointer is nil.\nfunc GetRune(r *rune) rune {\n\tif r == nil {\n\t\treturn 0\n\t}\n\treturn *r\n}\n\n// GetString returns the value of the string pointer passed in or empty string if the pointer is nil.\nfunc GetString(s *string) string {\n\tif s == nil {\n\t\treturn \"\"\n\t}\n\treturn *s\n}\n\n// GetUint returns the value of the uint pointer passed in or 0 if the pointer is nil.\nfunc GetUint(u *uint) uint {\n\tif u == nil {\n\t\treturn 0\n\t}\n\treturn *u\n}\n\n// GetUint8 returns the value of the uint8 pointer passed in or 0 if the pointer is nil.\nfunc GetUint8(u *uint8) uint8 {\n\tif u == nil {\n\t\treturn 0\n\t}\n\treturn *u\n}\n\n// GetUint16 returns the value of the uint16 pointer passed in or 0 if the pointer is nil.\nfunc GetUint16(u *uint16) uint16 {\n\tif u == nil {\n\t\treturn 0\n\t}\n\treturn *u\n}\n\n// GetUint32 returns the value of the uint32 pointer passed in or 0 if the pointer is nil.\nfunc GetUint32(u *uint32) uint32 {\n\tif u == nil {\n\t\treturn 0\n\t}\n\treturn *u\n}\n\n// GetUint64 returns the value of the uint64 pointer passed in or 0 if the pointer is nil.\nfunc GetUint64(u *uint64) uint64 {\n\tif u == nil {\n\t\treturn 0\n\t}\n\treturn *u\n}\n\n// GetUintptr returns the value of the uintptr pointer passed in or 0 if the pointer is nil.\nfunc GetUintptr(u *uintptr) uintptr {\n\tif u == nil {\n\t\treturn 0\n\t}\n\treturn *u\n}\n\n// GetDuration returns the value of the duration pointer passed in or 0 if the pointer is nil.\nfunc GetDuration(d *time.Duration) time.Duration {\n\tif d == nil {\n\t\treturn 0\n\t}\n\treturn *d\n}\n\n// GetTime returns the value of the time pointer passed in or zero time.Time if the pointer is nil.\nfunc GetTime(t *time.Time) time.Time {\n\tif t == nil {\n\t\treturn time.Time{}\n\t}\n\treturn *t\n}\n"
  }
]