github.com/mymmsc/gox@v1.3.33/util/hashset/hashset.go (about) 1 // Copyright (c) 2015, Emir Pasic. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 // Package hashset implements a set backed by a hash table. 6 // 7 // Structure is not thread safe. 8 // 9 // References: http://en.wikipedia.org/wiki/Set_%28abstract_data_type%29 10 package hashset 11 12 import ( 13 "fmt" 14 "github.com/mymmsc/gox/util" 15 "strings" 16 ) 17 18 func assertSetImplementation() { 19 var _ util.Set = (*Set)(nil) 20 } 21 22 // Set holds elements in go's native map 23 type Set struct { 24 items map[interface{}]struct{} 25 } 26 27 var itemExists = struct{}{} 28 29 // New instantiates a new empty set and adds the passed values, if any, to the set 30 func New(values ...interface{}) *Set { 31 set := &Set{items: make(map[interface{}]struct{})} 32 if len(values) > 0 { 33 set.Add(values...) 34 } 35 return set 36 } 37 38 // Add adds the items (one or more) to the set. 39 func (set *Set) Add(items ...interface{}) { 40 for _, item := range items { 41 set.items[item] = itemExists 42 } 43 } 44 45 // Remove removes the items (one or more) from the set. 46 func (set *Set) Remove(items ...interface{}) { 47 for _, item := range items { 48 delete(set.items, item) 49 } 50 } 51 52 // Contains check if items (one or more) are present in the set. 53 // All items have to be present in the set for the method to return true. 54 // Returns true if no arguments are passed at all, i.e. set is always superset of empty set. 55 func (set *Set) Contains(items ...interface{}) bool { 56 for _, item := range items { 57 if _, contains := set.items[item]; !contains { 58 return false 59 } 60 } 61 return true 62 } 63 64 // Empty returns true if set does not contain any elements. 65 func (set *Set) Empty() bool { 66 return set.Size() == 0 67 } 68 69 // Size returns number of elements within the set. 70 func (set *Set) Size() int { 71 return len(set.items) 72 } 73 74 // Clear clears all values in the set. 75 func (set *Set) Clear() { 76 set.items = make(map[interface{}]struct{}) 77 } 78 79 // Values returns all items in the set. 80 func (set *Set) Values() []interface{} { 81 values := make([]interface{}, set.Size()) 82 count := 0 83 for item := range set.items { 84 values[count] = item 85 count++ 86 } 87 return values 88 } 89 90 // String returns a string representation of container 91 func (set *Set) String() string { 92 str := "HashSet\n" 93 items := []string{} 94 for k := range set.items { 95 items = append(items, fmt.Sprintf("%v", k)) 96 } 97 str += strings.Join(items, ", ") 98 return str 99 }