set

package module
v1.0.2 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Nov 14, 2018 License: Apache-2.0 Imports: 17 Imported by: 18

README

Set GoDoc Go Report Card Build Status

Package set is a type-safe, zero-allocation port of the excellent package fatih/set. It contains sets for most of the basic types and you can generate sets for your own types with ease.

Example

Example code using the generated string set:

import "github.com/scylladb/go-set/strset"

s1 := strset.New("entry 1", "entry 2")
s2 := strset.New("entry 2", "entry 3")
s3 := strset.Intersection(s1, s2)
// s3 now contains only "entry 2"

The library exposes a number of top level factory functions that can be used to create a specific instances of the set type you want to use. For example to create a set to store int you could do like this:

import "github.com/scylladb/go-set"

s := set.NewIntSet()
// use the set...

Usage

In every subpackage Set is the main set structure that holds all the data and methods used to working with the set.

func Difference
func Difference(set1 *Set, sets ...*Set) *Set

Difference returns a new set which contains items which are in in the first set but not in the others.

func Intersection
func Intersection(sets ...*Set) *Set

Intersection returns a new set which contains items that only exist in all given sets.

func New
func New(ts ...T) *Set

New creates and initializes a new Set.

func NewWithSize
func NewWithSize(size int) *Set

NewWithSize creates a new Set and gives make map a size hint.

func SymmetricDifference
func SymmetricDifference(s *Set, t *Set) *Set

SymmetricDifference returns a new set which s is the difference of items which are in one of either, but not in both.

func Union
func Union(sets ...*Set) *Set

Union is the merger of multiple sets. It returns a new set with all the elements present in all the sets that are passed.

func (*Set) Add
func (s *Set) Add(items ...T)

Add includes the specified items (one or more) to the Set. The underlying Set s is modified. If passed nothing it silently returns.

func (*Set) Clear
func (s *Set) Clear()

Clear removes all items from the Set.

func (*Set) Copy
func (s *Set) Copy() *Set

Copy returns a new Set with a copy of s.

func (*Set) Each
func (s *Set) Each(f func(item T) bool)

Each traverses the items in the Set, calling the provided function for each Set member. Traversal will continue until all items in the Set have been visited, or if the closure returns false.

func (*Set) Has
func (s *Set) Has(items ...T) bool

Has looks for the existence of items passed. It returns false if nothing is passed. For multiple items it returns true only if all of the items exist.

func (*Set) IsEmpty
func (s *Set) IsEmpty() bool

IsEmpty reports whether the Set is empty.

func (*Set) IsEqual
func (s *Set) IsEqual(t *Set) bool

IsEqual test whether s and t are the same in size and have the same items.

func (*Set) IsSubset
func (s *Set) IsSubset(t *Set) bool

IsSubset tests whether t is a subset of s.

func (*Set) IsSuperset
func (s *Set) IsSuperset(t *Set) bool

IsSuperset tests whether t is a superset of s.

func (*Set) List
func (s *Set) List() []T

List returns a slice of all items. There is also StringSlice() and IntSlice() methods for returning slices of type string or int.

func (*Set) Merge
func (s *Set) Merge(t *Set)

Merge is like Union, however it modifies the current Set it's applied on with the given t Set.

func (*Set) Pop
func (s *Set) Pop() T

Pop deletes and returns an item from the Set. The underlying Set s is modified. If Set is empty, the zero value is returned.

func (*Set) Pop2
func (s *Set) Pop2() (T, bool)

Pop2 tries to delete and return an item from the Set. The underlying Set s is modified. The second value is a bool that is true if the item existed in the set, and false if not. If Set is empty, the zero value and false are returned.

func (*Set) Remove
func (s *Set) Remove(items ...T)

Remove deletes the specified items from the Set. The underlying Set s is modified. If passed nothing it silently returns.

func (*Set) Separate
func (s *Set) Separate(t *Set)

Separate removes the Set items containing in t from Set s. Please aware that it's not the opposite of Merge.

