From 086f8b6e68228c9081c15bee03975db4024114ad Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Thu, 23 May 2019 15:33:26 +0200 Subject: Improve path_traits convenience overloads --- libbutl/filesystem.cxx | 2 +- libbutl/path.mxx | 57 +++++++++++++++++++++++++++++++++++++++++++++++- libbutl/process.cxx | 5 ++--- libbutl/string-table.mxx | 2 +- libbutl/url.mxx | 2 +- 5 files changed, 61 insertions(+), 7 deletions(-) diff --git a/libbutl/filesystem.cxx b/libbutl/filesystem.cxx index b0991b2..40b4304 100644 --- a/libbutl/filesystem.cxx +++ b/libbutl/filesystem.cxx @@ -200,7 +200,7 @@ namespace butl // case. // string d; - if (path::traits::root (p, string::traits_type::length (p))) + if (path::traits::root (p)) { d = p; d += path::traits::directory_separator; diff --git a/libbutl/path.mxx b/libbutl/path.mxx index 3f3a844..1b1513a 100644 --- a/libbutl/path.mxx +++ b/libbutl/path.mxx @@ -81,6 +81,7 @@ LIBBUTL_MODEXPORT namespace butl struct path_traits { using string_type = std::basic_string; + using char_traits_type = typename string_type::traits_type; using size_type = typename string_type::size_type; // Canonical directory and path seperators. @@ -135,6 +136,12 @@ LIBBUTL_MODEXPORT namespace butl } static bool + absolute (const C* s) + { + return absolute (s, char_traits_type::length (s)); + } + + static bool absolute (const C* s, size_type n) { #ifdef _WIN32 @@ -151,6 +158,12 @@ LIBBUTL_MODEXPORT namespace butl } static bool + current (const C* s) + { + return current (s, char_traits_type::length (s)); + } + + static bool current (const C* s, size_type n) { return n == 1 && s[0] == '.'; @@ -163,6 +176,12 @@ LIBBUTL_MODEXPORT namespace butl } static bool + parent (const C* s) + { + return parent (s, char_traits_type::length (s)); + } + + static bool parent (const C* s, size_type n) { return n == 2 && s[0] == '.' && s[1] == '.'; @@ -175,6 +194,12 @@ LIBBUTL_MODEXPORT namespace butl } static bool + normalized (const C* s, bool sep) + { + return normalized (s, char_traits_type::length (s), sep); + } + + static bool normalized (const C* s, size_type n, bool sep) { size_t j (0); // Beginning of path component. @@ -215,6 +240,12 @@ LIBBUTL_MODEXPORT namespace butl } static bool + root (const C* s) + { + return root (s, char_traits_type::length (s)); + } + + static bool root (const C* s, size_type n) { #ifdef _WIN32 @@ -237,6 +268,12 @@ LIBBUTL_MODEXPORT namespace butl } static const C* + find_separator (const C* s) + { + return find_separator (s, char_traits_type::length (s)); + } + + static const C* find_separator (const C* s, size_type n) { for (const C* e (s + n); s != e; ++s) @@ -261,6 +298,12 @@ LIBBUTL_MODEXPORT namespace butl } static const C* + rfind_separator (const C* s) + { + return rfind_separator (s, char_traits_type::length (s)); + } + + static const C* rfind_separator (const C* s, size_type n) { for (; n != 0; --n) @@ -282,6 +325,12 @@ LIBBUTL_MODEXPORT namespace butl } static const C* + find_extension (const C* s) + { + return find_extension (s, char_traits_type::length (s)); + } + + static const C* find_extension (const C* s, size_type n) { size_type i (n); @@ -320,6 +369,12 @@ LIBBUTL_MODEXPORT namespace butl } static const C* + find_leaf (const C* s) + { + return find_leaf (s, char_traits_type::length (s)); + } + + static const C* find_leaf (const C* s, size_type n) { const C* p; @@ -600,7 +655,7 @@ LIBBUTL_MODEXPORT namespace butl using string_type = std::basic_string; using size_type = typename string_type::size_type; using difference_type = typename string_type::difference_type; - using traits = path_traits; + using traits = path_traits; //@@ TODO: rename to traits_type. struct iterator; using reverse_iterator = std::reverse_iterator; diff --git a/libbutl/process.cxx b/libbutl/process.cxx index 174e4ae..618c2aa 100644 --- a/libbutl/process.cxx +++ b/libbutl/process.cxx @@ -1073,8 +1073,7 @@ namespace butl // Windows. // const char* d (__argv[0]); - size_t n (strlen (d)); - if (const char* p = traits::rfind_separator (d, n)) + if (const char* p = traits::rfind_separator (d)) { string s (d, p - d + 1); // Include trailing slash. s.append (f, fn); @@ -1421,7 +1420,7 @@ namespace butl optional batch; { const char* p (pp.effect_string ()); - const char* e (path::traits::find_extension (p, strlen (p))); + const char* e (path::traits::find_extension (p)); if (e != nullptr && (casecmp (e, ".bat") == 0 || casecmp (e, ".cmd") == 0)) { diff --git a/libbutl/string-table.mxx b/libbutl/string-table.mxx index 201fb11..e684567 100644 --- a/libbutl/string-table.mxx +++ b/libbutl/string-table.mxx @@ -104,7 +104,7 @@ LIBBUTL_MODEXPORT namespace butl using key_type = butl::map_key; using value_type = string_table_element; using map_type = std::unordered_map; - using traits = string_table_traits; + using traits = string_table_traits; // @@ TODO: rename traits_type; map_type map_; std::vector vec_; diff --git a/libbutl/url.mxx b/libbutl/url.mxx index 90f1cc2..d2360f0 100644 --- a/libbutl/url.mxx +++ b/libbutl/url.mxx @@ -255,7 +255,7 @@ LIBBUTL_MODEXPORT namespace butl class basic_url { public: - using traits = T; + using traits = T; //@@ TODO: rename traits_type. using string_type = typename traits::string_type; using char_type = typename string_type::value_type; -- cgit v1.1