7
7
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8
8
//
9
9
#include < iosfwd>
10
- # include < array >
10
+
11
11
#include < string>
12
12
#include < sstream>
13
13
#include < stdexcept>
14
14
#include < tuple>
15
15
16
+ // containers
17
+ #include < array>
18
+ #include < vector>
19
+ #include < deque>
20
+ #include < list>
21
+ #include < forward_list>
22
+ #include < set>
23
+ #include < map>
24
+ #include < unordered_set>
25
+ #include < unordered_map>
26
+ #include < utility>
27
+
16
28
#include " v8pp/context.hpp"
17
29
#include " v8pp/convert.hpp"
18
30
#include " v8pp/utility.hpp"
19
31
20
- template <typename Char, typename Traits,
21
- typename T, typename Alloc, typename ...Other,
22
- template < typename , typename , typename ...> class Sequence >
23
- std::basic_ostream<Char, Traits>& operator <<( std::basic_ostream<Char, Traits>& os,
24
- Sequence<T, Alloc, Other... > const & sequence )
32
+ template <typename Sequence>
33
+ std::ostream& print_sequence (std::ostream& os, Sequence const & sequence, char const brackets[ 2 ]);
34
+
35
+ template < typename T, std::size_t N>
36
+ std::ostream& operator <<(std::ostream& os, std::array<T, N > const & array )
25
37
{
26
- os << ' [' ;
27
- bool first = true ;
28
- for (auto const & item : sequence)
29
- {
30
- if (!first) os << " , " ;
31
- os << item;
32
- first = false ;
33
- }
34
- os << ' ]' ;
35
- return os;
38
+ return print_sequence (os, array, " []" );
36
39
}
37
40
38
- template <typename Char, typename Traits, typename T, size_t N>
39
- std::basic_ostream<Char, Traits>& operator <<(std::basic_ostream<Char, Traits>& os,
40
- std::array<T, N> const & array)
41
+ template <typename Char, typename Traits, typename Alloc, typename = typename std::enable_if<!std::is_same<Char, char >::value>::type>
42
+ std::ostream& operator <<(std::ostream& os, std::basic_string<Char, Traits, Alloc> const & string)
41
43
{
42
- os << ' [' ;
43
- bool first = true ;
44
- for (auto const & item : array)
45
- {
46
- if (!first) os << " , " ;
47
- os << item;
48
- first = false ;
49
- }
50
- os << ' ]' ;
51
- return os;
44
+ return print_sequence (os, string, " ''" );
52
45
}
53
46
54
- template <typename Char, typename Traits,
55
- typename Key, typename Value, typename Less, typename Alloc, typename ...Other,
56
- template <typename , typename , typename , typename , typename ...> class Mapping >
57
- std::basic_ostream<Char, Traits>& operator <<(std::basic_ostream<Char, Traits>& os,
58
- Mapping<Key, Value, Less, Alloc, Other...> const & mapping)
47
+ template <typename T, typename Alloc>
48
+ std::ostream& operator <<(std::ostream& os, std::vector<T, Alloc> const & vector)
59
49
{
60
- os << ' {' ;
61
- bool first = true ;
62
- for (auto const & item : mapping)
63
- {
64
- if (!first) os << " , " ;
65
- os << item.first << " : " <<item.second ;
66
- first = false ;
67
- }
68
- os << ' }' ;
69
- return os;
50
+ return print_sequence (os, vector, " []" );
51
+ }
52
+
53
+ template <typename T, typename Alloc>
54
+ std::ostream& operator <<(std::ostream& os, std::list<T, Alloc> const & list)
55
+ {
56
+ return print_sequence (os, list, " []" );
57
+ }
58
+
59
+ template <typename T, typename Alloc>
60
+ std::ostream& operator <<(std::ostream& os, std::forward_list<T, Alloc> const & fwd_list)
61
+ {
62
+ return print_sequence (os, fwd_list, " []" );
63
+ }
64
+
65
+ template <typename T, typename Alloc>
66
+ std::ostream& operator <<(std::ostream& os, std::deque<T, Alloc> const & deque)
67
+ {
68
+ return print_sequence (os, deque, " []" );
70
69
}
71
70
72
- template <typename Char, typename Traits,
73
- typename Enum, typename = typename std::enable_if<std::is_enum<Enum>::value>::type>
74
- std::basic_ostream<Char, Traits>& operator <<(std::basic_ostream<Char, Traits>& os, Enum value)
71
+ template <typename Key, typename Comp, typename Alloc>
72
+ std::ostream& operator <<(std::ostream& os, std::set<Key, Comp, Alloc> const & set)
73
+ {
74
+ return print_sequence (os, set, " []" );
75
+ }
76
+
77
+ template <typename Key, typename Comp, typename Alloc>
78
+ std::ostream& operator <<(std::ostream& os, std::multiset<Key, Comp, Alloc> const & multiset)
79
+ {
80
+ return print_sequence (os, multiset, " []" );
81
+ }
82
+
83
+ template <typename Key, typename Value, typename Comp, typename Alloc>
84
+ std::ostream& operator <<(std::ostream& os, std::map<Key, Value, Comp, Alloc> const & map)
85
+ {
86
+ return print_sequence (os, map, " {}" );
87
+ }
88
+
89
+ template <typename Key, typename Value, typename Comp, typename Alloc>
90
+ std::ostream& operator <<(std::ostream& os, std::multimap<Key, Value, Comp, Alloc> const & multimap)
91
+ {
92
+ return print_sequence (os, multimap, " {}" );
93
+ }
94
+
95
+ template <typename Key, typename Hash, typename Eq, typename Alloc>
96
+ std::ostream& operator <<(std::ostream& os, std::unordered_set<Key, Hash, Eq, Alloc> const & unordered_set)
97
+ {
98
+ return print_sequence (os, unordered_set, " []" );
99
+ }
100
+
101
+ template <typename Key, typename Hash, typename Eq, typename Alloc>
102
+ std::ostream& operator <<(std::ostream& os, std::unordered_multiset<Key, Hash, Eq, Alloc> const & unordered_multiset)
103
+ {
104
+ return print_sequence (os, unordered_multiset, " []" );
105
+ }
106
+
107
+ template <typename Key, typename T, typename Hash, typename Eq, typename Alloc>
108
+ std::ostream& operator <<(std::ostream& os, std::unordered_map<Key, T, Hash, Eq, Alloc> const & unordered_map)
109
+ {
110
+ return print_sequence (os, unordered_map, " {}" );
111
+ }
112
+
113
+ template <typename Key, typename T, typename Hash, typename Eq, typename Alloc>
114
+ std::ostream& operator <<(std::ostream& os, std::unordered_multimap<Key, T, Hash, Eq, Alloc> const & unordered_multimap)
115
+ {
116
+ return print_sequence (os, unordered_multimap, " {}" );
117
+ }
118
+
119
+ template <typename First, typename Second>
120
+ std::ostream& operator <<(std::ostream& os, std::pair<First, Second> const & pair)
121
+ {
122
+ return os << pair.first << " : " << pair.second ;
123
+ }
124
+
125
+ template <typename Enum, typename = typename std::enable_if<std::is_enum<Enum>::value>::type>
126
+ std::ostream& operator <<(std::ostream& os, Enum value)
75
127
{
76
128
return os << static_cast <typename std::underlying_type<Enum>::type>(value);
77
129
}
@@ -87,9 +139,24 @@ template<typename Char, typename Traits, typename... Ts>
87
139
std::basic_ostream<Char, Traits>& operator <<(std::basic_ostream<Char, Traits>& os,
88
140
std::tuple<Ts...> const & tuple)
89
141
{
90
- os << ' { ' ;
142
+ os << ' ( ' ;
91
143
print_tuple (os, tuple, std::index_sequence_for<Ts...>{});
92
- os << ' }' ;
144
+ os << ' )' ;
145
+ return os;
146
+ }
147
+
148
+ template <typename Sequence>
149
+ std::ostream& print_sequence (std::ostream& os, Sequence const & sequence, char const brackets[2 ])
150
+ {
151
+ os << brackets[0 ];
152
+ bool first = true ;
153
+ for (auto const & item : sequence)
154
+ {
155
+ if (!first) os << " , " ;
156
+ os << item;
157
+ first = false ;
158
+ }
159
+ os << brackets[1 ];
93
160
return os;
94
161
}
95
162
0 commit comments