func (*Set) Size
func (s *Set) Size() int

Size returns the number of items in a Set.

func (*Set) String
func (s *Set) String() string

String returns a string representation of s

Performance

The improvement in performance by using concrete types over interface{} is notable. Below you will find benchmark results comparing type-safe sets to fatih/set counterparts for string, int64, int32, float64 and float32 on a local machine, Intel(R) Core(TM) i7-7500U CPU @ 2.70GHz.

pkg: github.com/scylladb/go-set/strset
BenchmarkTypeSafeSetHasNonExisting-4            200000000                7.02 ns/op            0 B/op          0 allocs/op
BenchmarkInterfaceSetHasNonExisting-4           20000000                60.0 ns/op            32 B/op          2 allocs/op
BenchmarkTypeSafeSetHasExisting-4               200000000                9.02 ns/op            0 B/op          0 allocs/op
BenchmarkInterfaceSetHasExisting-4              20000000                97.0 ns/op            32 B/op          2 allocs/op
BenchmarkTypeSafeSetHasExistingMany-4           100000000               16.8 ns/op             0 B/op          0 allocs/op
BenchmarkInterfaceSetHasExistingMany-4          30000000               106 ns/op              32 B/op          2 allocs/op
BenchmarkTypeSafeSetAdd-4                        3000000               469 ns/op              58 B/op          0 allocs/op
BenchmarkInterfaceSetAdd-4                       2000000               909 ns/op             117 B/op          2 allocs/op

pkg: github.com/scylladb/go-set/i64set
BenchmarkTypeSafeSetHasNonExisting-4            300000000                5.51 ns/op            0 B/op          0 allocs/op
BenchmarkInterfaceSetHasNonExisting-4           30000000                49.4 ns/op            24 B/op          2 allocs/op
BenchmarkTypeSafeSetHasExisting-4               200000000                7.53 ns/op            0 B/op          0 allocs/op
BenchmarkInterfaceSetHasExisting-4              20000000                68.5 ns/op            24 B/op          2 allocs/op
BenchmarkTypeSafeSetHasExistingMany-4           100000000               11.0 ns/op             0 B/op          0 allocs/op
BenchmarkInterfaceSetHasExistingMany-4          20000000                74.5 ns/op            24 B/op          2 allocs/op
BenchmarkTypeSafeSetAdd-4                       10000000               225 ns/op              40 B/op          0 allocs/op
BenchmarkInterfaceSetAdd-4                       3000000               403 ns/op              82 B/op          2 allocs/op

pkg: github.com/scylladb/go-set/i32set
BenchmarkTypeSafeSetHasNonExisting-4            300000000                5.61 ns/op            0 B/op          0 allocs/op
BenchmarkInterfaceSetHasNonExisting-4           30000000                48.8 ns/op            20 B/op          2 allocs/op
BenchmarkTypeSafeSetHasExisting-4               200000000                7.07 ns/op            0 B/op          0 allocs/op
BenchmarkInterfaceSetHasExisting-4              20000000                69.3 ns/op            20 B/op          2 allocs/op
BenchmarkTypeSafeSetHasExistingMany-4           100000000               11.7 ns/op             0 B/op          0 allocs/op
BenchmarkInterfaceSetHasExistingMany-4          20000000                71.1 ns/op            20 B/op          2 allocs/op
BenchmarkTypeSafeSetAdd-4                       10000000               206 ns/op              25 B/op          0 allocs/op
BenchmarkInterfaceSetAdd-4                       3000000               394 ns/op              78 B/op          2 allocs/op

