diff options
author | Alexander Neumann <alexander.neumann@picos-software.com> | 2019-04-16 18:22:18 +0200 |
---|---|---|
committer | Alexander Neumann <alexander.neumann@picos-software.com> | 2019-04-23 11:05:00 +0200 |
commit | 82eaa79554c428e83b472e2718f7cba553f1b1f3 (patch) | |
tree | a9d9698bb0d2d4b42fa3c7dea1dff4b422a3a614 /ui/util.go | |
parent | ui: implement log dialog; some refactoring in manage tunnels window to share some bits (diff) | |
download | wireguard-windows-82eaa79554c428e83b472e2718f7cba553f1b1f3.tar.xz wireguard-windows-82eaa79554c428e83b472e2718f7cba553f1b1f3.zip |
ui: move orderedStringSet to util.go
Signed-off-by: Alexander Neumann <alexander.neumann@picos-software.com>
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
Diffstat (limited to 'ui/util.go')
-rw-r--r-- | ui/util.go | 80 |
1 files changed, 80 insertions, 0 deletions
@@ -12,6 +12,86 @@ import ( "github.com/lxn/walk" ) +type orderedStringSet struct { + items []string + item2index map[string]int +} + +func orderedStringSetFromSlice(items []string) *orderedStringSet { + oss := newOrderedStringSet() + oss.AddMany(items) + return oss +} + +func newOrderedStringSet() *orderedStringSet { + return &orderedStringSet{item2index: make(map[string]int)} +} + +func (oss *orderedStringSet) Add(item string) bool { + if _, ok := oss.item2index[item]; ok { + return false + } + + oss.item2index[item] = len(oss.items) + oss.items = append(oss.items, item) + return true +} + +func (oss *orderedStringSet) AddMany(items []string) { + for _, item := range items { + oss.Add(item) + } +} + +func (oss *orderedStringSet) UniteWith(other *orderedStringSet) { + if other == oss { + return + } + + oss.AddMany(other.items) +} + +func (oss *orderedStringSet) Remove(item string) bool { + if i, ok := oss.item2index[item]; ok { + oss.items = append(oss.items[:i], oss.items[i+1:]...) + delete(oss.item2index, item) + return true + } + + return false +} + +func (oss *orderedStringSet) Len() int { + return len(oss.items) +} + +func (oss *orderedStringSet) ToSlice() []string { + return append(([]string)(nil), oss.items...) +} + +func (oss *orderedStringSet) Contains(item string) bool { + _, ok := oss.item2index[item] + return ok +} + +func (oss *orderedStringSet) IsSupersetOf(other *orderedStringSet) bool { + if oss.Len() < other.Len() { + return false + } + + for _, item := range other.items { + if !oss.Contains(item) { + return false + } + } + + return true +} + +func (oss *orderedStringSet) String() string { + return fmt.Sprintf("%v", oss.items) +} + func writeFileWithOverwriteHandling(owner walk.Form, filePath string, write func(file *os.File) error) bool { showError := func(err error) bool { if err == nil { |