github.com/aclisp/heapster@v0.19.2-0.20160613100040-51756f899a96/Godeps/_workspace/src/k8s.io/kubernetes/pkg/util/sets/string.go (about)

     1  /*
     2  Copyright 2016 The Kubernetes Authors All rights reserved.
     3  
     4  Licensed under the Apache License, Version 2.0 (the "License");
     5  you may not use this file except in compliance with the License.
     6  You may obtain a copy of the License at
     7  
     8      http://www.apache.org/licenses/LICENSE-2.0
     9  
    10  Unless required by applicable law or agreed to in writing, software
    11  distributed under the License is distributed on an "AS IS" BASIS,
    12  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    13  See the License for the specific language governing permissions and
    14  limitations under the License.
    15  */
    16  
    17  // This file was autogenerated by set-gen. Do not edit it manually!
    18  
    19  package sets
    20  
    21  import (
    22  	"reflect"
    23  	"sort"
    24  )
    25  
    26  // sets.String is a set of strings, implemented via map[string]struct{} for minimal memory consumption.
    27  type String map[string]Empty
    28  
    29  // New creates a String from a list of values.
    30  func NewString(items ...string) String {
    31  	ss := String{}
    32  	ss.Insert(items...)
    33  	return ss
    34  }
    35  
    36  // StringKeySet creates a String from a keys of a map[string](? extends interface{}).
    37  // If the value passed in is not actually a map, this will panic.
    38  func StringKeySet(theMap interface{}) String {
    39  	v := reflect.ValueOf(theMap)
    40  	ret := String{}
    41  
    42  	for _, keyValue := range v.MapKeys() {
    43  		ret.Insert(keyValue.Interface().(string))
    44  	}
    45  	return ret
    46  }
    47  
    48  // Insert adds items to the set.
    49  func (s String) Insert(items ...string) {
    50  	for _, item := range items {
    51  		s[item] = Empty{}
    52  	}
    53  }
    54  
    55  // Delete removes all items from the set.
    56  func (s String) Delete(items ...string) {
    57  	for _, item := range items {
    58  		delete(s, item)
    59  	}
    60  }
    61  
    62  // Has returns true if and only if item is contained in the set.
    63  func (s String) Has(item string) bool {
    64  	_, contained := s[item]
    65  	return contained
    66  }
    67  
    68  // HasAll returns true if and only if all items are contained in the set.
    69  func (s String) HasAll(items ...string) bool {
    70  	for _, item := range items {
    71  		if !s.Has(item) {
    72  			return false
    73  		}
    74  	}
    75  	return true
    76  }
    77  
    78  // HasAny returns true if any items are contained in the set.
    79  func (s String) HasAny(items ...string) bool {
    80  	for _, item := range items {
    81  		if s.Has(item) {
    82  			return true
    83  		}
    84  	}
    85  	return false
    86  }
    87  
    88  // Difference returns a set of objects that are not in s2
    89  // For example:
    90  // s1 = {a1, a2, a3}
    91  // s2 = {a1, a2, a4, a5}
    92  // s1.Difference(s2) = {a3}
    93  // s2.Difference(s1) = {a4, a5}
    94  func (s String) Difference(s2 String) String {
    95  	result := NewString()
    96  	for key := range s {
    97  		if !s2.Has(key) {
    98  			result.Insert(key)
    99  		}
   100  	}
   101  	return result
   102  }
   103  
   104  // Union returns a new set which includes items in either s1 or s2.
   105  // For example:
   106  // s1 = {a1, a2}
   107  // s2 = {a3, a4}
   108  // s1.Union(s2) = {a1, a2, a3, a4}
   109  // s2.Union(s1) = {a1, a2, a3, a4}
   110  func (s1 String) Union(s2 String) String {
   111  	result := NewString()
   112  	for key := range s1 {
   113  		result.Insert(key)
   114  	}
   115  	for key := range s2 {
   116  		result.Insert(key)
   117  	}
   118  	return result
   119  }
   120  
   121  // Intersection returns a new set which includes the item in BOTH s1 and s2
   122  // For example:
   123  // s1 = {a1, a2}
   124  // s2 = {a2, a3}
   125  // s1.Intersection(s2) = {a2}
   126  func (s1 String) Intersection(s2 String) String {
   127  	var walk, other String
   128  	result := NewString()
   129  	if s1.Len() < s2.Len() {
   130  		walk = s1
   131  		other = s2
   132  	} else {
   133  		walk = s2
   134  		other = s1
   135  	}
   136  	for key := range walk {
   137  		if other.Has(key) {
   138  			result.Insert(key)
   139  		}
   140  	}
   141  	return result
   142  }
   143  
   144  // IsSuperset returns true if and only if s1 is a superset of s2.
   145  func (s1 String) IsSuperset(s2 String) bool {
   146  	for item := range s2 {
   147  		if !s1.Has(item) {
   148  			return false
   149  		}
   150  	}
   151  	return true
   152  }
   153  
   154  // Equal returns true if and only if s1 is equal (as a set) to s2.
   155  // Two sets are equal if their membership is identical.
   156  // (In practice, this means same elements, order doesn't matter)
   157  func (s1 String) Equal(s2 String) bool {
   158  	return len(s1) == len(s2) && s1.IsSuperset(s2)
   159  }
   160  
   161  type sortableSliceOfString []string
   162  
   163  func (s sortableSliceOfString) Len() int           { return len(s) }
   164  func (s sortableSliceOfString) Less(i, j int) bool { return lessString(s[i], s[j]) }
   165  func (s sortableSliceOfString) Swap(i, j int)      { s[i], s[j] = s[j], s[i] }
   166  
   167  // List returns the contents as a sorted string slice.
   168  func (s String) List() []string {
   169  	res := make(sortableSliceOfString, 0, len(s))
   170  	for key := range s {
   171  		res = append(res, key)
   172  	}
   173  	sort.Sort(res)
   174  	return []string(res)
   175  }
   176  
   177  // Returns a single element from the set.
   178  func (s String) PopAny() (string, bool) {
   179  	for key := range s {
   180  		s.Delete(key)
   181  		return key, true
   182  	}
   183  	var zeroValue string
   184  	return zeroValue, false
   185  }
   186  
   187  // Len returns the size of the set.
   188  func (s String) Len() int {
   189  	return len(s)
   190  }
   191  
   192  func lessString(lhs, rhs string) bool {
   193  	return lhs < rhs
   194  }