From 81c69fd1708e4326107e6a2716f0332a729136a8 Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Mon, 1 Aug 2016 12:35:05 +0200 Subject: Add path::posix_string()&& overload, path::posix_representation() --- butl/path | 13 ++++++++++--- butl/path.ixx | 23 ++++++++++++++++++++++- butl/path.txx | 48 +++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 73 insertions(+), 11 deletions(-) (limited to 'butl') diff --git a/butl/path b/butl/path index d5b4407..d2d33b8 100644 --- a/butl/path +++ b/butl/path @@ -18,8 +18,6 @@ namespace butl { // Wish list/ideas for improvements. // - // - posix_representation() in addition to posix_string() - // // - Ability to convert to directory/leaf/base in-place, without dynamic // allocation. One idea is something like this: // @@ -822,7 +820,16 @@ namespace butl // c:\foo), this function will throw the invalid_path exception. // string_type - posix_string () const; + posix_string () const&; + + string_type + posix_representation () const&; + + string_type + posix_string () &&; + + string_type + posix_representation () &&; // Implementation details. // diff --git a/butl/path.ixx b/butl/path.ixx index a90922a..26a9b3d 100644 --- a/butl/path.ixx +++ b/butl/path.ixx @@ -296,10 +296,31 @@ namespace butl #ifndef _WIN32 template inline typename basic_path::string_type basic_path:: - posix_string () const + posix_string () const& { return string (); } + + template + inline typename basic_path::string_type basic_path:: + posix_string () && + { + return std::move (*this).string (); + } + + template + inline typename basic_path::string_type basic_path:: + posix_representation () const& + { + return representation (); + } + + template + inline typename basic_path::string_type basic_path:: + posix_representation () && + { + return std::move (*this).representation (); + } #endif template diff --git a/butl/path.txx b/butl/path.txx index 44c03c3..1653dc0 100644 --- a/butl/path.txx +++ b/butl/path.txx @@ -5,6 +5,10 @@ #include #include +#ifdef _WIN32 +# include // replace() +#endif + namespace butl { template @@ -59,19 +63,49 @@ namespace butl #ifdef _WIN32 template typename basic_path::string_type basic_path:: - posix_string () const + posix_string () const& { if (absolute ()) throw invalid_basic_path (this->path_); - string_type r (this->path_); + string_type r (string ()); + replace (r.begin (), r.end (), '\\', '/'); + return r; + } - // Translate Windows-style separators to the POSIX ones. - // - for (size_type i (0), n (r.size ()); i != n; ++i) - if (r[i] == '\\') - r[i] = '/'; + template + typename basic_path::string_type basic_path:: + posix_string () && + { + if (absolute ()) + throw invalid_basic_path (this->path_); + + string_type r (std::move (*this).string ()); + replace (r.begin (), r.end (), '\\', '/'); + return r; + } + + template + typename basic_path::string_type basic_path:: + posix_representation () const& + { + if (absolute ()) + throw invalid_basic_path (this->path_); + + string_type r (representation ()); + replace (r.begin (), r.end (), '\\', '/'); + return r; + } + + template + typename basic_path::string_type basic_path:: + posix_representation () && + { + if (absolute ()) + throw invalid_basic_path (this->path_); + string_type r (std::move (*this).representation ()); + replace (r.begin (), r.end (), '\\', '/'); return r; } #endif -- cgit v1.1