summaryrefslogtreecommitdiffstats
path: root/dependencies/pkg/mod/go.uber.org/atomic@v1.7.0/internal
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:36:04 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-28 12:36:04 +0000
commitb09c6d56832eb1718c07d74abf3bc6ae3fe4e030 (patch)
treed2caec2610d4ea887803ec9e9c3cd77136c448ba /dependencies/pkg/mod/go.uber.org/atomic@v1.7.0/internal
parentInitial commit. (diff)
downloadicingadb-b09c6d56832eb1718c07d74abf3bc6ae3fe4e030.tar.xz
icingadb-b09c6d56832eb1718c07d74abf3bc6ae3fe4e030.zip
Adding upstream version 1.1.0.upstream/1.1.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'dependencies/pkg/mod/go.uber.org/atomic@v1.7.0/internal')
-rw-r--r--dependencies/pkg/mod/go.uber.org/atomic@v1.7.0/internal/gen-atomicint/main.go218
-rw-r--r--dependencies/pkg/mod/go.uber.org/atomic@v1.7.0/internal/gen-atomicwrapper/main.go300
2 files changed, 518 insertions, 0 deletions
diff --git a/dependencies/pkg/mod/go.uber.org/atomic@v1.7.0/internal/gen-atomicint/main.go b/dependencies/pkg/mod/go.uber.org/atomic@v1.7.0/internal/gen-atomicint/main.go
new file mode 100644
index 0000000..211cd34
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/atomic@v1.7.0/internal/gen-atomicint/main.go
@@ -0,0 +1,218 @@
+// Copyright (c) 2020 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+// gen-atomicint generates an atomic wrapper around an integer type.
+//
+// gen-atomicint -name Int32 -wrapped int32 -file out.go
+//
+// The generated wrapper will use the functions in the sync/atomic package
+// named after the generated type.
+package main
+
+import (
+ "bytes"
+ "errors"
+ "flag"
+ "fmt"
+ "go/format"
+ "io"
+ "log"
+ "os"
+ "text/template"
+)
+
+func main() {
+ log.SetFlags(0)
+ if err := run(os.Args[1:]); err != nil {
+ log.Fatalf("%+v", err)
+ }
+}
+
+func run(args []string) error {
+ var opts struct {
+ Name string
+ Wrapped string
+ File string
+ Unsigned bool
+ }
+
+ flag := flag.NewFlagSet("gen-atomicint", flag.ContinueOnError)
+
+ flag.StringVar(&opts.Name, "name", "", "name of the generated type (e.g. Int32)")
+ flag.StringVar(&opts.Wrapped, "wrapped", "", "name of the wrapped type (e.g. int32)")
+ flag.StringVar(&opts.File, "file", "", "output file path (default: stdout)")
+ flag.BoolVar(&opts.Unsigned, "unsigned", false, "whether the type is unsigned")
+
+ if err := flag.Parse(args); err != nil {
+ return err
+ }
+
+ if len(opts.Name) == 0 || len(opts.Wrapped) == 0 {
+ return errors.New("flags -name and -wrapped are required")
+ }
+
+ var w io.Writer = os.Stdout
+ if file := opts.File; len(file) > 0 {
+ f, err := os.Create(file)
+ if err != nil {
+ return fmt.Errorf("create %q: %v", file, err)
+ }
+ defer f.Close()
+
+ w = f
+ }
+
+ data := struct {
+ Name string
+ Wrapped string
+ Unsigned bool
+ }{
+ Name: opts.Name,
+ Wrapped: opts.Wrapped,
+ Unsigned: opts.Unsigned,
+ }
+
+ var buff bytes.Buffer
+ if err := _tmpl.Execute(&buff, data); err != nil {
+ return fmt.Errorf("render template: %v", err)
+ }
+
+ bs, err := format.Source(buff.Bytes())
+ if err != nil {
+ return fmt.Errorf("reformat source: %v", err)
+ }
+
+ _, err = w.Write(bs)
+ return err
+}
+
+var _tmpl = template.Must(template.New("value.go").Parse(`// @generated Code generated by gen-atomicint.
+
+// Copyright (c) 2020 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package atomic
+
+import (
+ "encoding/json"
+ "strconv"
+ "sync/atomic"
+)
+
+// {{ .Name }} is an atomic wrapper around {{ .Wrapped }}.
+type {{ .Name }} struct {
+ _ nocmp // disallow non-atomic comparison
+
+ v {{ .Wrapped }}
+}
+
+// New{{ .Name }} creates a new {{ .Name }}.
+func New{{ .Name }}(i {{ .Wrapped }}) *{{ .Name }} {
+ return &{{ .Name }}{v: i}
+}
+
+// Load atomically loads the wrapped value.
+func (i *{{ .Name }}) Load() {{ .Wrapped }} {
+ return atomic.Load{{ .Name }}(&i.v)
+}
+
+// Add atomically adds to the wrapped {{ .Wrapped }} and returns the new value.
+func (i *{{ .Name }}) Add(n {{ .Wrapped }}) {{ .Wrapped }} {
+ return atomic.Add{{ .Name }}(&i.v, n)
+}
+
+// Sub atomically subtracts from the wrapped {{ .Wrapped }} and returns the new value.
+func (i *{{ .Name }}) Sub(n {{ .Wrapped }}) {{ .Wrapped }} {
+ return atomic.Add{{ .Name }}(&i.v,
+ {{- if .Unsigned -}}
+ ^(n - 1)
+ {{- else -}}
+ -n
+ {{- end -}}
+ )
+}
+
+// Inc atomically increments the wrapped {{ .Wrapped }} and returns the new value.
+func (i *{{ .Name }}) Inc() {{ .Wrapped }} {
+ return i.Add(1)
+}
+
+// Dec atomically decrements the wrapped {{ .Wrapped }} and returns the new value.
+func (i *{{ .Name }}) Dec() {{ .Wrapped }} {
+ return i.Sub(1)
+}
+
+// CAS is an atomic compare-and-swap.
+func (i *{{ .Name }}) CAS(old, new {{ .Wrapped }}) bool {
+ return atomic.CompareAndSwap{{ .Name }}(&i.v, old, new)
+}
+
+// Store atomically stores the passed value.
+func (i *{{ .Name }}) Store(n {{ .Wrapped }}) {
+ atomic.Store{{ .Name }}(&i.v, n)
+}
+
+// Swap atomically swaps the wrapped {{ .Wrapped }} and returns the old value.
+func (i *{{ .Name }}) Swap(n {{ .Wrapped }}) {{ .Wrapped }} {
+ return atomic.Swap{{ .Name }}(&i.v, n)
+}
+
+// MarshalJSON encodes the wrapped {{ .Wrapped }} into JSON.
+func (i *{{ .Name }}) MarshalJSON() ([]byte, error) {
+ return json.Marshal(i.Load())
+}
+
+// UnmarshalJSON decodes JSON into the wrapped {{ .Wrapped }}.
+func (i *{{ .Name }}) UnmarshalJSON(b []byte) error {
+ var v {{ .Wrapped }}
+ if err := json.Unmarshal(b, &v); err != nil {
+ return err
+ }
+ i.Store(v)
+ return nil
+}
+
+// String encodes the wrapped value as a string.
+func (i *{{ .Name }}) String() string {
+ v := i.Load()
+ {{ if .Unsigned -}}
+ return strconv.FormatUint(uint64(v), 10)
+ {{- else -}}
+ return strconv.FormatInt(int64(v), 10)
+ {{- end }}
+}
+`))
diff --git a/dependencies/pkg/mod/go.uber.org/atomic@v1.7.0/internal/gen-atomicwrapper/main.go b/dependencies/pkg/mod/go.uber.org/atomic@v1.7.0/internal/gen-atomicwrapper/main.go
new file mode 100644
index 0000000..862c411
--- /dev/null
+++ b/dependencies/pkg/mod/go.uber.org/atomic@v1.7.0/internal/gen-atomicwrapper/main.go
@@ -0,0 +1,300 @@
+// Copyright (c) 2020 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+// gen-atomicwrapper generates wrapper types around other atomic types.
+//
+// It supports plugging in functions which convert the value inside the atomic
+// type to the user-facing value. For example,
+//
+// Given, atomic.Value and the functions,
+//
+// func packString(string) interface{}
+// func unpackString(interface{}) string
+//
+// We can run the following command:
+//
+// gen-atomicwrapper -name String -wrapped Value \
+// -type string -pack fromString -unpack tostring
+//
+// This wil generate approximately,
+//
+// type String struct{ v Value }
+//
+// func (s *String) Load() string {
+// return unpackString(v.Load())
+// }
+//
+// func (s *String) Store(s string) {
+// return s.v.Store(packString(s))
+// }
+//
+// The packing/unpacking logic allows the stored value to be different from
+// the user-facing value.
+//
+// Without -pack and -unpack, the output will be cast to the target type,
+// defaulting to the zero value.
+package main
+
+import (
+ "bytes"
+ "errors"
+ "flag"
+ "fmt"
+ "go/format"
+ "io"
+ "log"
+ "os"
+ "sort"
+ "strings"
+ "text/template"
+)
+
+func main() {
+ log.SetFlags(0)
+ if err := run(os.Args[1:]); err != nil {
+ log.Fatalf("%+v", err)
+ }
+}
+
+type stringList []string
+
+func (sl *stringList) String() string {
+ return strings.Join(*sl, ",")
+}
+
+func (sl *stringList) Set(s string) error {
+ for _, i := range strings.Split(s, ",") {
+ *sl = append(*sl, strings.TrimSpace(i))
+ }
+ return nil
+}
+
+func run(args []string) error {
+ var opts struct {
+ Name string
+ Wrapped string
+ Type string
+
+ Imports stringList
+ Pack, Unpack string
+
+ CAS bool
+ Swap bool
+ JSON bool
+
+ File string
+ }
+
+ flag := flag.NewFlagSet("gen-atomicwrapper", flag.ContinueOnError)
+
+ // Required flags
+ flag.StringVar(&opts.Name, "name", "",
+ "name of the generated type (e.g. Duration)")
+ flag.StringVar(&opts.Wrapped, "wrapped", "",
+ "name of the wrapped atomic (e.g. Int64)")
+ flag.StringVar(&opts.Type, "type", "",
+ "name of the type exposed by the atomic (e.g. time.Duration)")
+
+ // Optional flags
+ flag.Var(&opts.Imports, "imports",
+ "comma separated list of imports to add")
+ flag.StringVar(&opts.Pack, "pack", "",
+ "function to transform values with before storage")
+ flag.StringVar(&opts.Unpack, "unpack", "",
+ "function to reverse packing on loading")
+ flag.StringVar(&opts.File, "file", "",
+ "output file path (default: stdout)")
+
+ // Switches for individual methods. Underlying atomics must support
+ // these.
+ flag.BoolVar(&opts.CAS, "cas", false,
+ "generate a `CAS(old, new) bool` method; requires -pack")
+ flag.BoolVar(&opts.Swap, "swap", false,
+ "generate a `Swap(new) old` method; requires -pack and -unpack")
+ flag.BoolVar(&opts.JSON, "json", false,
+ "generate `MarshalJSON/UnmarshJSON` methods")
+
+ if err := flag.Parse(args); err != nil {
+ return err
+ }
+
+ if len(opts.Name) == 0 || len(opts.Wrapped) == 0 || len(opts.Type) == 0 {
+ return errors.New("flags -name, -wrapped, and -type are required")
+ }
+
+ if (len(opts.Pack) == 0) != (len(opts.Unpack) == 0) {
+ return errors.New("either both, or neither of -pack and -unpack must be specified")
+ }
+
+ if opts.CAS && len(opts.Pack) == 0 {
+ return errors.New("flag -cas requires -pack")
+ }
+
+ if opts.Swap && len(opts.Pack) == 0 {
+ return errors.New("flag -swap requires -pack and -unpack")
+ }
+
+ var w io.Writer = os.Stdout
+ if file := opts.File; len(file) > 0 {
+ f, err := os.Create(file)
+ if err != nil {
+ return fmt.Errorf("create %q: %v", file, err)
+ }
+ defer f.Close()
+
+ w = f
+ }
+
+ // Import encoding/json if needed.
+ if opts.JSON {
+ found := false
+ for _, imp := range opts.Imports {
+ if imp == "encoding/json" {
+ found = true
+ break
+ }
+ }
+
+ if !found {
+ opts.Imports = append(opts.Imports, "encoding/json")
+ }
+ }
+
+ sort.Strings([]string(opts.Imports))
+
+ var buff bytes.Buffer
+ if err := _tmpl.Execute(&buff, opts); err != nil {
+ return fmt.Errorf("render template: %v", err)
+ }
+
+ bs, err := format.Source(buff.Bytes())
+ if err != nil {
+ return fmt.Errorf("reformat source: %v", err)
+ }
+
+ _, err = w.Write(bs)
+ return err
+}
+
+var _tmpl = template.Must(template.New("int.go").Parse(`// @generated Code generated by gen-atomicwrapper.
+
+// Copyright (c) 2020 Uber Technologies, Inc.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+package atomic
+
+{{ with .Imports }}
+import (
+ {{ range . -}}
+ {{ printf "%q" . }}
+ {{ end }}
+)
+{{ end }}
+
+// {{ .Name }} is an atomic type-safe wrapper for {{ .Type }} values.
+type {{ .Name }} struct{
+ _ nocmp // disallow non-atomic comparison
+
+ v {{ .Wrapped }}
+}
+
+var _zero{{ .Name }} {{ .Type }}
+
+
+// New{{ .Name }} creates a new {{ .Name }}.
+func New{{ .Name}}(v {{ .Type }}) *{{ .Name }} {
+ x := &{{ .Name }}{}
+ if v != _zero{{ .Name }} {
+ x.Store(v)
+ }
+ return x
+}
+
+// Load atomically loads the wrapped {{ .Type }}.
+func (x *{{ .Name }}) Load() {{ .Type }} {
+ {{ if .Unpack -}}
+ return {{ .Unpack }}(x.v.Load())
+ {{- else -}}
+ if v := x.v.Load(); v != nil {
+ return v.({{ .Type }})
+ }
+ return _zero{{ .Name }}
+ {{- end }}
+}
+
+// Store atomically stores the passed {{ .Type }}.
+func (x *{{ .Name }}) Store(v {{ .Type }}) {
+ {{ if .Pack -}}
+ x.v.Store({{ .Pack }}(v))
+ {{- else -}}
+ x.v.Store(v)
+ {{- end }}
+}
+
+{{ if .CAS -}}
+ // CAS is an atomic compare-and-swap for {{ .Type }} values.
+ func (x *{{ .Name }}) CAS(o, n {{ .Type }}) bool {
+ return x.v.CAS({{ .Pack }}(o), {{ .Pack }}(n))
+ }
+{{- end }}
+
+{{ if .Swap -}}
+ // Swap atomically stores the given {{ .Type }} and returns the old
+ // value.
+ func (x *{{ .Name }}) Swap(o {{ .Type }}) {{ .Type }} {
+ return {{ .Unpack }}(x.v.Swap({{ .Pack }}(o)))
+ }
+{{- end }}
+
+{{ if .JSON -}}
+ // MarshalJSON encodes the wrapped {{ .Type }} into JSON.
+ func (x *{{ .Name }}) MarshalJSON() ([]byte, error) {
+ return json.Marshal(x.Load())
+ }
+
+ // UnmarshalJSON decodes a {{ .Type }} from JSON.
+ func (x *{{ .Name }}) UnmarshalJSON(b []byte) error {
+ var v {{ .Type }}
+ if err := json.Unmarshal(b, &v); err != nil {
+ return err
+ }
+ x.Store(v)
+ return nil
+ }
+{{- end }}
+
+`))