From 31ccc33713e3ebd0fc0479d906f114ea33c5d616 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Wed, 13 Nov 2019 23:44:41 +0300 Subject: Add to_stream(ostream, path, bool) --- libbutl/path-io.mxx | 13 +++++++------ libbutl/path.ixx | 24 ++++++++++++++++++++++++ libbutl/path.mxx | 7 +++++++ tests/path/driver.cxx | 28 ++++++++++++++++++++++------ 4 files changed, 60 insertions(+), 12 deletions(-) diff --git a/libbutl/path-io.mxx b/libbutl/path-io.mxx index 5a91dac..a44d26b 100644 --- a/libbutl/path-io.mxx +++ b/libbutl/path-io.mxx @@ -31,16 +31,17 @@ import butl.path; LIBBUTL_MODEXPORT namespace butl { - // This is the default path IO implementation. It is separate to allo custom - // implementations. For example, we may want to print paths as relative to - // the working directory. Or we may want to print '~' for the home directory - // prefix. Or we may want to print dir_path with a trailing '/'. + // This is the default path IO implementation. It is separate to allow + // custom implementations. For example, we may want to print paths as + // relative to the working directory. Or we may want to print '~' for the + // home directory prefix. Or we may want to print dir_path with a trailing + // '/'. // template inline std::basic_ostream& operator<< (std::basic_ostream& os, const basic_path& p) { - return os << p.string (); + return to_stream (os, p, false /* representation */); } template @@ -49,6 +50,6 @@ LIBBUTL_MODEXPORT namespace butl { assert (!pn.empty ()); - return os << (pn.name ? *pn.name : pn.path->string ()); + return pn.name ? (os << *pn.name) : (os << *pn.path); } } diff --git a/libbutl/path.ixx b/libbutl/path.ixx index b91102a..165f06a 100644 --- a/libbutl/path.ixx +++ b/libbutl/path.ixx @@ -743,4 +743,28 @@ LIBBUTL_MODEXPORT namespace butl //@@ MOD Clang needs this for some reason. return *this; } + + template + inline std::basic_ostream& + to_stream (std::basic_ostream& os, + const basic_path& p, + bool representation) + { + os << p.string (); + + if (representation) + { + C sep (p.separator ()); + +#ifndef _WIN32 + if (sep != 0 && !p.root ()) + os << sep; +#else + if (sep != 0) + os << sep; +#endif + } + + return os; + } } diff --git a/libbutl/path.mxx b/libbutl/path.mxx index 4ed6989..130419c 100644 --- a/libbutl/path.mxx +++ b/libbutl/path.mxx @@ -10,6 +10,7 @@ #ifndef __cpp_lib_modules_ts #include +#include #include // ptrdiff_t #include // uint16_t #include // move(), swap() @@ -1372,6 +1373,12 @@ LIBBUTL_MODEXPORT namespace butl empty () const {return path == nullptr && !name;} }; + template + std::basic_ostream& + to_stream (std::basic_ostream& os, + const basic_path& p, + bool representation); + // For operator<< (ostream) see the path-io header. template diff --git a/tests/path/driver.cxx b/tests/path/driver.cxx index 72fdf9f..ba25e5b 100644 --- a/tests/path/driver.cxx +++ b/tests/path/driver.cxx @@ -5,6 +5,7 @@ #include #ifndef __cpp_lib_modules_ts +#include #include #include #endif @@ -17,10 +18,10 @@ import std.core; import std.io; #endif import butl.path; -import butl.path_io; +//import butl.path_io; #else #include -#include +//#include #endif using namespace std; @@ -44,16 +45,31 @@ main () static_assert (is_nothrow_move_constructible::value, ""); #endif - auto test = [] (const char* p, const char* s, const char* r) + auto ts = [] (const path& p, bool representation) + { + ostringstream os; + to_stream (os, p, representation); + return os.str (); + }; + + auto test = [&ts] (const char* p, const char* s, const char* r) { path x (p); - return x.string () == s && x.representation () == r; + + return x.string () == s && + x.representation () == r && + ts (x, false /* representation */) == s && + ts (x, true /* representation */) == r; }; - auto dir_test = [] (const char* p, const char* s, const char* r) + auto dir_test = [&ts] (const char* p, const char* s, const char* r) { dir_path x (p); - return x.string () == s && x.representation () == r; + + return x.string () == s && + x.representation () == r && + ts (x, false /* representation */) == s && + ts (x, true /* representation */) == r; }; #ifndef _WIN32 -- cgit v1.1