Skip to content

Commit ce98964

Browse files
committed
Merge pull request #262 from redboltz/fix_issue_249
Fix issue 249
2 parents 6ec0905 + 07a509a commit ce98964

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

80 files changed

+5595
-10938
lines changed

CMakeLists.txt

Lines changed: 1 addition & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -98,65 +98,38 @@ LIST (APPEND msgpack_HEADERS
9898
IF (MSGPACK_ENABLE_CXX)
9999
LIST (APPEND msgpack_HEADERS
100100
include/msgpack.hpp
101-
include/msgpack_fwd.hpp
101+
include/msgpack/adaptor/adaptor_base.hpp
102102
include/msgpack/adaptor/bool.hpp
103-
include/msgpack/adaptor/bool_fwd.hpp
104103
include/msgpack/adaptor/char_ptr.hpp
105-
include/msgpack/adaptor/char_ptr_fwd.hpp
106104
include/msgpack/adaptor/check_container_size.hpp
107105
include/msgpack/adaptor/cpp11/array.hpp
108-
include/msgpack/adaptor/cpp11/array_fwd.hpp
109106
include/msgpack/adaptor/cpp11/array_char.hpp
110-
include/msgpack/adaptor/cpp11/array_char_fwd.hpp
111107
include/msgpack/adaptor/cpp11/forward_list.hpp
112-
include/msgpack/adaptor/cpp11/forward_list_fwd.hpp
113108
include/msgpack/adaptor/cpp11/tuple.hpp
114-
include/msgpack/adaptor/cpp11/tuple_fwd.hpp
115109
include/msgpack/adaptor/cpp11/unordered_map.hpp
116-
include/msgpack/adaptor/cpp11/unordered_map_fwd.hpp
117110
include/msgpack/adaptor/cpp11/unordered_set.hpp
118-
include/msgpack/adaptor/cpp11/unordered_set_fwd.hpp
119111
include/msgpack/adaptor/define.hpp
120112
include/msgpack/adaptor/deque.hpp
121-
include/msgpack/adaptor/deque_fwd.hpp
122113
include/msgpack/adaptor/detail/cpp03_define.hpp
123114
include/msgpack/adaptor/detail/cpp03_msgpack_tuple.hpp
124-
include/msgpack/adaptor/detail/cpp03_msgpack_tuple_fwd.hpp
125115
include/msgpack/adaptor/detail/cpp11_define.hpp
126116
include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp
127-
include/msgpack/adaptor/detail/cpp11_msgpack_tuple_fwd.hpp
128117
include/msgpack/adaptor/fixint.hpp
129-
include/msgpack/adaptor/fixint_fwd.hpp
130118
include/msgpack/adaptor/float.hpp
131-
include/msgpack/adaptor/float_fwd.hpp
132119
include/msgpack/adaptor/int.hpp
133-
include/msgpack/adaptor/int_fwd.hpp
134120
include/msgpack/adaptor/list.hpp
135-
include/msgpack/adaptor/list_fwd.hpp
136121
include/msgpack/adaptor/map.hpp
137-
include/msgpack/adaptor/map_fwd.hpp
138122
include/msgpack/adaptor/msgpack_tuple.hpp
139-
include/msgpack/adaptor/msgpack_tuple_fwd.hpp
140123
include/msgpack/adaptor/nil.hpp
141-
include/msgpack/adaptor/nil_fwd.hpp
142124
include/msgpack/adaptor/pair.hpp
143-
include/msgpack/adaptor/pair_fwd.hpp
144125
include/msgpack/adaptor/raw.hpp
145-
include/msgpack/adaptor/raw_fwd.hpp
146126
include/msgpack/adaptor/set.hpp
147-
include/msgpack/adaptor/set_fwd.hpp
148127
include/msgpack/adaptor/string.hpp
149-
include/msgpack/adaptor/string_fwd.hpp
150128
include/msgpack/adaptor/tr1/unordered_map.hpp
151-
include/msgpack/adaptor/tr1/unordered_map_fwd.hpp
152129
include/msgpack/adaptor/tr1/unordered_set.hpp
153-
include/msgpack/adaptor/tr1/unordered_set_fwd.hpp
154130
include/msgpack/adaptor/vector.hpp
155-
include/msgpack/adaptor/vector_fwd.hpp
156131
include/msgpack/adaptor/vector_bool.hpp
157-
include/msgpack/adaptor/vector_bool_fwd.hpp
158132
include/msgpack/adaptor/vector_char.hpp
159-
include/msgpack/adaptor/vector_char_fwd.hpp
160133
include/msgpack/cpp_config.hpp
161134
include/msgpack/detail/cpp03_zone.hpp
162135
include/msgpack/detail/cpp11_zone.hpp

erb/cpp03_define.hpp.erb

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
#define MSGPACK_CPP03_DEFINE_HPP
2020

2121
#include "msgpack/versioning.hpp"
22-
#include "msgpack/adaptor/msgpack_tuple_fwd.hpp"
23-
#include "msgpack/adaptor/int_fwd.hpp"
22+
#include "msgpack/adaptor/msgpack_tuple.hpp"
23+
#include "msgpack/adaptor/adaptor_base.hpp"
2424
#include "msgpack/object_fwd.hpp"
2525

2626
#define MSGPACK_DEFINE(...) \
@@ -40,32 +40,39 @@
4040
}
4141

4242
// MSGPACK_ADD_ENUM must be used in the global namespace.
43-
#define MSGPACK_ADD_ENUM(enum) \
43+
#define MSGPACK_ADD_ENUM(enum_name) \
4444
namespace msgpack { \
4545
MSGPACK_API_VERSION_NAMESPACE(v1) { \
46-
inline msgpack::object const& operator>> (msgpack::object const& o, enum& v) \
47-
{ \
48-
int tmp; \
49-
o >> tmp; \
50-
v = static_cast<enum>(tmp); \
51-
return o; \
52-
} \
53-
inline void operator<< (msgpack::object& o, const enum& v) \
54-
{ \
55-
o << static_cast<int>(v); \
56-
} \
57-
inline void operator<< (msgpack::object::with_zone& o, const enum& v) \
58-
{ \
59-
o << static_cast<int>(v); \
60-
} \
61-
namespace detail { \
46+
namespace adaptor { \
47+
template<> \
48+
struct convert<enum_name> { \
49+
msgpack::object const& operator()(msgpack::object const& o, enum_name& v) const {\
50+
int tmp; \
51+
o >> tmp; \
52+
v = static_cast<enum_name>(tmp); \
53+
return o; \
54+
} \
55+
}; \
56+
template<> \
57+
struct object<enum_name> { \
58+
void operator()(msgpack::object& o, const enum_name& v) const {\
59+
o << static_cast<int>(v); \
60+
} \
61+
}; \
62+
template<> \
63+
struct object_with_zone<enum_name> { \
64+
void operator()(msgpack::object::with_zone& o, const enum_name& v) const { \
65+
o << static_cast<int>(v); \
66+
} \
67+
}; \
68+
template<> \
69+
struct pack<enum_name> { \
6270
template <typename Stream> \
63-
struct packer_serializer<Stream, enum> { \
64-
static msgpack::packer<Stream>& pack(msgpack::packer<Stream>& o, const enum& v) { \
65-
return o << static_cast<int>(v); \
66-
} \
67-
}; \
68-
} \
71+
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const enum_name& v) const { \
72+
return o << static_cast<int>(v); \
73+
} \
74+
}; \
75+
} \
6976
} \
7077
}
7178

erb/cpp03_msgpack_tuple.hpp.erb

Lines changed: 67 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020

2121
#include "msgpack/versioning.hpp"
2222
#include "msgpack/object.hpp"
23+
#include "msgpack/adaptor/adaptor_base.hpp"
2324

2425
namespace msgpack {
2526

@@ -31,7 +32,7 @@ namespace type {
3132
// FIXME operator!=
3233
<% GENERATION_LIMIT = 31 %>
3334

34-
template <typename A0<%1.upto(GENERATION_LIMIT+1) {|i|%>, typename A<%=i%><%}%>>
35+
template <typename A0 = void<%1.upto(GENERATION_LIMIT+1) {|i|%>, typename A<%=i%> = void<%}%>>
3536
struct tuple;
3637

3738
template <typename Tuple, int N>
@@ -136,81 +137,90 @@ inline tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> make_tuple(typename tuple_type<
136137

137138
} // namespace type
138139

139-
inline msgpack::object const& operator>> (
140+
namespace adaptor {
141+
142+
template <>
143+
struct convert<type::tuple<> > {
144+
msgpack::object const& operator()(
140145
msgpack::object const& o,
141-
type::tuple<>&) {
142-
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
143-
return o;
144-
}
146+
type::tuple<>&) const {
147+
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
148+
return o;
149+
}
150+
};
151+
145152
<%0.upto(GENERATION_LIMIT) {|i|%>
146153
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
147-
inline msgpack::object const& operator>> (
154+
struct convert<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > {
155+
msgpack::object const& operator()(
148156
msgpack::object const& o,
149-
type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) {
150-
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
151-
if(o.via.array.size < <%=i+1%>) { throw msgpack::type_error(); }
152-
<%0.upto(i) {|j|%>
153-
o.via.array.ptr[<%=j%>].convert<typename type::tuple_type<A<%=j%>>::type>(v.template get<<%=j%>>());<%}%>
154-
return o;
155-
}
157+
type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const {
158+
if(o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
159+
if(o.via.array.size < <%=i+1%>) { throw msgpack::type_error(); }
160+
<%0.upto(i) {|j|%>
161+
// In order to avoid clang++'s invalid warning, msgpack::object:: has been added.
162+
o.via.array.ptr[<%=j%>].msgpack::object::convert<typename type::tuple_type<A<%=j%>>::type>(v.template get<<%=j%>>());<%}%>
163+
return o;
164+
}
165+
};
156166
<%}%>
157167

158-
template <typename Stream>
159-
inline const msgpack::packer<Stream>& operator<< (
168+
template <>
169+
struct pack<type::tuple<> > {
170+
template <typename Stream>
171+
msgpack::packer<Stream>& operator()(
160172
msgpack::packer<Stream>& o,
161-
const type::tuple<>&) {
162-
o.pack_array(0);
163-
return o;
164-
}
173+
const type::tuple<>&) const {
174+
o.pack_array(0);
175+
return o;
176+
}
177+
};
178+
165179
<%0.upto(GENERATION_LIMIT) {|i|%>
166-
template <typename Stream, typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
167-
inline const msgpack::packer<Stream>& operator<< (
180+
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
181+
struct pack<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > {
182+
template <typename Stream>
183+
msgpack::packer<Stream>& operator()(
168184
msgpack::packer<Stream>& o,
169-
const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) {
170-
o.pack_array(<%=i+1%>);
171-
<%0.upto(i) {|j|%>
172-
o.pack(v.template get<<%=j%>>());<%}%>
173-
return o;
174-
}
185+
const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const {
186+
o.pack_array(<%=i+1%>);
187+
<%0.upto(i) {|j|%>
188+
o.pack(v.template get<<%=j%>>());<%}%>
189+
return o;
190+
}
191+
};
175192
<%}%>
176193

177-
inline void operator<< (
194+
template <>
195+
struct object_with_zone<type::tuple<> > {
196+
void operator()(
178197
msgpack::object::with_zone& o,
179-
const type::tuple<>&) {
180-
o.type = msgpack::type::ARRAY;
181-
o.via.array.ptr = nullptr;
182-
o.via.array.size = 0;
183-
}
198+
const type::tuple<>&) const {
199+
o.type = msgpack::type::ARRAY;
200+
o.via.array.ptr = nullptr;
201+
o.via.array.size = 0;
202+
}
203+
};
204+
184205
<%0.upto(GENERATION_LIMIT) {|i|%>
185206
template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
186-
inline void operator<< (
207+
struct object_with_zone<type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>> > {
208+
void operator()(
187209
msgpack::object::with_zone& o,
188-
const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) {
189-
o.type = msgpack::type::ARRAY;
190-
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*<%=i+1%>));
191-
o.via.array.size = <%=i+1%>;
192-
<%0.upto(i) {|j|%>
193-
o.via.array.ptr[<%=j%>] = msgpack::object(v.template get<<%=j%>>(), o.zone);<%}%>
194-
}
210+
const type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) const {
211+
o.type = msgpack::type::ARRAY;
212+
o.via.array.ptr = static_cast<msgpack::object*>(o.zone.allocate_align(sizeof(msgpack::object)*<%=i+1%>));
213+
o.via.array.size = <%=i+1%>;
214+
<%0.upto(i) {|j|%>
215+
o.via.array.ptr[<%=j%>] = msgpack::object(v.template get<<%=j%>>(), o.zone);<%}%>
216+
}
217+
};
195218
<%}%>
196219

220+
} // namespace adaptor
221+
197222
} // MSGPACK_API_VERSION_NAMESPACE(v1)
198223

199224
} // namespace msgpack
200225

201-
202-
//inline std::ostream& operator<< (std::ostream& o, const msgpack::type::tuple<>& v) {
203-
// return o << "[]";
204-
//}
205-
//<%0.upto(GENERATION_LIMIT) {|i|%>
206-
//template <typename A0<%1.upto(i) {|j|%>, typename A<%=j%><%}%>>
207-
//inline std::ostream& operator<< (std::ostream& o,
208-
// const msgpack::type::tuple<A0<%1.upto(i) {|j|%>, A<%=j%><%}%>>& v) {
209-
// return o << "["
210-
// <%0.upto(i) {|j|%>
211-
// <<<%if j != 0 then%> ", " <<<%end%> v.template get<<%=j%>>()<%}%>
212-
// << "]";
213-
//}
214-
//<%}%>
215-
216226
#endif // MSGPACK_CPP03_MSGPACK_TUPLE_HPP

0 commit comments

Comments
 (0)