#pragma once #include "std/array.hpp" #include "std/functional.hpp" #include "std/initializer_list.hpp" #include "std/iterator.hpp" #include "std/list.hpp" #include "std/map.hpp" #include "std/set.hpp" #include "std/sstream.hpp" #include "std/string.hpp" #include "std/unique_ptr.hpp" #include "std/unordered_map.hpp" #include "std/unordered_set.hpp" #include "std/utility.hpp" #include "std/vector.hpp" /// @name Declarations. //@{ template inline string DebugPrint(T const & t); string DebugPrint(string const & t); inline string DebugPrint(char const * t); inline string DebugPrint(char t); template inline string DebugPrint(pair const & p); template inline string DebugPrint(list const & v); template inline string DebugPrint(vector const & v); template > inline string DebugPrint(set const & v); template > inline string DebugPrint(map const & v); template inline string DebugPrint(initializer_list const & v); template inline string DebugPrint(unique_ptr const & v); template , class Pred = equal_to> inline string DebugPrint(unordered_set const & v); template , class Pred = equal_to> inline string DebugPrint(unordered_map const & v); //@} inline string DebugPrint(char const * t) { if (t) return DebugPrint(string(t)); else return string("NULL string pointer"); } inline string DebugPrint(char t) { return DebugPrint(string(1, t)); } inline string DebugPrint(signed char t) { return DebugPrint(static_cast(t)); } inline string DebugPrint(unsigned char t) { return DebugPrint(static_cast(t)); } template inline string DebugPrint(pair const & p) { ostringstream out; out << "(" << DebugPrint(p.first) << ", " << DebugPrint(p.second) << ")"; return out.str(); } namespace my { namespace impl { template inline string DebugPrintSequence(IterT beg, IterT end) { ostringstream out; out << "[" << distance(beg, end) << ":"; for (; beg != end; ++beg) out << " " << DebugPrint(*beg); out << " ]"; return out.str(); } } } template inline string DebugPrint(T (&arr) [N]) { return ::my::impl::DebugPrintSequence(arr, arr + N); } template inline string DebugPrint(array const & v) { return ::my::impl::DebugPrintSequence(v.begin(), v.end()); } template inline string DebugPrint(vector const & v) { return ::my::impl::DebugPrintSequence(v.begin(), v.end()); } template inline string DebugPrint(list const & v) { return ::my::impl::DebugPrintSequence(v.begin(), v.end()); } template inline string DebugPrint(set const & v) { return ::my::impl::DebugPrintSequence(v.begin(), v.end()); } template inline string DebugPrint(map const & v) { return ::my::impl::DebugPrintSequence(v.begin(), v.end()); } template inline string DebugPrint(initializer_list const & v) { return ::my::impl::DebugPrintSequence(v.begin(), v.end()); } template inline string DebugPrint(unordered_set const & v) { return ::my::impl::DebugPrintSequence(v.begin(), v.end()); } template inline string DebugPrint(unordered_map const & v) { return ::my::impl::DebugPrintSequence(v.begin(), v.end()); } template inline string DebugPrint(T const & t) { ostringstream out; out << t; return out.str(); } template inline string DebugPrint(unique_ptr const & v) { ostringstream out; if (v.get() != nullptr) out << DebugPrint(*v); else out << DebugPrint("null"); return out.str(); } namespace my { namespace impl { inline string Message() { return string(); } template string Message(T const & t) { return DebugPrint(t); } template string Message(T const & t, ARGS const & ... others) { return DebugPrint(t) + " " + Message(others...); } } }