Added 'as' support for std::deque.

This commit is contained in:
Takatoshi Kondo
2015-08-03 17:57:46 +09:00
parent 3dc0e83513
commit 78b3e8adad
2 changed files with 32 additions and 0 deletions

View File

@@ -32,6 +32,27 @@ MSGPACK_API_VERSION_NAMESPACE(v1) {
namespace adaptor { namespace adaptor {
#if !defined(MSGPACK_USE_CPP03)
template <typename T, typename Alloc>
struct as<std::deque<T, Alloc>, typename std::enable_if<msgpack::has_as<T>::value>::type> {
std::deque<T, Alloc> operator()(const msgpack::object& o) const {
if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
std::deque<T, Alloc> v;
if (o.via.array.size > 0) {
msgpack::object* p = o.via.array.ptr;
msgpack::object* const pend = o.via.array.ptr + o.via.array.size;
do {
v.push_back(p->as<T>());
++p;
} while (p < pend);
}
return v;
}
};
#endif // !defined(MSGPACK_USE_CPP03)
template <typename T, typename Alloc> template <typename T, typename Alloc>
struct convert<std::deque<T, Alloc> > { struct convert<std::deque<T, Alloc> > {
msgpack::object const& operator()(msgpack::object const& o, std::deque<T, Alloc>& v) const { msgpack::object const& operator()(msgpack::object const& o, std::deque<T, Alloc>& v) const {

View File

@@ -433,6 +433,17 @@ TEST(MSGPACK_NO_DEF_CON_MULTIMAP, simple_buffer)
EXPECT_EQ(val1, val2); EXPECT_EQ(val1, val2);
} }
TEST(MSGPACK_NO_DEF_CON_DEQUE, simple_buffer)
{
std::deque<no_def_con> val1 { 1, 2, 3 };
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, val1);
msgpack::unpacked ret;
msgpack::unpack(ret, sbuf.data(), sbuf.size());
std::deque<no_def_con> val2 = ret.get().as<std::deque<no_def_con>>();
EXPECT_EQ(val1, val2);
}
TEST(MSGPACK_NO_DEF_CON_PAIR, simple_buffer) TEST(MSGPACK_NO_DEF_CON_PAIR, simple_buffer)
{ {
std::pair<no_def_con, no_def_con_composite> val1 {1, 2}; std::pair<no_def_con, no_def_con_composite> val1 {1, 2};