📄 cpp_include_paths.hpp
字号:
} ar & make_nvp("was_sys_include_path", was_sys_include_path); } BOOST_SERIALIZATION_SPLIT_MEMBER()#endif};///////////////////////////////////////////////////////////////////////////////// Add an include path to one of the search lists (user include path or system // include path).inlinebool include_paths::add_include_path ( char const *path_, include_list_type &pathes_){ namespace fs = boost::filesystem; if (path_) { fs::path newpath = fs::complete(fs::path(path_, fs::native), current_dir); if (!fs::exists(newpath) || !fs::is_directory(newpath)) { // the given path does not form a name of a valid file system directory // item return false; } pathes_.push_back (include_value_type(newpath, path_)); return true; } return false;}///////////////////////////////////////////////////////////////////////////////// Find an include file by traversing the list of include directoriesinlinebool include_paths::find_include_file (std::string &s, std::string &dir, include_list_type const &pathes, char const *current_file) const{ namespace fs = boost::filesystem; typedef include_list_type::const_iterator const_include_list_iter_t; const_include_list_iter_t it = pathes.begin(); const_include_list_iter_t include_paths_end = pathes.end();#if BOOST_WAVE_SUPPORT_INCLUDE_NEXT != 0 if (0 != current_file) { // re-locate the directory of the current file (#include_next handling) // #include_next does not distinguish between <file> and "file" // inclusion, nor does it check that the file you specify has the same // name as the current file. It simply looks for the file named, starting // with the directory in the search path after the one where the current // file was found. fs::path file_path (current_file, fs::native); for (/**/; it != include_paths_end; ++it) { fs::path currpath ((*it).first.string(), fs::native); if (std::equal(currpath.begin(), currpath.end(), file_path.begin())) { ++it; // start searching with the next directory break; } } }#endif for (/**/; it != include_paths_end; ++it) { fs::path currpath (s, fs::native); if (!currpath.has_root_directory()) { currpath = fs::path((*it).first.string(), fs::native); currpath /= fs::path(s, fs::native); // append filename } if (fs::exists(currpath)) { fs::path dirpath (s, fs::native); if (!dirpath.has_root_directory()) { dirpath = fs::path((*it).second, fs::native); dirpath /= fs::path(s, fs::native); } dir = dirpath.string(); s = currpath.normalize().string(); // found the required file return true; } } return false;}///////////////////////////////////////////////////////////////////////////////// Find an include file by searching the user and system includes in the // correct sequence (as it was configured by the user of the driver program)inline bool include_paths::find_include_file (std::string &s, std::string &dir, bool is_system, char const *current_file) const{ namespace fs = boost::filesystem; // if not system include (<...>), then search current directory first if (!is_system) { if (!was_sys_include_path) { // set_sys_include_delimiter() not called // first have a look at the current directory fs::path currpath (s, fs::native); if (!currpath.has_root_directory()) { currpath = fs::path(current_dir.string(), fs::native); currpath /= fs::path(s, fs::native); } if (fs::exists(currpath) && 0 == current_file) { // if 0 != current_path (#include_next handling) it can't be // the file in the current directory fs::path dirpath (s, fs::native); if (!dirpath.has_root_directory()) { dirpath = fs::path(current_rel_dir.string(), fs::native); dirpath /= fs::path(s, fs::native); } dir = dirpath.string(); s = currpath.normalize().string(); // found in local directory return true; } // iterate all user include file directories to find the file if (find_include_file(s, dir, user_include_paths, current_file)) return true; // ... fall through } else { // if set_sys_include_delimiter() was called, then user include files // are searched in the user search path only return find_include_file(s, dir, user_include_paths, current_file); } // if nothing found, fall through // ... }// iterate all system include file directories to find the file return find_include_file (s, dir, system_include_paths, current_file);}///////////////////////////////////////////////////////////////////////////////// Set current directory from a given file nameinlinevoid include_paths::set_current_directory(char const *path_){ namespace fs = boost::filesystem; fs::path filepath (path_, fs::native); fs::path filename = fs::complete(filepath, current_dir); if (fs::exists(filename) && fs::is_directory(filename)) { current_dir = filename; current_rel_dir = filepath; } else { current_dir = filename.branch_path(); current_rel_dir = filepath.branch_path(); }}///////////////////////////////////////////////////////////////////////////////}}} // namespace boost::wave::util#if BOOST_WAVE_SERIALIZATION != 0///////////////////////////////////////////////////////////////////////////////namespace boost { namespace serialization {///////////////////////////////////////////////////////////////////////////////// Serialization support for boost::filesystem::pathtemplate<class Archive>inline void save (Archive & ar, boost::filesystem::path const& p, const unsigned int /* file_version */){ using namespace boost::serialization; std::string path_str(p.native_file_string()); ar & make_nvp("filepath", path_str);}template<class Archive>inline void load (Archive & ar, boost::filesystem::path &p, const unsigned int /* file_version */){ using namespace boost::serialization; std::string path_str; ar & make_nvp("filepath", path_str); p = boost::filesystem::path(path_str, boost::filesystem::native);}// split non-intrusive serialization function member into separate// non intrusive save/load member functionstemplate<class Archive>inline void serialize (Archive & ar, boost::filesystem::path &p, const unsigned int file_version){ boost::serialization::split_free(ar, p, file_version);}///////////////////////////////////////////////////////////////////////////////// Serialization support for the used multi_indextemplate<class Archive>inline void save (Archive & ar, const typename boost::wave::util::bidirectional_map< std::string, std::string >::type &t, const unsigned int /* file_version */){ boost::serialization::stl::save_collection< Archive, typename boost::wave::util::bidirectional_map< std::string, std::string >::type >(ar, t);}template<class Archive>inline void load (Archive & ar, typename boost::wave::util::bidirectional_map<std::string, std::string>::type &t, const unsigned int /* file_version */){ typedef typename boost::wave::util::bidirectional_map< std::string, std::string >::type map_type; boost::serialization::stl::load_collection< Archive, map_type, boost::serialization::stl::archive_input_unique<Archive, map_type>, boost::serialization::stl::no_reserve_imp<map_type> >(ar, t);}// split non-intrusive serialization function member into separate// non intrusive save/load member functionstemplate<class Archive>inline void serialize (Archive & ar, typename boost::wave::util::bidirectional_map< std::string, std::string >::type &t, const unsigned int file_version){ boost::serialization::split_free(ar, t, file_version);}///////////////////////////////////////////////////////////////////////////////}} // namespace boost::serializationBOOST_CLASS_VERSION(boost::wave::util::include_paths, boost::wave::util::include_paths::version);#endif // BOOST_WAVE_SERIALIZATION != 0// the suffix header occurs after all of the code#ifdef BOOST_HAS_ABI_HEADERS#include BOOST_ABI_SUFFIX#endif#endif // !defined(CPP_INCLUDE_PATHS_HPP_AF620DA4_B3D2_4221_AD91_8A1ABFFB6944_INCLUDED)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -