set-gen example
This commit is contained in:
parent
048e42a36c
commit
241551e36e
1
cmd/libs/go2idl/set-gen/.gitignore
vendored
Normal file
1
cmd/libs/go2idl/set-gen/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
|||||||
|
set-gen
|
357
cmd/libs/go2idl/set-gen/generators/sets.go
Normal file
357
cmd/libs/go2idl/set-gen/generators/sets.go
Normal file
@ -0,0 +1,357 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Package generators has the generators for the set-gen utility.
|
||||||
|
package generators
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"k8s.io/kubernetes/cmd/libs/go2idl/args"
|
||||||
|
"k8s.io/kubernetes/cmd/libs/go2idl/generator"
|
||||||
|
"k8s.io/kubernetes/cmd/libs/go2idl/namer"
|
||||||
|
"k8s.io/kubernetes/cmd/libs/go2idl/types"
|
||||||
|
|
||||||
|
"github.com/golang/glog"
|
||||||
|
)
|
||||||
|
|
||||||
|
// NameSystems returns the name system used by the generators in this package.
|
||||||
|
func NameSystems() namer.NameSystems {
|
||||||
|
return namer.NameSystems{
|
||||||
|
"public": namer.NewPublicNamer(0),
|
||||||
|
"private": namer.NewPrivateNamer(0),
|
||||||
|
"raw": namer.NewRawNamer(nil),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// NameSystems returns the default name system for ordering the types to be
|
||||||
|
// processed by the generators in this package.
|
||||||
|
func DefaultNameSystem() string {
|
||||||
|
return "public"
|
||||||
|
}
|
||||||
|
|
||||||
|
// Packages makes the sets package definition.
|
||||||
|
func Packages(_ *generator.Context, arguments *args.GeneratorArgs) generator.Packages {
|
||||||
|
boilerplate, err := arguments.LoadGoBoilerplate()
|
||||||
|
if err != nil {
|
||||||
|
glog.Fatalf("Failed loading boilerplate: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return generator.Packages{&generator.DefaultPackage{
|
||||||
|
PackageName: "sets",
|
||||||
|
PackagePath: arguments.OutputPackagePath,
|
||||||
|
HeaderText: append(boilerplate, []byte(
|
||||||
|
`
|
||||||
|
// This file was autogenerated by the command:
|
||||||
|
// $ `+strings.Join(os.Args, " ")+`
|
||||||
|
// Do not edit it manually!
|
||||||
|
|
||||||
|
`)...),
|
||||||
|
PackageDocumentation: []byte(
|
||||||
|
`// Package sets has auto-generated set types.
|
||||||
|
`),
|
||||||
|
// GeneratorFunc returns a list of generators. Each generator makes a
|
||||||
|
// single file.
|
||||||
|
GeneratorFunc: func(c *generator.Context) (generators []generator.Generator) {
|
||||||
|
generators = []generator.Generator{
|
||||||
|
// Always generate a "doc.go" file.
|
||||||
|
generator.DefaultGen{OptionalName: "doc"},
|
||||||
|
// Make a separate file for the Empty type, since it's shared by every type.
|
||||||
|
generator.DefaultGen{
|
||||||
|
OptionalName: "empty",
|
||||||
|
OptionalBody: []byte(emptyTypeDecl),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
// Since we want a file per type that we generate a set for, we
|
||||||
|
// have to provide a function for this.
|
||||||
|
for _, t := range c.Order {
|
||||||
|
generators = append(generators, &genSet{
|
||||||
|
DefaultGen: generator.DefaultGen{
|
||||||
|
// Use the privatized version of the
|
||||||
|
// type name as the file name.
|
||||||
|
//
|
||||||
|
// TODO: make a namer that converts
|
||||||
|
// camelCase to '-' separation for file
|
||||||
|
// names?
|
||||||
|
OptionalName: c.Namers["private"].Name(t),
|
||||||
|
},
|
||||||
|
typeToMatch: t,
|
||||||
|
imports: generator.NewImportTracker(),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
return generators
|
||||||
|
},
|
||||||
|
FilterFunc: func(c *generator.Context, t *types.Type) bool {
|
||||||
|
// It would be reasonable to filter by the type's package here.
|
||||||
|
// It might be necessary if your input directory has a big
|
||||||
|
// import graph.
|
||||||
|
switch t.Kind {
|
||||||
|
case types.Map, types.Slice, types.Pointer:
|
||||||
|
// These types can't be keys in a map.
|
||||||
|
return false
|
||||||
|
case types.Builtin:
|
||||||
|
return true
|
||||||
|
case types.Struct:
|
||||||
|
// Only some structs can be keys in a map. This is triggered by the line
|
||||||
|
// // +genset
|
||||||
|
// or
|
||||||
|
// // +genset=true
|
||||||
|
return types.ExtractCommentTags("+", t.CommentLines)["genset"] == "true"
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
},
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
// genSet produces a file with a set for a single type.
|
||||||
|
type genSet struct {
|
||||||
|
generator.DefaultGen
|
||||||
|
typeToMatch *types.Type
|
||||||
|
imports *generator.ImportTracker
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filter ignores all but one type because we're making a single file per type.
|
||||||
|
func (g *genSet) Filter(c *generator.Context, t *types.Type) bool { return t == g.typeToMatch }
|
||||||
|
|
||||||
|
func (g *genSet) Namers(c *generator.Context) namer.NameSystems {
|
||||||
|
return namer.NameSystems{
|
||||||
|
"raw": namer.NewRawNamer(g.imports),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *genSet) Imports(c *generator.Context) (imports []string) {
|
||||||
|
return append(g.imports.ImportLines(), "reflect", "sort")
|
||||||
|
}
|
||||||
|
|
||||||
|
// args constructs arguments for templates. Usage:
|
||||||
|
// g.args(t, "key1", value1, "key2", value2, ...)
|
||||||
|
//
|
||||||
|
// 't' is loaded with the key 'type'.
|
||||||
|
//
|
||||||
|
// We could use t directly as the argument, but doing it this way makes it easy
|
||||||
|
// to mix in additional parameters. This feature is not used in this set
|
||||||
|
// generator, but is present as an example.
|
||||||
|
func (g *genSet) args(t *types.Type, kv ...interface{}) interface{} {
|
||||||
|
m := map[interface{}]interface{}{"type": t}
|
||||||
|
for i := 0; i < len(kv)/2; i++ {
|
||||||
|
m[kv[i*2]] = kv[i*2+1]
|
||||||
|
}
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
// GenerateType makes the body of a file implementing a set for type t.
|
||||||
|
func (g *genSet) GenerateType(c *generator.Context, t *types.Type, w io.Writer) error {
|
||||||
|
sw := generator.NewSnippetWriter(w, c, "$", "$")
|
||||||
|
sw.Do(setCode, g.args(t))
|
||||||
|
sw.Do("func less$.type|public$(lhs, rhs $.type|raw$) bool {\n", g.args(t))
|
||||||
|
g.lessBody(sw, t)
|
||||||
|
sw.Do("}\n", g.args(t))
|
||||||
|
return sw.Error()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *genSet) lessBody(sw *generator.SnippetWriter, t *types.Type) {
|
||||||
|
// TODO: make this recursive, handle pointers and multiple nested structs...
|
||||||
|
switch t.Kind {
|
||||||
|
case types.Struct:
|
||||||
|
for _, m := range types.FlattenMembers(t.Members) {
|
||||||
|
sw.Do("if lhs.$.Name$ < rhs.$.Name$ { return true }\n", m)
|
||||||
|
sw.Do("if lhs.$.Name$ > rhs.$.Name$ { return false }\n", m)
|
||||||
|
}
|
||||||
|
sw.Do("return false\n", nil)
|
||||||
|
default:
|
||||||
|
sw.Do("return lhs < rhs\n", nil)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// written to the "empty.go" file.
|
||||||
|
var emptyTypeDecl = `
|
||||||
|
// Empty is public since it is used by some internal API objects for conversions between external
|
||||||
|
// string arrays and internal sets, and conversion logic requires public types today.
|
||||||
|
type Empty struct{}
|
||||||
|
`
|
||||||
|
|
||||||
|
// Written for every type. If you've never used text/template before:
|
||||||
|
// $.type$ refers to the source type; |public means to
|
||||||
|
// call the function giving the public name, |raw the raw type name.
|
||||||
|
var setCode = `// sets.$.type|public$ is a set of $.type|raw$s, implemented via map[$.type|raw$]struct{} for minimal memory consumption.
|
||||||
|
type $.type|public$ map[$.type|raw$]Empty
|
||||||
|
|
||||||
|
// New creates a $.type|public$ from a list of values.
|
||||||
|
func New$.type|public$(items ...$.type|raw$) $.type|public$ {
|
||||||
|
ss := $.type|public${}
|
||||||
|
ss.Insert(items...)
|
||||||
|
return ss
|
||||||
|
}
|
||||||
|
|
||||||
|
// $.type|public$KeySet creates a $.type|public$ from a keys of a map[$.type|raw$](? extends interface{}).
|
||||||
|
// If the value passed in is not actually a map, this will panic.
|
||||||
|
func $.type|public$KeySet(theMap interface{}) $.type|public$ {
|
||||||
|
v := reflect.ValueOf(theMap)
|
||||||
|
ret := $.type|public${}
|
||||||
|
|
||||||
|
for _, keyValue := range v.MapKeys() {
|
||||||
|
ret.Insert(keyValue.Interface().($.type|raw$))
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert adds items to the set.
|
||||||
|
func (s $.type|public$) Insert(items ...$.type|raw$) {
|
||||||
|
for _, item := range items {
|
||||||
|
s[item] = Empty{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete removes all items from the set.
|
||||||
|
func (s $.type|public$) Delete(items ...$.type|raw$) {
|
||||||
|
for _, item := range items {
|
||||||
|
delete(s, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Has returns true if and only if item is contained in the set.
|
||||||
|
func (s $.type|public$) Has(item $.type|raw$) bool {
|
||||||
|
_, contained := s[item]
|
||||||
|
return contained
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAll returns true if and only if all items are contained in the set.
|
||||||
|
func (s $.type|public$) HasAll(items ...$.type|raw$) bool {
|
||||||
|
for _, item := range items {
|
||||||
|
if !s.Has(item) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAny returns true if any items are contained in the set.
|
||||||
|
func (s $.type|public$) HasAny(items ...$.type|raw$) bool {
|
||||||
|
for _, item := range items {
|
||||||
|
if s.Has(item) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Difference returns a set of objects that are not in s2
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2, a3}
|
||||||
|
// s2 = {a1, a2, a4, a5}
|
||||||
|
// s1.Difference(s2) = {a3}
|
||||||
|
// s2.Difference(s1) = {a4, a5}
|
||||||
|
func (s $.type|public$) Difference(s2 $.type|public$) $.type|public$ {
|
||||||
|
result := New$.type|public$()
|
||||||
|
for key := range s {
|
||||||
|
if !s2.Has(key) {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Union returns a new set which includes items in either s1 or s2.
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2}
|
||||||
|
// s2 = {a3, a4}
|
||||||
|
// s1.Union(s2) = {a1, a2, a3, a4}
|
||||||
|
// s2.Union(s1) = {a1, a2, a3, a4}
|
||||||
|
func (s1 $.type|public$) Union(s2 $.type|public$) $.type|public$ {
|
||||||
|
result := New$.type|public$()
|
||||||
|
for key := range s1 {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
for key := range s2 {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Intersection returns a new set which includes the item in BOTH s1 and s2
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2}
|
||||||
|
// s2 = {a2, a3}
|
||||||
|
// s1.Intersection(s2) = {a2}
|
||||||
|
func (s1 $.type|public$) Intersection(s2 $.type|public$) $.type|public$ {
|
||||||
|
var walk, other $.type|public$
|
||||||
|
result := New$.type|public$()
|
||||||
|
if s1.Len() < s2.Len() {
|
||||||
|
walk = s1
|
||||||
|
other = s2
|
||||||
|
} else {
|
||||||
|
walk = s2
|
||||||
|
other = s1
|
||||||
|
}
|
||||||
|
for key := range walk {
|
||||||
|
if other.Has(key) {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSuperset returns true if and only if s1 is a superset of s2.
|
||||||
|
func (s1 $.type|public$) IsSuperset(s2 $.type|public$) bool {
|
||||||
|
for item := range s2 {
|
||||||
|
if !s1.Has(item) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal returns true if and only if s1 is equal (as a set) to s2.
|
||||||
|
// Two sets are equal if their membership is identical.
|
||||||
|
// (In practice, this means same elements, order doesn't matter)
|
||||||
|
func (s1 $.type|public$) Equal(s2 $.type|public$) bool {
|
||||||
|
return len(s1) == len(s2) && s1.IsSuperset(s2)
|
||||||
|
}
|
||||||
|
|
||||||
|
type sortableSliceOf$.type|public$ []$.type|raw$
|
||||||
|
|
||||||
|
func (s sortableSliceOf$.type|public$) Len() int { return len(s) }
|
||||||
|
func (s sortableSliceOf$.type|public$) Less(i, j int) bool { return less$.type|public$(s[i], s[j]) }
|
||||||
|
func (s sortableSliceOf$.type|public$) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||||
|
|
||||||
|
// List returns the contents as a sorted $.type|raw$ slice.
|
||||||
|
func (s $.type|public$) List() []$.type|raw$ {
|
||||||
|
res := make(sortableSliceOf$.type|public$, 0, len(s))
|
||||||
|
for key := range s {
|
||||||
|
res = append(res, key)
|
||||||
|
}
|
||||||
|
sort.Sort(res)
|
||||||
|
return []$.type|raw$(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a single element from the set.
|
||||||
|
func (s $.type|public$) PopAny() ($.type|raw$, bool) {
|
||||||
|
for key := range s {
|
||||||
|
s.Delete(key)
|
||||||
|
return key, true
|
||||||
|
}
|
||||||
|
var zeroValue $.type|raw$
|
||||||
|
return zeroValue, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Len returns the size of the set.
|
||||||
|
func (s $.type|public$) Len() int {
|
||||||
|
return len(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
`
|
49
cmd/libs/go2idl/set-gen/main.go
Normal file
49
cmd/libs/go2idl/set-gen/main.go
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// set-gen is an example usage of go2idl.
|
||||||
|
//
|
||||||
|
// Structs in the input directories with the below line in their comments will
|
||||||
|
// have sets generated for them.
|
||||||
|
// // +genset
|
||||||
|
//
|
||||||
|
// Any builtin type referenced anywhere in the input directories will have a
|
||||||
|
// set generated for it.
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"k8s.io/kubernetes/cmd/libs/go2idl/args"
|
||||||
|
"k8s.io/kubernetes/cmd/libs/go2idl/set-gen/generators"
|
||||||
|
|
||||||
|
"github.com/golang/glog"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
arguments := args.Default()
|
||||||
|
|
||||||
|
// Override defaults. These are Kubernetes specific input and output
|
||||||
|
// locations.
|
||||||
|
arguments.InputDirs = []string{"k8s.io/kubernetes/pkg/util/sets/types"}
|
||||||
|
arguments.OutputPackagePath = "k8s.io/kubernetes/pkg/util/sets"
|
||||||
|
|
||||||
|
if err := arguments.Execute(
|
||||||
|
generators.NameSystems(),
|
||||||
|
generators.DefaultNameSystem(),
|
||||||
|
generators.Packages,
|
||||||
|
); err != nil {
|
||||||
|
glog.Fatalf("Error: %v", err)
|
||||||
|
}
|
||||||
|
}
|
@ -21,7 +21,6 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"math"
|
"math"
|
||||||
"net/http"
|
"net/http"
|
||||||
"reflect"
|
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
@ -687,7 +686,7 @@ func (k *KubernetesScheduler) explicitlyReconcileTasks(driver bindings.Scheduler
|
|||||||
|
|
||||||
// tell mesos to send us the latest status updates for all the non-terminal tasks that we know about
|
// tell mesos to send us the latest status updates for all the non-terminal tasks that we know about
|
||||||
statusList := []*mesos.TaskStatus{}
|
statusList := []*mesos.TaskStatus{}
|
||||||
remaining := sets.KeySet(reflect.ValueOf(taskToSlave))
|
remaining := sets.StringKeySet(taskToSlave)
|
||||||
for taskId, slaveId := range taskToSlave {
|
for taskId, slaveId := range taskToSlave {
|
||||||
if slaveId == "" {
|
if slaveId == "" {
|
||||||
delete(taskToSlave, taskId)
|
delete(taskToSlave, taskId)
|
||||||
|
@ -55,7 +55,7 @@ func newNavigationSteps(path string) (*navigationSteps, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
nextPart := findNameStep(individualParts[currPartIndex:], sets.KeySet(reflect.ValueOf(mapValueOptions)))
|
nextPart := findNameStep(individualParts[currPartIndex:], sets.StringKeySet(mapValueOptions))
|
||||||
|
|
||||||
steps = append(steps, navigationStep{nextPart, mapValueType})
|
steps = append(steps, navigationStep{nextPart, mapValueType})
|
||||||
currPartIndex += len(strings.Split(nextPart, "."))
|
currPartIndex += len(strings.Split(nextPart, "."))
|
||||||
|
196
pkg/util/sets/byte.go
Normal file
196
pkg/util/sets/byte.go
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This file was autogenerated by the command:
|
||||||
|
// $ cmd/libs/go2idl/set-gen/set-gen
|
||||||
|
// Do not edit it manually!
|
||||||
|
|
||||||
|
package sets
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"sort"
|
||||||
|
)
|
||||||
|
|
||||||
|
// sets.Byte is a set of bytes, implemented via map[byte]struct{} for minimal memory consumption.
|
||||||
|
type Byte map[byte]Empty
|
||||||
|
|
||||||
|
// New creates a Byte from a list of values.
|
||||||
|
func NewByte(items ...byte) Byte {
|
||||||
|
ss := Byte{}
|
||||||
|
ss.Insert(items...)
|
||||||
|
return ss
|
||||||
|
}
|
||||||
|
|
||||||
|
// ByteKeySet creates a Byte from a keys of a map[byte](? extends interface{}).
|
||||||
|
// If the value passed in is not actually a map, this will panic.
|
||||||
|
func ByteKeySet(theMap interface{}) Byte {
|
||||||
|
v := reflect.ValueOf(theMap)
|
||||||
|
ret := Byte{}
|
||||||
|
|
||||||
|
for _, keyValue := range v.MapKeys() {
|
||||||
|
ret.Insert(keyValue.Interface().(byte))
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert adds items to the set.
|
||||||
|
func (s Byte) Insert(items ...byte) {
|
||||||
|
for _, item := range items {
|
||||||
|
s[item] = Empty{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete removes all items from the set.
|
||||||
|
func (s Byte) Delete(items ...byte) {
|
||||||
|
for _, item := range items {
|
||||||
|
delete(s, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Has returns true if and only if item is contained in the set.
|
||||||
|
func (s Byte) Has(item byte) bool {
|
||||||
|
_, contained := s[item]
|
||||||
|
return contained
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAll returns true if and only if all items are contained in the set.
|
||||||
|
func (s Byte) HasAll(items ...byte) bool {
|
||||||
|
for _, item := range items {
|
||||||
|
if !s.Has(item) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAny returns true if any items are contained in the set.
|
||||||
|
func (s Byte) HasAny(items ...byte) bool {
|
||||||
|
for _, item := range items {
|
||||||
|
if s.Has(item) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Difference returns a set of objects that are not in s2
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2, a3}
|
||||||
|
// s2 = {a1, a2, a4, a5}
|
||||||
|
// s1.Difference(s2) = {a3}
|
||||||
|
// s2.Difference(s1) = {a4, a5}
|
||||||
|
func (s Byte) Difference(s2 Byte) Byte {
|
||||||
|
result := NewByte()
|
||||||
|
for key := range s {
|
||||||
|
if !s2.Has(key) {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Union returns a new set which includes items in either s1 or s2.
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2}
|
||||||
|
// s2 = {a3, a4}
|
||||||
|
// s1.Union(s2) = {a1, a2, a3, a4}
|
||||||
|
// s2.Union(s1) = {a1, a2, a3, a4}
|
||||||
|
func (s1 Byte) Union(s2 Byte) Byte {
|
||||||
|
result := NewByte()
|
||||||
|
for key := range s1 {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
for key := range s2 {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Intersection returns a new set which includes the item in BOTH s1 and s2
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2}
|
||||||
|
// s2 = {a2, a3}
|
||||||
|
// s1.Intersection(s2) = {a2}
|
||||||
|
func (s1 Byte) Intersection(s2 Byte) Byte {
|
||||||
|
var walk, other Byte
|
||||||
|
result := NewByte()
|
||||||
|
if s1.Len() < s2.Len() {
|
||||||
|
walk = s1
|
||||||
|
other = s2
|
||||||
|
} else {
|
||||||
|
walk = s2
|
||||||
|
other = s1
|
||||||
|
}
|
||||||
|
for key := range walk {
|
||||||
|
if other.Has(key) {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSuperset returns true if and only if s1 is a superset of s2.
|
||||||
|
func (s1 Byte) IsSuperset(s2 Byte) bool {
|
||||||
|
for item := range s2 {
|
||||||
|
if !s1.Has(item) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal returns true if and only if s1 is equal (as a set) to s2.
|
||||||
|
// Two sets are equal if their membership is identical.
|
||||||
|
// (In practice, this means same elements, order doesn't matter)
|
||||||
|
func (s1 Byte) Equal(s2 Byte) bool {
|
||||||
|
return len(s1) == len(s2) && s1.IsSuperset(s2)
|
||||||
|
}
|
||||||
|
|
||||||
|
type sortableSliceOfByte []byte
|
||||||
|
|
||||||
|
func (s sortableSliceOfByte) Len() int { return len(s) }
|
||||||
|
func (s sortableSliceOfByte) Less(i, j int) bool { return lessByte(s[i], s[j]) }
|
||||||
|
func (s sortableSliceOfByte) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||||
|
|
||||||
|
// List returns the contents as a sorted byte slice.
|
||||||
|
func (s Byte) List() []byte {
|
||||||
|
res := make(sortableSliceOfByte, 0, len(s))
|
||||||
|
for key := range s {
|
||||||
|
res = append(res, key)
|
||||||
|
}
|
||||||
|
sort.Sort(res)
|
||||||
|
return []byte(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a single element from the set.
|
||||||
|
func (s Byte) PopAny() (byte, bool) {
|
||||||
|
for key := range s {
|
||||||
|
s.Delete(key)
|
||||||
|
return key, true
|
||||||
|
}
|
||||||
|
var zeroValue byte
|
||||||
|
return zeroValue, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Len returns the size of the set.
|
||||||
|
func (s Byte) Len() int {
|
||||||
|
return len(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func lessByte(lhs, rhs byte) bool {
|
||||||
|
return lhs < rhs
|
||||||
|
}
|
22
pkg/util/sets/doc.go
Normal file
22
pkg/util/sets/doc.go
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This file was autogenerated by the command:
|
||||||
|
// $ cmd/libs/go2idl/set-gen/set-gen
|
||||||
|
// Do not edit it manually!
|
||||||
|
|
||||||
|
// Package sets has auto-generated set types.
|
||||||
|
package sets
|
25
pkg/util/sets/empty.go
Normal file
25
pkg/util/sets/empty.go
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This file was autogenerated by the command:
|
||||||
|
// $ cmd/libs/go2idl/set-gen/set-gen
|
||||||
|
// Do not edit it manually!
|
||||||
|
|
||||||
|
package sets
|
||||||
|
|
||||||
|
// Empty is public since it is used by some internal API objects for conversions between external
|
||||||
|
// string arrays and internal sets, and conversion logic requires public types today.
|
||||||
|
type Empty struct{}
|
196
pkg/util/sets/int.go
Normal file
196
pkg/util/sets/int.go
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This file was autogenerated by the command:
|
||||||
|
// $ cmd/libs/go2idl/set-gen/set-gen
|
||||||
|
// Do not edit it manually!
|
||||||
|
|
||||||
|
package sets
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"sort"
|
||||||
|
)
|
||||||
|
|
||||||
|
// sets.Int is a set of ints, implemented via map[int]struct{} for minimal memory consumption.
|
||||||
|
type Int map[int]Empty
|
||||||
|
|
||||||
|
// New creates a Int from a list of values.
|
||||||
|
func NewInt(items ...int) Int {
|
||||||
|
ss := Int{}
|
||||||
|
ss.Insert(items...)
|
||||||
|
return ss
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntKeySet creates a Int from a keys of a map[int](? extends interface{}).
|
||||||
|
// If the value passed in is not actually a map, this will panic.
|
||||||
|
func IntKeySet(theMap interface{}) Int {
|
||||||
|
v := reflect.ValueOf(theMap)
|
||||||
|
ret := Int{}
|
||||||
|
|
||||||
|
for _, keyValue := range v.MapKeys() {
|
||||||
|
ret.Insert(keyValue.Interface().(int))
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert adds items to the set.
|
||||||
|
func (s Int) Insert(items ...int) {
|
||||||
|
for _, item := range items {
|
||||||
|
s[item] = Empty{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete removes all items from the set.
|
||||||
|
func (s Int) Delete(items ...int) {
|
||||||
|
for _, item := range items {
|
||||||
|
delete(s, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Has returns true if and only if item is contained in the set.
|
||||||
|
func (s Int) Has(item int) bool {
|
||||||
|
_, contained := s[item]
|
||||||
|
return contained
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAll returns true if and only if all items are contained in the set.
|
||||||
|
func (s Int) HasAll(items ...int) bool {
|
||||||
|
for _, item := range items {
|
||||||
|
if !s.Has(item) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAny returns true if any items are contained in the set.
|
||||||
|
func (s Int) HasAny(items ...int) bool {
|
||||||
|
for _, item := range items {
|
||||||
|
if s.Has(item) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Difference returns a set of objects that are not in s2
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2, a3}
|
||||||
|
// s2 = {a1, a2, a4, a5}
|
||||||
|
// s1.Difference(s2) = {a3}
|
||||||
|
// s2.Difference(s1) = {a4, a5}
|
||||||
|
func (s Int) Difference(s2 Int) Int {
|
||||||
|
result := NewInt()
|
||||||
|
for key := range s {
|
||||||
|
if !s2.Has(key) {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Union returns a new set which includes items in either s1 or s2.
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2}
|
||||||
|
// s2 = {a3, a4}
|
||||||
|
// s1.Union(s2) = {a1, a2, a3, a4}
|
||||||
|
// s2.Union(s1) = {a1, a2, a3, a4}
|
||||||
|
func (s1 Int) Union(s2 Int) Int {
|
||||||
|
result := NewInt()
|
||||||
|
for key := range s1 {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
for key := range s2 {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Intersection returns a new set which includes the item in BOTH s1 and s2
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2}
|
||||||
|
// s2 = {a2, a3}
|
||||||
|
// s1.Intersection(s2) = {a2}
|
||||||
|
func (s1 Int) Intersection(s2 Int) Int {
|
||||||
|
var walk, other Int
|
||||||
|
result := NewInt()
|
||||||
|
if s1.Len() < s2.Len() {
|
||||||
|
walk = s1
|
||||||
|
other = s2
|
||||||
|
} else {
|
||||||
|
walk = s2
|
||||||
|
other = s1
|
||||||
|
}
|
||||||
|
for key := range walk {
|
||||||
|
if other.Has(key) {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSuperset returns true if and only if s1 is a superset of s2.
|
||||||
|
func (s1 Int) IsSuperset(s2 Int) bool {
|
||||||
|
for item := range s2 {
|
||||||
|
if !s1.Has(item) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal returns true if and only if s1 is equal (as a set) to s2.
|
||||||
|
// Two sets are equal if their membership is identical.
|
||||||
|
// (In practice, this means same elements, order doesn't matter)
|
||||||
|
func (s1 Int) Equal(s2 Int) bool {
|
||||||
|
return len(s1) == len(s2) && s1.IsSuperset(s2)
|
||||||
|
}
|
||||||
|
|
||||||
|
type sortableSliceOfInt []int
|
||||||
|
|
||||||
|
func (s sortableSliceOfInt) Len() int { return len(s) }
|
||||||
|
func (s sortableSliceOfInt) Less(i, j int) bool { return lessInt(s[i], s[j]) }
|
||||||
|
func (s sortableSliceOfInt) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||||
|
|
||||||
|
// List returns the contents as a sorted int slice.
|
||||||
|
func (s Int) List() []int {
|
||||||
|
res := make(sortableSliceOfInt, 0, len(s))
|
||||||
|
for key := range s {
|
||||||
|
res = append(res, key)
|
||||||
|
}
|
||||||
|
sort.Sort(res)
|
||||||
|
return []int(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a single element from the set.
|
||||||
|
func (s Int) PopAny() (int, bool) {
|
||||||
|
for key := range s {
|
||||||
|
s.Delete(key)
|
||||||
|
return key, true
|
||||||
|
}
|
||||||
|
var zeroValue int
|
||||||
|
return zeroValue, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Len returns the size of the set.
|
||||||
|
func (s Int) Len() int {
|
||||||
|
return len(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func lessInt(lhs, rhs int) bool {
|
||||||
|
return lhs < rhs
|
||||||
|
}
|
196
pkg/util/sets/int64.go
Normal file
196
pkg/util/sets/int64.go
Normal file
@ -0,0 +1,196 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// This file was autogenerated by the command:
|
||||||
|
// $ cmd/libs/go2idl/set-gen/set-gen
|
||||||
|
// Do not edit it manually!
|
||||||
|
|
||||||
|
package sets
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"sort"
|
||||||
|
)
|
||||||
|
|
||||||
|
// sets.Int64 is a set of int64s, implemented via map[int64]struct{} for minimal memory consumption.
|
||||||
|
type Int64 map[int64]Empty
|
||||||
|
|
||||||
|
// New creates a Int64 from a list of values.
|
||||||
|
func NewInt64(items ...int64) Int64 {
|
||||||
|
ss := Int64{}
|
||||||
|
ss.Insert(items...)
|
||||||
|
return ss
|
||||||
|
}
|
||||||
|
|
||||||
|
// Int64KeySet creates a Int64 from a keys of a map[int64](? extends interface{}).
|
||||||
|
// If the value passed in is not actually a map, this will panic.
|
||||||
|
func Int64KeySet(theMap interface{}) Int64 {
|
||||||
|
v := reflect.ValueOf(theMap)
|
||||||
|
ret := Int64{}
|
||||||
|
|
||||||
|
for _, keyValue := range v.MapKeys() {
|
||||||
|
ret.Insert(keyValue.Interface().(int64))
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
// Insert adds items to the set.
|
||||||
|
func (s Int64) Insert(items ...int64) {
|
||||||
|
for _, item := range items {
|
||||||
|
s[item] = Empty{}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete removes all items from the set.
|
||||||
|
func (s Int64) Delete(items ...int64) {
|
||||||
|
for _, item := range items {
|
||||||
|
delete(s, item)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Has returns true if and only if item is contained in the set.
|
||||||
|
func (s Int64) Has(item int64) bool {
|
||||||
|
_, contained := s[item]
|
||||||
|
return contained
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAll returns true if and only if all items are contained in the set.
|
||||||
|
func (s Int64) HasAll(items ...int64) bool {
|
||||||
|
for _, item := range items {
|
||||||
|
if !s.Has(item) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// HasAny returns true if any items are contained in the set.
|
||||||
|
func (s Int64) HasAny(items ...int64) bool {
|
||||||
|
for _, item := range items {
|
||||||
|
if s.Has(item) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Difference returns a set of objects that are not in s2
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2, a3}
|
||||||
|
// s2 = {a1, a2, a4, a5}
|
||||||
|
// s1.Difference(s2) = {a3}
|
||||||
|
// s2.Difference(s1) = {a4, a5}
|
||||||
|
func (s Int64) Difference(s2 Int64) Int64 {
|
||||||
|
result := NewInt64()
|
||||||
|
for key := range s {
|
||||||
|
if !s2.Has(key) {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Union returns a new set which includes items in either s1 or s2.
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2}
|
||||||
|
// s2 = {a3, a4}
|
||||||
|
// s1.Union(s2) = {a1, a2, a3, a4}
|
||||||
|
// s2.Union(s1) = {a1, a2, a3, a4}
|
||||||
|
func (s1 Int64) Union(s2 Int64) Int64 {
|
||||||
|
result := NewInt64()
|
||||||
|
for key := range s1 {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
for key := range s2 {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// Intersection returns a new set which includes the item in BOTH s1 and s2
|
||||||
|
// For example:
|
||||||
|
// s1 = {a1, a2}
|
||||||
|
// s2 = {a2, a3}
|
||||||
|
// s1.Intersection(s2) = {a2}
|
||||||
|
func (s1 Int64) Intersection(s2 Int64) Int64 {
|
||||||
|
var walk, other Int64
|
||||||
|
result := NewInt64()
|
||||||
|
if s1.Len() < s2.Len() {
|
||||||
|
walk = s1
|
||||||
|
other = s2
|
||||||
|
} else {
|
||||||
|
walk = s2
|
||||||
|
other = s1
|
||||||
|
}
|
||||||
|
for key := range walk {
|
||||||
|
if other.Has(key) {
|
||||||
|
result.Insert(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsSuperset returns true if and only if s1 is a superset of s2.
|
||||||
|
func (s1 Int64) IsSuperset(s2 Int64) bool {
|
||||||
|
for item := range s2 {
|
||||||
|
if !s1.Has(item) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// Equal returns true if and only if s1 is equal (as a set) to s2.
|
||||||
|
// Two sets are equal if their membership is identical.
|
||||||
|
// (In practice, this means same elements, order doesn't matter)
|
||||||
|
func (s1 Int64) Equal(s2 Int64) bool {
|
||||||
|
return len(s1) == len(s2) && s1.IsSuperset(s2)
|
||||||
|
}
|
||||||
|
|
||||||
|
type sortableSliceOfInt64 []int64
|
||||||
|
|
||||||
|
func (s sortableSliceOfInt64) Len() int { return len(s) }
|
||||||
|
func (s sortableSliceOfInt64) Less(i, j int) bool { return lessInt64(s[i], s[j]) }
|
||||||
|
func (s sortableSliceOfInt64) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||||
|
|
||||||
|
// List returns the contents as a sorted int64 slice.
|
||||||
|
func (s Int64) List() []int64 {
|
||||||
|
res := make(sortableSliceOfInt64, 0, len(s))
|
||||||
|
for key := range s {
|
||||||
|
res = append(res, key)
|
||||||
|
}
|
||||||
|
sort.Sort(res)
|
||||||
|
return []int64(res)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns a single element from the set.
|
||||||
|
func (s Int64) PopAny() (int64, bool) {
|
||||||
|
for key := range s {
|
||||||
|
s.Delete(key)
|
||||||
|
return key, true
|
||||||
|
}
|
||||||
|
var zeroValue int64
|
||||||
|
return zeroValue, false
|
||||||
|
}
|
||||||
|
|
||||||
|
// Len returns the size of the set.
|
||||||
|
func (s Int64) Len() int {
|
||||||
|
return len(s)
|
||||||
|
}
|
||||||
|
|
||||||
|
func lessInt64(lhs, rhs int64) bool {
|
||||||
|
return lhs < rhs
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
Copyright 2014 The Kubernetes Authors All rights reserved.
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
you may not use this file except in compliance with the License.
|
you may not use this file except in compliance with the License.
|
||||||
@ -14,6 +14,10 @@ See the License for the specific language governing permissions and
|
|||||||
limitations under the License.
|
limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
// This file was autogenerated by the command:
|
||||||
|
// $ cmd/libs/go2idl/set-gen/set-gen
|
||||||
|
// Do not edit it manually!
|
||||||
|
|
||||||
package sets
|
package sets
|
||||||
|
|
||||||
import (
|
import (
|
||||||
@ -21,29 +25,25 @@ import (
|
|||||||
"sort"
|
"sort"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Empty is public since it is used by some internal API objects for conversions between external
|
// sets.String is a set of strings, implemented via map[string]struct{} for minimal memory consumption.
|
||||||
// string arrays and internal sets, and conversion logic requires public types today.
|
|
||||||
type Empty struct{}
|
|
||||||
|
|
||||||
// StringSet is a set of strings, implemented via map[string]struct{} for minimal memory consumption.
|
|
||||||
type String map[string]Empty
|
type String map[string]Empty
|
||||||
|
|
||||||
// New creates a StringSet from a list of values.
|
// New creates a String from a list of values.
|
||||||
func NewString(items ...string) String {
|
func NewString(items ...string) String {
|
||||||
ss := String{}
|
ss := String{}
|
||||||
ss.Insert(items...)
|
ss.Insert(items...)
|
||||||
return ss
|
return ss
|
||||||
}
|
}
|
||||||
|
|
||||||
// KeySet creates a StringSet from a keys of a map[string](? extends interface{}). Since you can't describe that map type in the Go type system
|
// StringKeySet creates a String from a keys of a map[string](? extends interface{}).
|
||||||
// the reflected value is required.
|
// If the value passed in is not actually a map, this will panic.
|
||||||
func KeySet(theMap reflect.Value) String {
|
func StringKeySet(theMap interface{}) String {
|
||||||
|
v := reflect.ValueOf(theMap)
|
||||||
ret := String{}
|
ret := String{}
|
||||||
|
|
||||||
for _, keyValue := range theMap.MapKeys() {
|
for _, keyValue := range v.MapKeys() {
|
||||||
ret.Insert(keyValue.String())
|
ret.Insert(keyValue.Interface().(string))
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -89,10 +89,10 @@ func (s String) HasAny(items ...string) bool {
|
|||||||
|
|
||||||
// Difference returns a set of objects that are not in s2
|
// Difference returns a set of objects that are not in s2
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {1, 2, 3}
|
// s1 = {a1, a2, a3}
|
||||||
// s2 = {1, 2, 4, 5}
|
// s2 = {a1, a2, a4, a5}
|
||||||
// s1.Difference(s2) = {3}
|
// s1.Difference(s2) = {a3}
|
||||||
// s2.Difference(s1) = {4, 5}
|
// s2.Difference(s1) = {a4, a5}
|
||||||
func (s String) Difference(s2 String) String {
|
func (s String) Difference(s2 String) String {
|
||||||
result := NewString()
|
result := NewString()
|
||||||
for key := range s {
|
for key := range s {
|
||||||
@ -104,12 +104,11 @@ func (s String) Difference(s2 String) String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Union returns a new set which includes items in either s1 or s2.
|
// Union returns a new set which includes items in either s1 or s2.
|
||||||
// vof objects that are not in s2
|
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {1, 2}
|
// s1 = {a1, a2}
|
||||||
// s2 = {3, 4}
|
// s2 = {a3, a4}
|
||||||
// s1.Union(s2) = {1, 2, 3, 4}
|
// s1.Union(s2) = {a1, a2, a3, a4}
|
||||||
// s2.Union(s1) = {1, 2, 3, 4}
|
// s2.Union(s1) = {a1, a2, a3, a4}
|
||||||
func (s1 String) Union(s2 String) String {
|
func (s1 String) Union(s2 String) String {
|
||||||
result := NewString()
|
result := NewString()
|
||||||
for key := range s1 {
|
for key := range s1 {
|
||||||
@ -123,9 +122,9 @@ func (s1 String) Union(s2 String) String {
|
|||||||
|
|
||||||
// Intersection returns a new set which includes the item in BOTH s1 and s2
|
// Intersection returns a new set which includes the item in BOTH s1 and s2
|
||||||
// For example:
|
// For example:
|
||||||
// s1 = {1, 2}
|
// s1 = {a1, a2}
|
||||||
// s2 = {2, 3}
|
// s2 = {a2, a3}
|
||||||
// s1.Intersection(s2) = {2}
|
// s1.Intersection(s2) = {a2}
|
||||||
func (s1 String) Intersection(s2 String) String {
|
func (s1 String) Intersection(s2 String) String {
|
||||||
var walk, other String
|
var walk, other String
|
||||||
result := NewString()
|
result := NewString()
|
||||||
@ -158,25 +157,23 @@ func (s1 String) IsSuperset(s2 String) bool {
|
|||||||
// Two sets are equal if their membership is identical.
|
// Two sets are equal if their membership is identical.
|
||||||
// (In practice, this means same elements, order doesn't matter)
|
// (In practice, this means same elements, order doesn't matter)
|
||||||
func (s1 String) Equal(s2 String) bool {
|
func (s1 String) Equal(s2 String) bool {
|
||||||
if len(s1) != len(s2) {
|
return len(s1) == len(s2) && s1.IsSuperset(s2)
|
||||||
return false
|
|
||||||
}
|
|
||||||
for item := range s2 {
|
|
||||||
if !s1.Has(item) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type sortableSliceOfString []string
|
||||||
|
|
||||||
|
func (s sortableSliceOfString) Len() int { return len(s) }
|
||||||
|
func (s sortableSliceOfString) Less(i, j int) bool { return lessString(s[i], s[j]) }
|
||||||
|
func (s sortableSliceOfString) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
|
||||||
|
|
||||||
// List returns the contents as a sorted string slice.
|
// List returns the contents as a sorted string slice.
|
||||||
func (s String) List() []string {
|
func (s String) List() []string {
|
||||||
res := make([]string, 0, len(s))
|
res := make(sortableSliceOfString, 0, len(s))
|
||||||
for key := range s {
|
for key := range s {
|
||||||
res = append(res, key)
|
res = append(res, key)
|
||||||
}
|
}
|
||||||
sort.StringSlice(res).Sort()
|
sort.Sort(res)
|
||||||
return res
|
return []string(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns a single element from the set.
|
// Returns a single element from the set.
|
||||||
@ -185,10 +182,15 @@ func (s String) PopAny() (string, bool) {
|
|||||||
s.Delete(key)
|
s.Delete(key)
|
||||||
return key, true
|
return key, true
|
||||||
}
|
}
|
||||||
return "", false
|
var zeroValue string
|
||||||
|
return zeroValue, false
|
||||||
}
|
}
|
||||||
|
|
||||||
// Len returns the size of the set.
|
// Len returns the size of the set.
|
||||||
func (s String) Len() int {
|
func (s String) Len() int {
|
||||||
return len(s)
|
return len(s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func lessString(lhs, rhs string) bool {
|
||||||
|
return lhs < rhs
|
||||||
|
}
|
30
pkg/util/sets/types/types.go
Normal file
30
pkg/util/sets/types/types.go
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
/*
|
||||||
|
Copyright 2015 The Kubernetes Authors All rights reserved.
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Package types just provides input types to the set generator. It also
|
||||||
|
// contains a "go generate" block. (You must first `go install`
|
||||||
|
// cmd/libs/go2idl/set-gen.)
|
||||||
|
package types
|
||||||
|
|
||||||
|
//go:generate set-gen -i k8s.io/kubernetes/pkg/util/sets/types
|
||||||
|
|
||||||
|
type ReferenceSetTypes struct {
|
||||||
|
// These types all cause files to be generated
|
||||||
|
a int64
|
||||||
|
b int
|
||||||
|
c byte
|
||||||
|
d string
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user