diff --git a/tdutils/CMakeLists.txt b/tdutils/CMakeLists.txt index 7acd7821..d34b7f76 100644 --- a/tdutils/CMakeLists.txt +++ b/tdutils/CMakeLists.txt @@ -99,6 +99,7 @@ set(TDUTILS_SOURCE td/utils/MimeType.cpp td/utils/MpmcQueue.cpp td/utils/OptionsParser.cpp + td/utils/PathView.cpp td/utils/Random.cpp td/utils/SharedSlice.cpp td/utils/Slice.cpp diff --git a/tdutils/td/utils/PathView.cpp b/tdutils/td/utils/PathView.cpp new file mode 100644 index 00000000..9d4eaca3 --- /dev/null +++ b/tdutils/td/utils/PathView.cpp @@ -0,0 +1,39 @@ +// +// Copyright Aliaksei Levin (levlam@telegram.org), Arseny Smirnov (arseny30@gmail.com) 2014-2019 +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +#include "td/utils/PathView.h" + +#include "td/utils/misc.h" + +namespace td { + +PathView::PathView(Slice path) : path_(path) { + last_slash_ = narrow_cast(path_.size()) - 1; + while (last_slash_ >= 0 && !is_slash(path_[last_slash_])) { + last_slash_--; + } + + last_dot_ = static_cast(path_.size()); + for (auto i = last_dot_ - 1; i > last_slash_ + 1; i--) { + if (path_[i] == '.') { + last_dot_ = i; + break; + } + } +} + +Slice PathView::relative(Slice path, Slice dir, bool force) { + if (begins_with(path, dir)) { + path.remove_prefix(dir.size()); + return path; + } + if (force) { + return Slice(); + } + return path; +} + +} // namespace td diff --git a/tdutils/td/utils/PathView.h b/tdutils/td/utils/PathView.h index 11325f10..fa12fee8 100644 --- a/tdutils/td/utils/PathView.h +++ b/tdutils/td/utils/PathView.h @@ -6,27 +6,13 @@ // #pragma once -#include "td/utils/misc.h" #include "td/utils/Slice.h" namespace td { class PathView { public: - explicit PathView(Slice path) : path_(path) { - last_slash_ = narrow_cast(path_.size()) - 1; - while (last_slash_ >= 0 && !is_slash(path_[last_slash_])) { - last_slash_--; - } - - last_dot_ = static_cast(path_.size()); - for (auto i = last_dot_ - 1; i > last_slash_ + 1; i--) { - if (path_[i] == '.') { - last_dot_ = i; - break; - } - } - } + explicit PathView(Slice path); bool empty() const { return path_.empty(); @@ -74,34 +60,7 @@ class PathView { return !is_absolute(); } - static Slice relative(Slice path, Slice dir, bool force = false) { - if (begins_with(path, dir)) { - path.remove_prefix(dir.size()); - return path; - } - if (force) { - return Slice(); - } - return path; - } - - static Slice dir_and_file(Slice path) { - auto last_slash = static_cast(path.size()) - 1; - while (last_slash >= 0 && !is_slash(path[last_slash])) { - last_slash--; - } - if (last_slash < 0) { - return Slice(); - } - last_slash--; - while (last_slash >= 0 && !is_slash(path[last_slash])) { - last_slash--; - } - if (last_slash < 0) { - return Slice(); - } - return path.substr(last_slash + 1); - } + static Slice relative(Slice path, Slice dir, bool force = false); private: static bool is_slash(char c) {