21 #ifndef ELEMENTSKERNEL_ELEMENTSKERNEL_PATH_IMPL_
22 #error "This file should not be included directly! Use ElementsKernel/Path.h instead"
27 #include <unordered_set>
30 #include <boost/algorithm/string/join.hpp>
31 #include <boost/filesystem/operations.hpp>
34 inline namespace Kernel {
37 template <
typename T,
typename U>
41 Item file_path{file_name};
44 return boost::filesystem::exists(
Item{l} / file_path);
47 if (found_pos != locations.
cend()) {
48 found_path =
Item{*found_pos} / file_path;
54 template <
typename T,
typename U>
58 Item file_path{file_name};
61 return Item{l} / file_path;
64 auto found_pos =
std::remove_if(file_list.begin(), file_list.end(), [](
const Item& p) {
65 return not boost::filesystem::exists(p);
68 file_list.erase(found_pos, file_list.end());
89 vector<string> elems(path_list.
size());
92 return Item{
s}.string();
100 template <
typename... Args>
101 auto join(Args&&... args) -> decltype(
joinPath(std::forward<Args>(args)...)) {
102 return joinPath(std::forward<Args>(args)...);
105 template <
typename... Args>
106 auto split(Args&&... args) -> decltype(
splitPath(std::forward<Args>(args)...)) {
107 return splitPath(std::forward<Args>(args)...);
110 template <
typename T,
typename U>
115 vector<Item> result(initial_locations.
size() * suffixes.
size());
117 auto pos = result.
begin();
129 template <
typename T>
140 output.erase(end, output.
end());
149 #endif // ELEMENTSKERNEL_ELEMENTSKERNEL_PATH_IMPL_
ELEMENTS_API auto split(Args &&...args) -> decltype(splitPath(std::forward< Args >(args)...))
alias for the splitPath function
ELEMENTS_API std::vector< Item > getAllPathFromLocations(const T &file_name, const std::vector< U > &locations)
retrieve all the paths from a file name and a set of location to look into
ELEMENTS_API Item getPathFromEnvVariable(const T &file_name, const std::string &path_variable)
retrieve path from a file name and an environment variable to look into
ELEMENTS_API std::vector< Item > multiPathAppend(const std::vector< T > &initial_locations, const std::vector< U > &suffixes)
path join each suffix to each initial locations
ELEMENTS_API const std::string PATH_SEP
Separator of path entries. Usually ":" on Unix.
ELEMENTS_API Item getPathFromLocations(const T &file_name, const std::vector< U > &locations)
retrieve path from a file name and a set of location to look into
ELEMENTS_API std::vector< Item > splitPath(const std::string &path_string)
split a string into a vector of path using PATH_SEP
boost::filesystem::path Item
ELEMENTS_API std::string joinPath(const std::vector< T > &path_list)
collate a vector of path into a string using PATH_SEP
ELEMENTS_API auto join(Args &&...args) -> decltype(joinPath(std::forward< Args >(args)...))
alias for the joinPath function
ELEMENTS_API std::vector< Item > removeDuplicates(const std::vector< T > &path_list)
remove duplicated paths keeping the order
ELEMENTS_API std::vector< Item > getLocationsFromEnv(const std::string &path_variable, bool exist_only=false)
function to get the locations from an environment variable