aboutsummaryrefslogtreecommitdiff
path: root/libbutl
diff options
context:
space:
mode:
authorKaren Arutyunov <karen@codesynthesis.com>2019-11-13 23:44:41 +0300
committerKaren Arutyunov <karen@codesynthesis.com>2019-11-14 13:05:22 +0300
commit31ccc33713e3ebd0fc0479d906f114ea33c5d616 (patch)
tree7e98082c70e412c0171413b64c391cf20087c132 /libbutl
parent161a8e6a768679bde7054fef96dcbb936c866151 (diff)
Add to_stream(ostream, path, bool)
Diffstat (limited to 'libbutl')
-rw-r--r--libbutl/path-io.mxx13
-rw-r--r--libbutl/path.ixx24
-rw-r--r--libbutl/path.mxx7
3 files changed, 38 insertions, 6 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 <typename C, typename K>
inline std::basic_ostream<C>&
operator<< (std::basic_ostream<C>& os, const basic_path<C, K>& p)
{
- return os << p.string ();
+ return to_stream (os, p, false /* representation */);
}
template <typename C, typename P>
@@ -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 <typename C, typename K>
+ inline std::basic_ostream<C>&
+ to_stream (std::basic_ostream<C>& os,
+ const basic_path<C, K>& 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 <string>
+#include <ostream>
#include <cstddef> // ptrdiff_t
#include <cstdint> // uint16_t
#include <utility> // move(), swap()
@@ -1372,6 +1373,12 @@ LIBBUTL_MODEXPORT namespace butl
empty () const {return path == nullptr && !name;}
};
+ template <typename C, typename K>
+ std::basic_ostream<C>&
+ to_stream (std::basic_ostream<C>& os,
+ const basic_path<C, K>& p,
+ bool representation);
+
// For operator<< (ostream) see the path-io header.
template <typename P>