blob: 301627cdbff3fa4d71f958e4c3435d3d07acc907 [file] [log] [blame]
// Copyright (C) 2016 The Android Open Source Project
// 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
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// See the License for the specific language governing permissions and
// limitations under the License.
package file
// PathSet is a list of file paths that does not allow duplicates.
type PathSet struct {
values PathList
// AsList returns the contents of the PathSet as a List.
func (s PathSet) AsList() PathList {
return s.values
// Append is analogous to the append function, except it also suppresses duplicates.
// It copies the set and then adds the supplied paths.
func (s PathSet) Append(paths ...Path) PathSet {
result := PathSet{}
result.values = make(PathList, len(s.values), len(s.values)+ len(paths))
copy(result.values, s.values)
for _, path := range paths {
if !result.Contains(path) {
result.values = append(result.values, path)
return result
// Union produces the union of this path set with another.
func (s PathSet) Union(other PathSet) PathSet {
return s.Append(other.values...)
// Contains tests to see if the set contains the path.
func (s PathSet) Contains(path Path) bool {
return s.values.Contains(path)
// RootOf returns the first Path that contains the path, or an empty path if not found.
func (s PathSet) RootOf(p Path) Path {
return s.values.RootOf(p)
// Matching returns the set of paths that match any pattern.
func (s PathSet) Matching(patterns ...string) PathSet {
return PathSet{s.values.Matching(patterns...)}
// NotMatching returns the set of paths that do not match any pattern.
func (s PathSet) NotMatching(patterns ...string) PathSet {
return PathSet{s.values.NotMatching(patterns...)}