Elements  5.12.0
A C++ base framework for the Euclid Software.
PathSearch.icpp
Go to the documentation of this file.
1 /**
2  * @file ElementsKernel/_impl/Path.icpp
3  * @brief implementation of the templates declared in ElementsKernel/Path.h
4  * @date May 17, 2016
5  * @author Hubert Degaudenzi
6  *
7  *
8  * @copyright 2012-2020 Euclid Science Ground Segment
9  *
10  * This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General
11  * Public License as published by the Free Software Foundation; either version 3.0 of the License, or (at your option)
12  * any later version.
13  *
14  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
15  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 #ifdef ELEMENTSKERNEL_ELEMENTSKERNEL_PATHSEARCH_IMPL_
23 
24 #include <string>
25 #include <vector>
26 
27 #include <boost/filesystem/operations.hpp>
28 
29 #include "ElementsKernel/Path.h"
30 
31 namespace Elements {
32 
33 //-----------------------------------------------------------------------------
34 // Function search
35 template<typename T, typename ITER>
36 std::vector<T> pathSearch(const std::string& searched_name, T directory) {
37 
38  // create the resulting vector
39  std::vector<T> searchResults { };
40  // make sure directory is ps::path, changing from string to path if T is string.
41  Path::Item l_directory { directory };
42  // the default constructor of ITER return a pointer to one-past last element
43  ITER end_iter;
44  if (boost::filesystem::is_directory(l_directory)) {
45  // ITER constructor return a pointer to the first element of l_directory
46  for (ITER dir_iter(l_directory); dir_iter != end_iter; ++dir_iter) {
47  if (dir_iter->path().filename() == searched_name) {
48  // File found: make sure the result is T: string to string or string to
49  // boost::filesystem::path
50  T l_result { dir_iter->path().string() };
51  searchResults.emplace_back(l_result);
52  }
53  }
54  }
55  return searchResults;
56 }
57 
58 template<typename T>
59 std::vector<T> searchOption(std::string searched_name, T directory,
60  SearchType search_type) {
61 
62  // create a local tmp vector result to avoid multiple return statements
63  std::vector<T> searchResults { };
64  switch (search_type) {
65  case SearchType::Local:
66  searchResults = pathSearch<T, boost::filesystem::directory_iterator>(searched_name,
67  directory);
68  break;
69  case SearchType::Recursive:
70  searchResults = pathSearch<T, boost::filesystem::recursive_directory_iterator>(
71  searched_name, directory);
72  break;
73  }
74  return searchResults;
75 }
76 
77 
78 template <typename T>
79 std::vector<T> pathSearch(const std::string& searched_name,
80  T directory,
81  SearchType search_type) {
82  return searchOption<T>(searched_name, directory, search_type);
83 }
84 
85 
86 } // namespace Elements
87 
88 #endif // ELEMENTSKERNEL_ELEMENTSKERNEL_PATHSEARCH_IMPL_