Elements  6.0.1
A C++ base framework for the Euclid Software.
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
PathSearch.tpp
Go to the documentation of this file.
1 
22 #ifndef ELEMENTSKERNEL_ELEMENTSKERNEL_PATHSEARCH_IMPL_
23 #error "This file should not be included directly! Use ElementsKernel/Path.h instead"
24 #else
25 
26 #include <string>
27 #include <vector>
28 
29 #include <boost/filesystem/operations.hpp>
30 
31 #include "ElementsKernel/Path.h"
32 
33 namespace Elements {
34 inline namespace Kernel {
35 //-----------------------------------------------------------------------------
36 // Function search
37 template <typename T, typename ITER>
38 std::vector<T> pathSearch(const std::string& searched_name, T directory) {
39 
40  // create the resulting vector
41  std::vector<T> searchResults{};
42  // make sure directory is ps::path, changing from string to path if T is string.
43  Path::Item l_directory{directory};
44  // the default constructor of ITER return a pointer to one-past last element
45  ITER end_iter;
46  if (boost::filesystem::is_directory(l_directory)) {
47  // ITER constructor return a pointer to the first element of l_directory
48  for (ITER dir_iter(l_directory); dir_iter != end_iter; ++dir_iter) {
49  if (dir_iter->path().filename() == searched_name) {
50  // File found: make sure the result is T: string to string or string to
51  // boost::filesystem::path
52  T l_result{dir_iter->path().string()};
53  searchResults.emplace_back(l_result);
54  }
55  }
56  }
57  return searchResults;
58 }
59 
60 template <typename T>
61 std::vector<T> searchOption(std::string searched_name, T directory, SearchType search_type) {
62 
63  // create a local tmp vector result to avoid multiple return statements
64  std::vector<T> searchResults{};
65  switch (search_type) {
66  case SearchType::Local:
67  searchResults = pathSearch<T, boost::filesystem::directory_iterator>(searched_name, directory);
68  break;
70  searchResults = pathSearch<T, boost::filesystem::recursive_directory_iterator>(searched_name, directory);
71  break;
72  }
73  return searchResults;
74 }
75 
76 template <typename T>
77 std::vector<T> pathSearch(const std::string& searched_name, T directory, SearchType search_type) {
78  return searchOption<T>(searched_name, directory, search_type);
79 }
80 
81 } // namespace Kernel
82 } // namespace Elements
83 
84 #endif // ELEMENTSKERNEL_ELEMENTSKERNEL_PATHSEARCH_IMPL_
STL class.
boost::filesystem::path Item
Definition: Path.h:56
ELEMENTS_API std::vector< T > pathSearch(const std::string &searched_name, T directory, SearchType search_type)
Searches for a file or a directory in a directory. The search can be recursive (SearchType.Recursive) and in that case more than one results can be return.
STL class.
provide functions to retrieve resources pointed by environment variables