pkg: github.com/scylladb/go-set/f64set
BenchmarkTypeSafeSetHasNonExisting-4            300000000                5.82 ns/op            0 B/op          0 allocs/op
BenchmarkInterfaceSetHasNonExisting-4           30000000                49.8 ns/op            24 B/op          2 allocs/op
BenchmarkTypeSafeSetHasExisting-4               50000000                26.8 ns/op             0 B/op          0 allocs/op
BenchmarkInterfaceSetHasExisting-4              20000000                77.6 ns/op            24 B/op          2 allocs/op
BenchmarkTypeSafeSetHasExistingMany-4           50000000                27.6 ns/op             0 B/op          0 allocs/op
BenchmarkInterfaceSetHasExistingMany-4          20000000                82.3 ns/op            24 B/op          2 allocs/op
BenchmarkTypeSafeSetAdd-4                       10000000               270 ns/op              40 B/op          0 allocs/op
BenchmarkInterfaceSetAdd-4                       3000000               428 ns/op              82 B/op          2 allocs/op

pkg: github.com/scylladb/go-set/f32set
BenchmarkTypeSafeSetHasNonExisting-4            300000000                5.78 ns/op            0 B/op          0 allocs/op
BenchmarkInterfaceSetHasNonExisting-4           30000000                49.3 ns/op            20 B/op          2 allocs/op
BenchmarkTypeSafeSetHasExisting-4               50000000                24.9 ns/op             0 B/op          0 allocs/op
BenchmarkInterfaceSetHasExisting-4              20000000                78.6 ns/op            20 B/op          2 allocs/op
BenchmarkTypeSafeSetHasExistingMany-4           50000000                25.1 ns/op             0 B/op          0 allocs/op
BenchmarkInterfaceSetHasExistingMany-4          20000000                81.1 ns/op            20 B/op          2 allocs/op
BenchmarkTypeSafeSetAdd-4                       10000000               246 ns/op              24 B/op          0 allocs/op
BenchmarkInterfaceSetAdd-4                       3000000               408 ns/op              78 B/op          2 allocs/op

Code generation

For code generation we use Google go_generics tool that we forked to provide bazel-free installation, to install run:

go get -u github.com/mmatczuk/go_generics/cmd/go_generics

Once you have go_generics installed properly you can regenerate the code using go generate in the top level directory.

Your custom types

If you have types that you would like to use but the are not amenable for inclusion in this library you can simply generate code on your own and put it in your package.

For example, to generate a set for SomeType in package sometypeset call:

./gen_set.sh SomeType sometypeset

this would generate a new directory sometypeset in current working directory.

If you think your addition belongs here we are open to accept pull requests.

License

Copyright (C) 2018 ScyllaDB

This project is distributed under the Apache 2.0 license. See the LICENSE file for details. It contains software from:

GitHub star is always appreciated!

Documentation

Overview

Package set is a type-safe, zero-allocation port of the excellent package fatih/set. It contains sets for most of the basic types and you can generate set for your own types with ease.

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func NewByte16Set

func NewByte16Set(ts ...[16]byte) *b16set.Set

NewByte16Set is a convenience function to create a new b16set.Set

func NewByte16SetWithSize

func NewByte16SetWithSize(size int) *b16set.Set

NewByte16SetWithSize is a convenience function to create a new b16set.Set.

func NewByte32Set

func NewByte32Set(ts ...[32]byte) *b32set.Set

NewByte32Set is a convenience function to create a new b32set.Set

func NewByte32SetWithSize

func NewByte32SetWithSize(size int) *b32set.Set

NewByte32SetWithSize is a convenience function to create a new b32set.Set.

func NewByte64Set

func NewByte64Set(ts ...[64]byte) *b64set.Set

NewByte64Set is a convenience function to create a new b64set.Set

func NewByte64SetWithSize

func NewByte64SetWithSize(size int) *b64set.Set

NewByte64SetWithSize is a convenience function to create a new b64set.Set.

func NewByte8Set

func NewByte8Set(ts ...[8]byte) *b8set.Set

NewByte8Set is a convenience function to create a new b8set.Set

func NewByte8SetWithSize

func NewByte8SetWithSize(size int) *b8set.Set

NewByte8SetWithSize is a convenience function to create a new b8set.Set.

func NewFloat32Set

func NewFloat32Set(ts ...float32) *f32set.Set

