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