silence detection: include fades.
[ardour.git] / libs / pbd / search_path.cc
index c441c01211af77200c61f6d1cece92de56265bf7..1d931a546d93b9b83d2bf858bc964cf2523746a4 100644 (file)
@@ -49,12 +49,42 @@ Searchpath::Searchpath (const vector<std::string>& paths)
        add_directories (paths);
 }
 
+void
+Searchpath::remove_directory (const std::string& directory_path)
+{
+       if (directory_path.empty()) {
+               return;
+       }
+
+       for (vector<std::string>::iterator i = begin(); i != end();) {
+               if (*i == directory_path) {
+                       i = erase (i);
+               } else {
+                       ++i;
+               }
+       }
+}
+
+void
+Searchpath::remove_directories (const vector<std::string>& paths)
+{
+       for(vector<std::string>::const_iterator i = paths.begin(); i != paths.end(); ++i) {
+               remove_directory (*i);
+       }
+}
+
 void
 Searchpath::add_directory (const std::string& directory_path)
 {
-       if (!directory_path.empty()) {
-               push_back(directory_path);
+       if (directory_path.empty()) {
+               return;
+       }
+       for (vector<std::string>::const_iterator i = begin(); i != end(); ++i) {
+               if (*i == directory_path) {
+                       return;
+               }
        }
+       push_back(directory_path);
 }
 
 void
@@ -94,21 +124,33 @@ Searchpath::operator+= (const std::string& directory_path)
        return *this;
 }
 
-Searchpath&
+const Searchpath
 Searchpath::operator+ (const std::string& directory_path)
 {
-       add_directory (directory_path);
+       return Searchpath (*this) += directory_path;
+}
+
+const Searchpath
+Searchpath::operator+ (const Searchpath& spath)
+{
+       return Searchpath (*this) += spath;
+}
+
+Searchpath&
+Searchpath::operator-= (const Searchpath& spath)
+{
+       remove_directories (spath);
        return *this;
 }
 
 Searchpath&
-Searchpath::operator+ (const Searchpath& spath)
+Searchpath::operator-= (const std::string& directory_path)
 {
-       // concatenate paths into new Searchpath
-       insert(end(), spath.begin(), spath.end());
+       remove_directory (directory_path);
        return *this;
 }
 
+
 Searchpath&
 Searchpath::add_subdirectory_to_paths (const string& subdir)
 {