add -fvisibility=hidden to libgtkmm2ext, and make things work
[ardour.git] / libs / pbd / pbd / search_path.h
1 /*
2     Copyright (C) 2007 Tim Mayberry 
3
4     This program is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License as published by
6     the Free Software Foundation; either version 2 of the License, or
7     (at your option) any later version.
8
9     This program is distributed in the hope that it will be useful,
10     but WITHOUT ANY WARRANTY; without even the implied warranty of
11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12     GNU General Public License for more details.
13
14     You should have received a copy of the GNU General Public License
15     along with this program; if not, write to the Free Software
16     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
17
18 */
19
20 #ifndef PBD_SEARCH_PATH_INCLUDED
21 #define PBD_SEARCH_PATH_INCLUDED
22
23 #include <string>
24 #include <vector>
25
26 #include "pbd/libpbd_visibility.h"
27
28 namespace PBD {
29
30 /**
31  * @class SearchPath
32  *
33  * The SearchPath class is a helper class for getting a
34  * vector of paths contained in a search path string where a 
35  * "search path string" contains absolute directory paths 
36  * separated by a colon(:) or a semi-colon(;) on windows.
37  *
38  * The SearchPath class does not test whether the paths exist
39  * or are directories. It is basically just a container.
40  */
41 class LIBPBD_API SearchPath : public std::vector<std::string>
42 {
43 public:
44         /**
45          * Create an empty SearchPath.
46          */
47         SearchPath ();
48
49         /**
50          * Initialize SearchPath from a string where the string contains
51          * one or more absolute paths to directories which are delimited 
52          * by a path separation character. The path delimeter is a 
53          * colon(:) on unix and a semi-colon(;) on windows.
54          *
55          * Each path contained in the search path may or may not resolve to
56          * an existing directory in the filesystem.
57          * 
58          * @param search_path A path string.
59          */
60         SearchPath (const std::string& search_path);
61
62         /**
63          * Initialize SearchPath from a vector of paths that may or may
64          * not exist.
65          *
66          * @param paths A vector of paths.
67          */
68         SearchPath (const std::vector<std::string>& paths);
69
70         /**
71          * @return a search path string.
72          *
73          * The string that is returned contains the platform specific
74          * path separator.
75          */
76         const std::string to_string () const;
77
78         /**
79          * Add all the directories in path to this.
80          */
81         SearchPath& operator+= (const SearchPath& spath);
82
83         /**
84          * Add another directory path to the search path.
85          */
86         SearchPath& operator+= (const std::string& directory_path);
87         
88         /**
89          * Concatenate another SearchPath onto this.
90          */
91         SearchPath& operator+ (const SearchPath& other);
92         
93         /**
94          * Add another path to the search path.
95          */
96         SearchPath& operator+ (const std::string& directory_path);
97
98         /**
99          * Add a sub-directory to each path in the search path.
100          * @param subdir The directory name, it should not contain 
101          * any path separating tokens.
102          */
103         SearchPath& add_subdirectory_to_paths (const std::string& subdir);
104
105 protected:
106
107         void add_directory (const std::string& directory_path);
108         void add_directories (const std::vector<std::string>& paths);
109 };
110
111 } // namespace PBD
112
113 #endif