mirror of
				https://github.com/optim-enterprises-bv/kubernetes.git
				synced 2025-11-03 19:58:17 +00:00 
			
		
		
		
	set-gen example
This commit is contained in:
		
							
								
								
									
										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"
 | 
			
		||||
	"math"
 | 
			
		||||
	"net/http"
 | 
			
		||||
	"reflect"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"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
 | 
			
		||||
	statusList := []*mesos.TaskStatus{}
 | 
			
		||||
	remaining := sets.KeySet(reflect.ValueOf(taskToSlave))
 | 
			
		||||
	remaining := sets.StringKeySet(taskToSlave)
 | 
			
		||||
	for taskId, slaveId := range taskToSlave {
 | 
			
		||||
		if slaveId == "" {
 | 
			
		||||
			delete(taskToSlave, taskId)
 | 
			
		||||
 
 | 
			
		||||
@@ -55,7 +55,7 @@ func newNavigationSteps(path string) (*navigationSteps, error) {
 | 
			
		||||
			if err != nil {
 | 
			
		||||
				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})
 | 
			
		||||
			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");
 | 
			
		||||
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.
 | 
			
		||||
*/
 | 
			
		||||
 | 
			
		||||
// This file was autogenerated by the command:
 | 
			
		||||
// $ cmd/libs/go2idl/set-gen/set-gen
 | 
			
		||||
// Do not edit it manually!
 | 
			
		||||
 | 
			
		||||
package sets
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
@@ -21,29 +25,25 @@ import (
 | 
			
		||||
	"sort"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 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{}
 | 
			
		||||
 | 
			
		||||
// StringSet is a set of strings, implemented via map[string]struct{} for minimal memory consumption.
 | 
			
		||||
// sets.String is a set of strings, implemented via map[string]struct{} for minimal memory consumption.
 | 
			
		||||
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 {
 | 
			
		||||
	ss := String{}
 | 
			
		||||
	ss.Insert(items...)
 | 
			
		||||
	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
 | 
			
		||||
// the reflected value is required.
 | 
			
		||||
func KeySet(theMap reflect.Value) String {
 | 
			
		||||
// StringKeySet creates a String from a keys of a map[string](? extends interface{}).
 | 
			
		||||
// If the value passed in is not actually a map, this will panic.
 | 
			
		||||
func StringKeySet(theMap interface{}) String {
 | 
			
		||||
	v := reflect.ValueOf(theMap)
 | 
			
		||||
	ret := String{}
 | 
			
		||||
 | 
			
		||||
	for _, keyValue := range theMap.MapKeys() {
 | 
			
		||||
		ret.Insert(keyValue.String())
 | 
			
		||||
	for _, keyValue := range v.MapKeys() {
 | 
			
		||||
		ret.Insert(keyValue.Interface().(string))
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return ret
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -89,10 +89,10 @@ func (s String) HasAny(items ...string) bool {
 | 
			
		||||
 | 
			
		||||
// Difference returns a set of objects that are not in s2
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {1, 2, 3}
 | 
			
		||||
// s2 = {1, 2, 4, 5}
 | 
			
		||||
// s1.Difference(s2) = {3}
 | 
			
		||||
// s2.Difference(s1) = {4, 5}
 | 
			
		||||
// s1 = {a1, a2, a3}
 | 
			
		||||
// s2 = {a1, a2, a4, a5}
 | 
			
		||||
// s1.Difference(s2) = {a3}
 | 
			
		||||
// s2.Difference(s1) = {a4, a5}
 | 
			
		||||
func (s String) Difference(s2 String) String {
 | 
			
		||||
	result := NewString()
 | 
			
		||||
	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.
 | 
			
		||||
// vof objects that are not in s2
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {1, 2}
 | 
			
		||||
// s2 = {3, 4}
 | 
			
		||||
// s1.Union(s2) = {1, 2, 3, 4}
 | 
			
		||||
// s2.Union(s1) = {1, 2, 3, 4}
 | 
			
		||||
// s1 = {a1, a2}
 | 
			
		||||
// s2 = {a3, a4}
 | 
			
		||||
// s1.Union(s2) = {a1, a2, a3, a4}
 | 
			
		||||
// s2.Union(s1) = {a1, a2, a3, a4}
 | 
			
		||||
func (s1 String) Union(s2 String) String {
 | 
			
		||||
	result := NewString()
 | 
			
		||||
	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
 | 
			
		||||
// For example:
 | 
			
		||||
// s1 = {1, 2}
 | 
			
		||||
// s2 = {2, 3}
 | 
			
		||||
// s1.Intersection(s2) = {2}
 | 
			
		||||
// s1 = {a1, a2}
 | 
			
		||||
// s2 = {a2, a3}
 | 
			
		||||
// s1.Intersection(s2) = {a2}
 | 
			
		||||
func (s1 String) Intersection(s2 String) String {
 | 
			
		||||
	var walk, other String
 | 
			
		||||
	result := NewString()
 | 
			
		||||
@@ -158,25 +157,23 @@ func (s1 String) IsSuperset(s2 String) bool {
 | 
			
		||||
// Two sets are equal if their membership is identical.
 | 
			
		||||
// (In practice, this means same elements, order doesn't matter)
 | 
			
		||||
func (s1 String) Equal(s2 String) bool {
 | 
			
		||||
	if len(s1) != len(s2) {
 | 
			
		||||
		return false
 | 
			
		||||
	}
 | 
			
		||||
	for item := range s2 {
 | 
			
		||||
		if !s1.Has(item) {
 | 
			
		||||
			return false
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return true
 | 
			
		||||
	return len(s1) == len(s2) && s1.IsSuperset(s2)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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.
 | 
			
		||||
func (s String) List() []string {
 | 
			
		||||
	res := make([]string, 0, len(s))
 | 
			
		||||
	res := make(sortableSliceOfString, 0, len(s))
 | 
			
		||||
	for key := range s {
 | 
			
		||||
		res = append(res, key)
 | 
			
		||||
	}
 | 
			
		||||
	sort.StringSlice(res).Sort()
 | 
			
		||||
	return res
 | 
			
		||||
	sort.Sort(res)
 | 
			
		||||
	return []string(res)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Returns a single element from the set.
 | 
			
		||||
@@ -185,10 +182,15 @@ func (s String) PopAny() (string, bool) {
 | 
			
		||||
		s.Delete(key)
 | 
			
		||||
		return key, true
 | 
			
		||||
	}
 | 
			
		||||
	return "", false
 | 
			
		||||
	var zeroValue string
 | 
			
		||||
	return zeroValue, false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Len returns the size of the set.
 | 
			
		||||
func (s String) Len() int {
 | 
			
		||||
	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
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user