NewFloat32Set is a convenience function to create a new f32set.Set

func NewFloat32SetWithSize

func NewFloat32SetWithSize(size int) *f32set.Set

NewFloat32SetWithSize is a convenience function to create a new f32set.Set.

func NewFloat64Set

func NewFloat64Set(ts ...float64) *f64set.Set

NewFloat64Set is a convenience function to create a new f64set.Set

func NewFloat64SetWithSize

func NewFloat64SetWithSize(size int) *f64set.Set

NewFloat64SetWithSize is a convenience function to create a new f64set.Set.

func NewInt16Set

func NewInt16Set(ts ...int16) *i16set.Set

NewInt16Set is a convenience function to create a new i16set.Set

func NewInt16SetWithSize

func NewInt16SetWithSize(size int) *i16set.Set

NewInt16SetWithSize is a convenience function to create a new i16set.Set.

func NewInt32Set

func NewInt32Set(ts ...int32) *i32set.Set

NewInt32Set is a convenience function to create a new i32set.Set

func NewInt32SetWithSize

func NewInt32SetWithSize(size int) *i32set.Set

NewInt32SetWithSize is a convenience function to create a new i32set.Set.

func NewInt64Set

func NewInt64Set(ts ...int64) *i64set.Set

NewInt64Set is a convenience function to create a new i64set.Set

func NewInt64SetWithSize

func NewInt64SetWithSize(size int) *i64set.Set

NewInt64SetWithSize is a convenience function to create a new i64set.Set.

func NewInt8Set

func NewInt8Set(ts ...int8) *i8set.Set

NewInt8Set is a convenience function to create a new i8set.Set

func NewInt8SetWithSize

func NewInt8SetWithSize(size int) *i8set.Set

NewInt8SetWithSize is a convenience function to create a new i8set.Set.

func NewIntSet

func NewIntSet(ts ...int) *iset.Set

NewIntSet is a convenience function to create a new iset.Set

func NewIntSetWithSize

func NewIntSetWithSize(size int) *iset.Set

NewIntSetWithSize is a convenience function to create a new iset.Set.

func NewStringSet

func NewStringSet(ts ...string) *strset.Set

NewStringSet is a convenience function to create a new strset.Set

func NewStringSetWithSize

func NewStringSetWithSize(size int) *strset.Set

NewStringSetWithSize is a convenience function to create a new strset.Set.

func NewUint16Set

func NewUint16Set(ts ...uint16) *u16set.Set

NewUint16Set is a convenience function to create a new u16set.Set

func NewUint16SetWithSize

func NewUint16SetWithSize(size int) *u16set.Set

NewUint16SetWithSize is a convenience function to create a new u16set.Set.

func NewUint32Set

func NewUint32Set(ts ...uint32) *u32set.Set

NewUint32Set is a convenience function to create a new u32set.Set

func NewUint32SetWithSize

func NewUint32SetWithSize(size int) *u32set.Set

NewUint32SetWithSize is a convenience function to create a new u32set.Set.

func NewUint64Set

func NewUint64Set(ts ...uint64) *u64set.Set

NewUint64Set is a convenience function to create a new u64set.Set

func NewUint64SetWithSize

func NewUint64SetWithSize(size int) *u64set.Set

NewUint64SetWithSize is a convenience function to create a new u64set.Set.

func NewUint8Set

func NewUint8Set(ts ...uint8) *u8set.Set

NewUint8Set is a convenience function to create a new u8set.Set

func NewUint8SetWithSize

func NewUint8SetWithSize(size int) *u8set.Set

NewUint8SetWithSize is a convenience function to create a new u8set.Set.

func NewUintSet

func NewUintSet(ts ...uint) *uset.Set

NewUintSet is a convenience function to create a new uset.Set

func NewUintSetWithSize

func NewUintSetWithSize(size int) *uset.Set

NewUintSetWithSize is a convenience function to create a new uset.Set.

Types

This section is empty.

Directories

Path Synopsis
internal
set

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL