25 #include <unordered_set>
45 std::ostream&
toStream(
const TYPE& obj, std::ostream&
s );
57 template <
class ITERATOR>
58 inline std::ostream&
toStream( ITERATOR first,
61 const std::string& open,
62 const std::string& close,
63 const std::string& delim );
70 inline std::ostream&
toStream(
const std::string& obj, std::ostream&
s ) {
return s << std::quoted( obj,
'\'' ); }
75 inline std::ostream&
toStream(
const bool obj, std::ostream&
s ) {
return s << ( obj ?
"True" :
"False" ); }
80 inline std::ostream&
toStream(
const float obj, std::ostream&
s,
const int prec = 6 ) {
81 const int p =
static_cast<int>(
s.precision() );
82 return s << std::setprecision( prec ) << obj << std::setprecision( p );
88 inline std::ostream&
toStream(
const double obj, std::ostream&
s,
const int prec = 8 ) {
89 const int p =
static_cast<int>(
s.precision() );
90 return s << std::setprecision( prec ) << obj << std::setprecision( p );
96 inline std::ostream&
toStream(
const long double obj, std::ostream&
s,
const int prec = 10 ) {
97 const int p =
static_cast<int>(
s.precision() );
98 return s << std::setprecision( prec ) << obj << std::setprecision( p );
107 template <
class KTYPE,
class VTYPE>
108 inline std::ostream&
toStream(
const std::pair<KTYPE, VTYPE>& obj, std::ostream&
s ) {
109 return toStream( obj.second,
toStream( obj.first,
s <<
"( " ) <<
" , " ) <<
" )";
112 template <
typename... Args>
113 inline std::ostream&
toStream(
const std::tuple<Args...>& tuple, std::ostream&
s );
121 template <
class TYPE,
class ALLOCATOR>
122 inline std::ostream&
toStream(
const std::vector<TYPE, ALLOCATOR>& obj, std::ostream&
s ) {
123 return toStream( obj.begin(), obj.end(),
s,
"[ ",
" ]",
" , " );
131 template <
class TYPE,
class ALLOCATOR>
132 inline std::ostream&
toStream(
const std::list<TYPE, ALLOCATOR>& obj, std::ostream&
s ) {
133 return toStream( obj.begin(), obj.end(),
s,
"[ ",
" ]",
" , " );
141 template <
class TYPE,
class CMP,
class ALLOCATOR>
142 inline std::ostream&
toStream(
const std::set<TYPE, CMP, ALLOCATOR>& obj, std::ostream&
s ) {
143 return toStream( obj.begin(), obj.end(),
s,
"[ ",
" ]",
" , " );
148 template <
class TYPE,
class HASH,
class CMP,
class ALLOCATOR>
149 inline std::ostream&
toStream(
const std::unordered_set<TYPE, HASH, CMP, ALLOCATOR>& obj, std::ostream&
s ) {
150 auto ordered = std::set( obj.begin(), obj.end() );
151 return obj.empty() ?
s <<
"set()" :
toStream( ordered.begin(), ordered.end(),
s,
"{ ",
" }",
" , " );
160 template <
class KTYPE,
class VTYPE,
class CMP,
class ALLOCATOR>
161 inline std::ostream&
toStream(
const std::map<KTYPE, VTYPE, CMP, ALLOCATOR>& obj, std::ostream&
s ) {
164 []( std::ostream& os,
const std::pair<const KTYPE, VTYPE>& i ) -> std::ostream& {
177 template <
class KTYPE,
class VTYPE,
class CMP,
class ALLOCATOR>
181 []( std::ostream& os,
const std::pair<const KTYPE, VTYPE>& i ) -> std::ostream& {
194 template <
class KTYPE,
class VTYPE,
class MAP>
198 []( std::ostream& os,
const std::pair<const KTYPE, VTYPE>& i ) -> std::ostream& {
211 template <
class KTYPE,
class VTYPE,
class HASH,
class MAP>
220 template <
class TYPE,
unsigned int N>
221 std::ostream&
toStream(
const TYPE ( &obj )[
N], std::ostream&
s ) {
222 if constexpr (
N == 1 ) {
223 return toStream( obj[0],
s <<
"( " ) <<
" , )";
225 return toStream( obj, obj +
N,
s,
"( ",
" )",
" , " );
232 template <
class TYPE, std::
size_t N>
233 std::ostream&
toStream(
const std::array<TYPE, N>& obj, std::ostream&
s ) {
234 if constexpr (
N == 1 ) {
235 return toStream( obj[0],
s <<
"( " ) <<
" , )";
244 template <
unsigned int N>
245 std::ostream&
toStream(
const char ( &obj )[
N], std::ostream&
s ) {
246 return toStream( std::string( obj, obj +
N ),
s );
252 inline std::ostream&
toStream(
const char* obj, std::ostream&
s ) {
return toStream( std::string( obj ),
s ); }
258 template <
class TYPE>
259 inline std::ostream&
toStream(
const TYPE& obj, std::ostream&
s ) {
263 template <
class Tuple, std::
size_t N>
265 static std::ostream&
toStream(
const Tuple&
t, std::ostream&
s ) {
271 template <
class Tuple>
273 static std::ostream&
toStream(
const Tuple&
t, std::ostream&
s ) {
284 template <
typename... Args>
285 inline std::ostream&
toStream(
const std::tuple<Args...>& tuple, std::ostream&
s ) {
287 if constexpr ( std::tuple_size_v<std::tuple<Args...>> == 1 ) {
303 template <
class ITERATOR>
307 const std::string& open,
308 const std::string& close,
309 const std::string& delim )
314 []( std::ostream& os, ref_t i ) -> std::ostream& {
return toStream( i, os ); } )
325 template <
class TYPE>
327 std::ostringstream
s;
328 std::ios::fmtflags orig_flags =
s.flags();
329 s.setf( std::ios::showpoint );
331 s.flags( orig_flags );