16#include <tr1/unordered_set>
22template <
typename S,
typename T>
struct conditional<true, S, T> {
25template <
typename S,
typename T>
struct conditional<false, S, T> {
43 template <
typename C>
static yes test(
typename C::const_iterator *);
44 template <
typename C>
static no test(...);
47 static const bool value =
sizeof(test<T>(0)) ==
sizeof(yes);
60 typedef typename TType::const_iterator
iter;
68 template <
typename C, C>
struct ChT;
72 template <
typename C>
static char (&
f(...))[2];
75 template <
typename C>
static char (&
g(...))[2];
95 static const bool value =
false;
130template <
typename T,
typename TComp,
typename TAllocator>
135template <
typename T,
typename TComp,
typename TAllocator>
140template <
typename T,
typename TComp,
typename TAllocator>
141struct delimiters<::std::set<T, TComp, TAllocator>, wchar_t> {
145template <
typename T,
typename TComp,
typename TAllocator>
150template <
typename T,
typename TComp,
typename TAllocator>
151struct delimiters<::std::multiset<T, TComp, TAllocator>, char> {
155template <
typename T,
typename TComp,
typename TAllocator>
160template <
typename T,
typename TComp,
typename TAllocator>
161struct delimiters<::std::multiset<T, TComp, TAllocator>, wchar_t> {
165template <
typename T,
typename TComp,
typename TAllocator>
171template <
typename T,
typename THash,
typename TEqual,
typename TAllocator>
172struct delimiters<::std::tr1::unordered_set<T, THash, TEqual, TAllocator>,
177template <
typename T,
typename THash,
typename TEqual,
typename TAllocator>
182template <
typename T,
typename THash,
typename TEqual,
typename TAllocator>
183struct delimiters<::std::tr1::unordered_set<T, THash, TEqual, TAllocator>,
188template <
typename T,
typename THash,
typename TEqual,
typename TAllocator>
193template <
typename T,
typename THash,
typename TEqual,
typename TAllocator>
194struct delimiters<::std::tr1::unordered_multiset<T, THash, TEqual, TAllocator>,
199template <
typename T,
typename THash,
typename TEqual,
typename TAllocator>
204template <
typename T,
typename THash,
typename TEqual,
typename TAllocator>
205struct delimiters<::std::tr1::unordered_multiset<T, THash, TEqual, TAllocator>,
210template <
typename T,
typename THash,
typename TEqual,
typename TAllocator>
218template <
typename T1,
typename T2>
222template <
typename T1,
typename T2>
225template <
typename T1,
typename T2>
229template <
typename T1,
typename T2>
236 typedef typename T::const_iterator
iter;
244 typename T::const_iterator>
::type
249typename enable_if<has_const_iterator<T>::value,
250 typename T::const_iterator>::type
254template <
typename T,
size_t N>
const T *
begin(
const T (&x)[N]) {
257template <
typename T,
size_t N>
const T *
end(
const T (&x)[N]) {
265 typename TChar = char,
266 typename TCharTraits = ::std::char_traits<TChar>,
267 typename TDelimiters = delimiters<T, TChar>>
277 if (delimiters_type::values.prefix != NULL)
278 stream << delimiters_type::values.prefix;
280 if (
begin(_container) !=
end(_container))
281 for (
TIter it =
begin(_container), it_end =
end(_container);;) {
284 if (++it == it_end)
break;
286 if (delimiters_type::values.delimiter != NULL)
287 stream << delimiters_type::values.delimiter;
290 if (delimiters_type::values.postfix != NULL)
291 stream << delimiters_type::values.postfix;
305 virtual ::std::ostream &
stream(::std::ostream &) = 0;
306 virtual ::std::wostream &
stream(::std::wostream &) = 0;
309template <
typename T,
typename Delims>
313 ::std::ostream &
stream(::std::ostream &s) {
316 ::std::char_traits<char>,
319 ::std::wostream &
stream(::std::wostream &s) {
323 ::std::char_traits<wchar_t>,
332 template <
typename Container>
341template <
typename TChar,
typename TCharTraits,
typename Delims>
342inline std::basic_ostream<TChar, TCharTraits> &
operator<<(
343 std::basic_ostream<TChar, TCharTraits> &s,
363 typename TCharTraits,
364 typename TDelimiters>
365inline basic_ostream<TChar, TCharTraits> &
operator<<(
366 basic_ostream<TChar, TCharTraits> &stream,
367 const ::pretty_print::
368 print_container_helper<T, TChar, TCharTraits, TDelimiters> &helper) {
375template <
typename T,
typename TChar,
typename TCharTraits>
376inline typename ::pretty_print::enable_if<
378 basic_ostream<TChar, TCharTraits> &>::type
379operator<<(basic_ostream<TChar, TCharTraits> &stream,
const T &container) {
387template <
typename T1,
typename T2,
typename TChar,
typename TCharTraits>
388inline basic_ostream<TChar, TCharTraits> &
operator<<(
389 basic_ostream<TChar, TCharTraits> &stream,
const pair<T1, T2> &value) {
391 stream << ::pretty_print::delimiters<pair<T1, T2>, TChar>::values.prefix;
393 stream << value.first;
396 stream << ::pretty_print::delimiters<pair<T1, T2>, TChar>::values.delimiter;
398 stream << value.second;
401 stream << ::pretty_print::delimiters<pair<T1, T2>, TChar>::values.postfix;
417template <
typename Tuple,
size_t N,
typename TChar,
typename TCharTraits>
419 static inline void print(::std::basic_ostream<TChar, TCharTraits> &stream,
420 const Tuple &value) {
424 stream << delimiters<tuple_dummy_pair, TChar>::values.delimiter;
426 stream << std::tr1::get<N - 1>(value);
430template <
typename Tuple,
typename TChar,
typename TCharTraits>
432 static inline void print(::std::basic_ostream<TChar, TCharTraits> &stream,
433 const Tuple &value) {
434 stream << ::std::tr1::get<0>(value);
445#define TUPLE_PARAMS \
446 typename T0, typename T1, typename T2, typename T3, typename T4, \
447 typename T5, typename T6, typename T7, typename T8, typename T9
448#define TUPLE_ARGS T0, T1, T2, T3, T4, T5, T6, T7, T8, T9
451template <
typename TChar,
typename TCharTraits, TUPLE_PARAMS>
452inline basic_ostream<TChar, TCharTraits> &
operator<<(
453 basic_ostream<TChar, TCharTraits> &stream,
454 const tr1::tuple<TUPLE_ARGS> &value) {
456 TChar>::values.prefix != NULL)
458 TChar>::values.prefix;
461 const tr1::tuple<TUPLE_ARGS> &,
462 tr1::tuple_size<tr1::tuple<TUPLE_ARGS>>::value,
464 TCharTraits>::print(stream, value);
467 TChar>::values.postfix != NULL)
469 TChar>::values.postfix;
490 const T *
const _array;
enable_if< has_const_iterator< T >::value, typenameT::const_iterator >::type begin(const T &c)
enable_if< has_const_iterator< T >::value, typenameT::const_iterator >::type end(const T &c)
std::pair< tuple_dummy_t, tuple_dummy_t > tuple_dummy_pair
const delimiters_values< char > delimiters< T, char >::values
basic_ostream< TChar, TCharTraits > & operator<<(basic_ostream< TChar, TCharTraits > &stream, const ::pretty_print::print_container_helper< T, TChar, TCharTraits, TDelimiters > &helper)
pretty_print::array_wrapper_n< T > pretty_print_array(const T *const a, size_t n)
std::basic_ostream< TChar, TCharTraits > & operator<<(std::basic_ostream< TChar, TCharTraits > &s, const pretty_print::custom_delims< Delims > &p)
array_wrapper_n(const T *const a, size_t n)
const_iterator end() const
const_iterator begin() const
virtual::std::wostream & stream(::std::wostream &)=0
virtual::std::ostream & stream(::std::ostream &)=0
virtual ~custom_delims_base()
::std::wostream & stream(::std::wostream &s)
custom_delims_wrapper(const T &t_)
::std::ostream & stream(::std::ostream &s)
custom_delims(const Container &c)
custom_delims_base * base
static const delimiters_values< char > values
static const delimiters_values< wchar_t > values
static const delimiters_values< char > values
static const delimiters_values< wchar_t > values
static const delimiters_values< char > values
static const delimiters_values< wchar_t > values
static const delimiters_values< char > values
static const delimiters_values< wchar_t > values
static const delimiters_values< char > values
static const delimiters_values< wchar_t > values
static const delimiters_values< wchar_t > values
static const delimiters_values< char > values
delimiters_values< TChar > type
TType::const_iterator iter
static bool const end_value
static char(& f(ChT< iter(Fallback::*)() const, &C::begin > *))[1]
conditional< has_const_iterator< T >::value, T, Dummy >::type TType
static char(& g(ChT< iter(Fallback::*)() const, &C::end > *))[1]
static bool const beg_value
static void print(::std::basic_ostream< TChar, TCharTraits > &stream, const Tuple &value)
static void print(::std::basic_ostream< TChar, TCharTraits > &stream, const Tuple &value)
TDelimiters delimiters_type
get_iterator< T >::iter TIter
std::basic_ostream< TChar, TCharTraits > ostream_type
void operator()(ostream_type &stream) const
print_container_helper(const T &container)