Google OR-Tools: ortools/base/path.cc Source File
19#include "absl/strings/str_cat.h"
21namespace file {
25std::string JoinPath(absl::string_view path1, absl::string_view path2) {
26 if (path1.empty()) return std::string(path2);
27 if (path2.empty()) return std::string(path1);
30 return absl::StrCat(path1, absl::ClippedSubstr(path2, 1));
32 if (path2.front() != '/') return absl::StrCat(path1, "/", path2);
42 std::initializer_list<absl::string_view> paths) {
48 size_t total_size = paths.size() - 1;
49 for (const absl::string_view path : paths) total_size += path.size();
52 auto begin = result.begin();
54 bool trailing_slash = false;
55 for (absl::string_view path : paths) {
56 if (path.empty()) continue;
60 } else if (trailing_slash) {
64 if (!trailing_slash && out != begin) *out++ = '/';
66 const size_t this_size = path.size();
67 memcpy(&*out, path.data(), this_size);
79std::pair<absl::string_view, absl::string_view> SplitBasename(
83 size_t pos = path.find_last_of('.');
84 if (pos == absl::string_view::npos)
85 return std::make_pair(path, absl::ClippedSubstr(path, path.size(), 0));
86 return std::make_pair(path.substr(0, pos),
96std::string AddSlash(absl::string_view path) {
97 size_t length = path.size();
98 if (length && path[length - 1] != '/') {
113std::pair<absl::string_view, absl::string_view> SplitPath(
115 size_t pos = path.find_last_of('/');
118 if (pos == absl::string_view::npos)
119 return std::make_pair(path.substr(0, 0), path);
123 return std::make_pair(path.substr(0, 1), absl::ClippedSubstr(path, 1));
125 return std::make_pair(path.substr(0, pos),
137std::string CleanPath(const absl::string_view unclean_path) {
138 std::string path = std::string(unclean_path);
139 const char* src = path.c_str();
140 std::string::iterator dst = path.begin();
143 const bool is_absolute_path = *src == '/';
146 while (*src == '/') ++src;
148 std::string::const_iterator backtrack_limit = dst;
156 if (src[1] == '/' || !src[1]) {
161 } else if (src[1] == '.' && (src[2] == '/' || !src[2])) {
164 if (dst != backtrack_limit) {
166 for (--dst; dst != backtrack_limit && dst[-1] != '/'; --dst) {
169 } else if (!is_absolute_path) {
189 while (*src && *src != '/') {
204 int path_length = dst - path.begin();
std::pair< absl::string_view, absl::string_view > SplitBasename(absl::string_view path)
Definition path.cc:79
std::string JoinPathImpl(bool honor_abs, std::initializer_list< absl::string_view > paths)
Definition path.cc:41
std::string AddSlash(absl::string_view path)
Definition path.cc:96
absl::string_view Extension(absl::string_view path)
Definition path.cc:133
std::string CleanPath(const absl::string_view unclean_path)
Definition path.cc:137
std::pair< absl::string_view, absl::string_view > SplitPath(absl::string_view path)
Definition path.cc:113
bool IsAbsolutePath(absl::string_view path)
Definition path.cc:92
absl::string_view Stem(absl::string_view path)
Definition path.cc:129
absl::string_view Basename(absl::string_view path)
Definition path.cc:109
absl::string_view Dirname(absl::string_view path)
Definition path.cc:105
std::string CollapseSlashes(absl::string_view path)
Definition path.cc:218