From 9a9e9bb488b39ce97419a67ddfd6c55757f3e154 Mon Sep 17 00:00:00 2001
From: Benedikt Conze <benedikt.conze@googlemail.com>
Date: Sat, 16 Feb 2019 18:54:49 +0100
Subject: [PATCH] Fix formatting under std::setw

---
 src/tg/std/io.hh | 136 ++++++++++++++++++++++++++++++-----------------
 1 file changed, 86 insertions(+), 50 deletions(-)

diff --git a/src/tg/std/io.hh b/src/tg/std/io.hh
index 530a86e..e21d9b1 100644
--- a/src/tg/std/io.hh
+++ b/src/tg/std/io.hh
@@ -28,79 +28,115 @@ std::string to_string(T const& v)
 //         static constexpr char const* value = "box";
 //     };
 
-template <int D, class ScalarT>
-std::ostream& operator<<(std::ostream& out, vec<D, ScalarT> const& v)
+template <int D, class ScalarT, class CharT, class Traits>
+std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& out, vec<D, ScalarT> const& v)
 {
     using T = vec<D, ScalarT>;
-    out << type_name_prefix<T>;
-    out << type_name<T>;
-    out << type_name_suffix<T>;
-    out << "(";
+
+    std::basic_ostringstream<CharT, Traits> ss;
+    ss.flags(out.flags());
+    ss.imbue(out.getloc());
+    ss.precision(out.precision());
+
+    ss << type_name_prefix<T>;
+    ss << type_name<T>;
+    ss << type_name_suffix<T>;
+    ss << "(";
     for (auto i = 0; i < D; ++i)
-        out << (i > 0 ? ", " : "") << v[i];
-    out << ")";
-    return out;
+        ss << (i > 0 ? ", " : "") << v[i];
+    ss << ")";
+    return out << ss.str();
 }
-template <int D, class ScalarT>
-std::ostream& operator<<(std::ostream& out, pos<D, ScalarT> const& p)
+template <int D, class ScalarT, class CharT, class Traits>
+std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& out, pos<D, ScalarT> const& p)
 {
     using T = vec<D, ScalarT>;
-    out << type_name_prefix<T>;
-    out << type_name<T>;
-    out << type_name_suffix<T>;
-    out << "(";
+
+    std::basic_ostringstream<CharT, Traits> ss;
+    ss.flags(out.flags());
+    ss.imbue(out.getloc());
+    ss.precision(out.precision());
+
+    ss << type_name_prefix<T>;
+    ss << type_name<T>;
+    ss << type_name_suffix<T>;
+    ss << "(";
     for (auto i = 0; i < D; ++i)
-        out << (i > 0 ? ", " : "") << p[i];
-    out << ")";
-    return out;
+        ss << (i > 0 ? ", " : "") << p[i];
+    ss << ")";
+    return out << ss.str();
 }
-template <int D, class ScalarT>
-std::ostream& operator<<(std::ostream& out, size<D, ScalarT> const& s)
+template <int D, class ScalarT, class CharT, class Traits>
+std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& out, size<D, ScalarT> const& s)
 {
     using T = vec<D, ScalarT>;
-    out << type_name_prefix<T>;
-    out << type_name<T>;
-    out << type_name_suffix<T>;
-    out << "(";
+
+    std::basic_ostringstream<CharT, Traits> ss;
+    ss.flags(out.flags());
+    ss.imbue(out.getloc());
+    ss.precision(out.precision());
+
+    ss << type_name_prefix<T>;
+    ss << type_name<T>;
+    ss << type_name_suffix<T>;
+    ss << "(";
     for (auto i = 0; i < D; ++i)
-        out << (i > 0 ? ", " : "") << s[i];
-    out << ")";
-    return out;
+        ss << (i > 0 ? ", " : "") << s[i];
+    ss << ")";
+    return out << ss.str();
 }
 
-template <int D, class ScalarT>
-std::ostream& operator<<(std::ostream& out, box<D, ScalarT> const& b)
+template <int D, class ScalarT, class CharT, class Traits>
+std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& out, box<D, ScalarT> const& b)
 {
     using T = box<D, ScalarT>;
-    out << type_name_prefix<T>;
-    out << type_name<T>;
-    out << type_name_suffix<T>;
-    out << "(" << b.min << ", " << b.max << ")";
-    return out;
+
+    std::basic_ostringstream<CharT, Traits> ss;
+    ss.flags(out.flags());
+    ss.imbue(out.getloc());
+    ss.precision(out.precision());
+
+    ss << type_name_prefix<T>;
+    ss << type_name<T>;
+    ss << type_name_suffix<T>;
+    ss << "(" << b.min << ", " << b.max << ")";
+    return out << ss.str();
 }
 
-template <int D, class ScalarT>
-std::ostream& operator<<(std::ostream& out, triangle<D, ScalarT> const& t)
+template <int D, class ScalarT, class CharT, class Traits>
+std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& out, triangle<D, ScalarT> const& t)
 {
     using T = triangle<D, ScalarT>;
-    out << type_name_prefix<T>;
-    out << type_name<T>;
-    out << type_name_suffix<T>;
-    out << "(" << t.v0 << ", " << t.v1 << ", " << t.v2 << ")";
-    return out;
+
+    std::basic_ostringstream<CharT, Traits> ss;
+    ss.flags(out.flags());
+    ss.imbue(out.getloc());
+    ss.precision(out.precision());
+
+    ss << type_name_prefix<T>;
+    ss << type_name<T>;
+    ss << type_name_suffix<T>;
+    ss << "(" << t.v0 << ", " << t.v1 << ", " << t.v2 << ")";
+    return out << ss.str();
 }
 
-template <int C, int R, class ScalarT>
-std::ostream& operator<<(std::ostream& out, mat<C, R, ScalarT> const& m)
+template <int C, int R, class ScalarT, class CharT, class Traits>
+std::basic_ostream<CharT, Traits>& operator<<(std::basic_ostream<CharT, Traits>& out, mat<C, R, ScalarT> const& m)
 {
     using T = mat<C, R, ScalarT>;
-    out << type_name_prefix<T>;
-    out << type_name<T>;
-    out << type_name_suffix<T>;
-    out << "(";
+
+    std::basic_ostringstream<CharT, Traits> ss;
+    ss.flags(out.flags());
+    ss.imbue(out.getloc());
+    ss.precision(out.precision());
+
+    ss << type_name_prefix<T>;
+    ss << type_name<T>;
+    ss << type_name_suffix<T>;
+    ss << "(";
     for (auto i = 0; i < C; ++i)
-        out << (i > 0 ? ", " : "") << m[i];
-    out << ")";
-    return out;
+        ss << (i > 0 ? ", " : "") << m[i];
+    ss << ")";
+    return out << ss.str();
 }
 } // namespace tg
-- 
GitLab