diff --git a/include/msgpack/adaptor/map.hpp b/include/msgpack/adaptor/map.hpp index b0f39fa17..50896ec24 100644 --- a/include/msgpack/adaptor/map.hpp +++ b/include/msgpack/adaptor/map.hpp @@ -72,14 +72,16 @@ struct convert > { msgpack::object const& operator()(msgpack::object const& o, type::assoc_vector& v) const { if (o.type != msgpack::type::MAP) { throw msgpack::type_error(); } v.resize(o.via.map.size); - msgpack::object_kv* p = o.via.map.ptr; - msgpack::object_kv* const pend = o.via.map.ptr + o.via.map.size; - std::pair* it(&v.front()); - for (; p < pend; ++p, ++it) { - p->key.convert(it->first); - p->val.convert(it->second); + if (o.via.map.size != 0) { + msgpack::object_kv* p = o.via.map.ptr; + msgpack::object_kv* const pend = o.via.map.ptr + o.via.map.size; + std::pair* it(&v.front()); + for (; p < pend; ++p, ++it) { + p->key.convert(it->first); + p->val.convert(it->second); + } + std::sort(v.begin(), v.end(), type::detail::pair_first_less()); } - std::sort(v.begin(), v.end(), type::detail::pair_first_less()); return o; } }; @@ -194,14 +196,22 @@ struct object_with_zone > { } else { uint32_t size = checked_get_container_size(v.size()); + msgpack::object_kv* p = static_cast(o.zone.allocate_align(sizeof(msgpack::object_kv)*size)); msgpack::object_kv* const pend = p + size; o.via.map.ptr = p; o.via.map.size = size; typename std::map::const_iterator it(v.begin()); do { +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) p->key = msgpack::object(it->first, o.zone); p->val = msgpack::object(it->second, o.zone); +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) ++p; ++it; } while(p < pend); diff --git a/include/msgpack/adaptor/vector_char.hpp b/include/msgpack/adaptor/vector_char.hpp index ce1ca23d7..6efa96683 100644 --- a/include/msgpack/adaptor/vector_char.hpp +++ b/include/msgpack/adaptor/vector_char.hpp @@ -30,11 +30,29 @@ struct convert > { switch (o.type) { case msgpack::type::BIN: v.resize(o.via.bin.size); - std::memcpy(&v.front(), o.via.bin.ptr, o.via.bin.size); + if (o.via.bin.size != 0) { +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) + std::memcpy(&v.front(), o.via.bin.ptr, o.via.bin.size); +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) + } break; case msgpack::type::STR: v.resize(o.via.str.size); - std::memcpy(&v.front(), o.via.str.ptr, o.via.str.size); + if (o.via.str.size != 0) { +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) + std::memcpy(&v.front(), o.via.str.ptr, o.via.str.size); +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) + } break; default: throw msgpack::type_error(); @@ -50,7 +68,9 @@ struct pack > { msgpack::packer& operator()(msgpack::packer& o, const std::vector& v) const { uint32_t size = checked_get_container_size(v.size()); o.pack_bin(size); - o.pack_bin_body(&v.front(), size); + if (size != 0) { + o.pack_bin_body(&v.front(), size); + } return o; } @@ -61,7 +81,9 @@ struct object > { void operator()(msgpack::object& o, const std::vector& v) const { uint32_t size = checked_get_container_size(v.size()); o.type = msgpack::type::BIN; - o.via.bin.ptr = &v.front(); + if (size != 0) { + o.via.bin.ptr = &v.front(); + } o.via.bin.size = size; } }; @@ -71,10 +93,12 @@ struct object_with_zone > { void operator()(msgpack::object::with_zone& o, const std::vector& v) const { uint32_t size = checked_get_container_size(v.size()); o.type = msgpack::type::BIN; - char* ptr = static_cast(o.zone.allocate_align(size)); - o.via.bin.ptr = ptr; o.via.bin.size = size; - std::memcpy(ptr, &v.front(), size); + if (size != 0) { + char* ptr = static_cast(o.zone.allocate_align(size)); + o.via.bin.ptr = ptr; + std::memcpy(ptr, &v.front(), size); + } } }; diff --git a/include/msgpack/adaptor/vector_unsigned_char.hpp b/include/msgpack/adaptor/vector_unsigned_char.hpp index 822aa095c..e0f48b7d2 100644 --- a/include/msgpack/adaptor/vector_unsigned_char.hpp +++ b/include/msgpack/adaptor/vector_unsigned_char.hpp @@ -30,11 +30,29 @@ struct convert > { switch (o.type) { case msgpack::type::BIN: v.resize(o.via.bin.size); - std::memcpy(&v.front(), o.via.bin.ptr, o.via.bin.size); + if (o.via.bin.size != 0) { +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) + std::memcpy(&v.front(), o.via.bin.ptr, o.via.bin.size); +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) + } break; case msgpack::type::STR: v.resize(o.via.str.size); - std::memcpy(&v.front(), o.via.str.ptr, o.via.str.size); + if (o.via.str.size != 0) { +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wmaybe-uninitialized" +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) + std::memcpy(&v.front(), o.via.str.ptr, o.via.str.size); +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) + } break; default: throw msgpack::type_error(); @@ -50,7 +68,9 @@ struct pack > { msgpack::packer& operator()(msgpack::packer& o, const std::vector& v) const { uint32_t size = checked_get_container_size(v.size()); o.pack_bin(size); - o.pack_bin_body(reinterpret_cast(&v.front()), size); + if (size != 0) { + o.pack_bin_body(reinterpret_cast(&v.front()), size); + } return o; } @@ -61,7 +81,9 @@ struct object > { void operator()(msgpack::object& o, const std::vector& v) const { uint32_t size = checked_get_container_size(v.size()); o.type = msgpack::type::BIN; - o.via.bin.ptr = reinterpret_cast(&v.front()); + if (size != 0) { + o.via.bin.ptr = reinterpret_cast(&v.front()); + } o.via.bin.size = size; } }; @@ -71,10 +93,12 @@ struct object_with_zone > { void operator()(msgpack::object::with_zone& o, const std::vector& v) const { uint32_t size = checked_get_container_size(v.size()); o.type = msgpack::type::BIN; - char* ptr = static_cast(o.zone.allocate_align(size)); - o.via.bin.ptr = ptr; o.via.bin.size = size; - std::memcpy(ptr, &v.front(), size); + if (size != 0) { + char* ptr = static_cast(o.zone.allocate_align(size)); + o.via.bin.ptr = ptr; + std::memcpy(ptr, &v.front(), size); + } } }; diff --git a/test/msgpack_container.cpp b/test/msgpack_container.cpp index 03e8ac92f..03a8cce0b 100644 --- a/test/msgpack_container.cpp +++ b/test/msgpack_container.cpp @@ -54,6 +54,20 @@ TEST(MSGPACK_STL, simple_buffer_vector) } } +TEST(MSGPACK_STL, simple_buffer_vector_empty) +{ + typedef vector > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + EXPECT_EQ(ret.get().type, msgpack::type::ARRAY); + type const& val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + TEST(MSGPACK_STL, simple_buffer_vector_char) { typedef vector > type; @@ -72,6 +86,20 @@ TEST(MSGPACK_STL, simple_buffer_vector_char) } } +TEST(MSGPACK_STL, simple_buffer_vector_char_empty) +{ + typedef vector > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + EXPECT_EQ(ret.get().type, msgpack::type::BIN); + type const& val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + TEST(MSGPACK_STL, simple_buffer_vector_unsigned_char) { typedef vector > type; @@ -90,6 +118,20 @@ TEST(MSGPACK_STL, simple_buffer_vector_unsigned_char) } } +TEST(MSGPACK_STL, simple_buffer_vector_unsigned_char_empty) +{ + typedef vector > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + EXPECT_EQ(ret.get().type, msgpack::type::BIN); + type const& val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + TEST(MSGPACK_STL, simple_buffer_vector_uint8_t) { if (!msgpack::is_same::value) return; @@ -109,6 +151,21 @@ TEST(MSGPACK_STL, simple_buffer_vector_uint8_t) } } +TEST(MSGPACK_STL, simple_buffer_vector_uint8_t_empty) +{ + if (!msgpack::is_same::value) return; + typedef vector > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + EXPECT_EQ(ret.get().type, msgpack::type::BIN); + type const& val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + TEST(MSGPACK_STL, simple_buffer_vector_bool) { typedef vector > type; @@ -125,6 +182,20 @@ TEST(MSGPACK_STL, simple_buffer_vector_bool) EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); } +TEST(MSGPACK_STL, simple_buffer_vector_bool_empty) +{ + typedef vector > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + EXPECT_EQ(ret.get().type, msgpack::type::ARRAY); + type const& val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + TEST(MSGPACK_STL, simple_buffer_assoc_vector) { @@ -144,6 +215,19 @@ TEST(MSGPACK_STL, simple_buffer_assoc_vector) } } +TEST(MSGPACK_STL, simple_buffer_assoc_vector_empty) +{ + typedef msgpack::type::assoc_vector, test::allocator > >type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type const& val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + TEST(MSGPACK_STL, simple_buffer_map) { typedef map, test::allocator > > type; @@ -161,6 +245,19 @@ TEST(MSGPACK_STL, simple_buffer_map) } } +TEST(MSGPACK_STL, simple_buffer_map_empty) +{ + typedef map, test::allocator > > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type const& val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + TEST(MSGPACK_STL, simple_buffer_deque) { typedef deque > type; @@ -178,6 +275,19 @@ TEST(MSGPACK_STL, simple_buffer_deque) } } +TEST(MSGPACK_STL, simple_buffer_deque_empty) +{ + typedef deque > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type const& val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + TEST(MSGPACK_STL, simple_buffer_list) { typedef list > type; @@ -195,6 +305,19 @@ TEST(MSGPACK_STL, simple_buffer_list) } } +TEST(MSGPACK_STL, simple_buffer_list_empty) +{ + typedef list > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type const& val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + TEST(MSGPACK_STL, simple_buffer_set) { typedef set, test::allocator > type; @@ -212,6 +335,19 @@ TEST(MSGPACK_STL, simple_buffer_set) } } +TEST(MSGPACK_STL, simple_buffer_set_empty) +{ + typedef set, test::allocator > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + TEST(MSGPACK_STL, simple_buffer_pair) { for (unsigned int k = 0; k < kLoop; k++) { @@ -256,6 +392,18 @@ TEST(MSGPACK_STL, simple_buffer_multimap) } } +TEST(MSGPACK_STL, simple_buffer_multimap_empty) +{ + typedef multimap, test::allocator > > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); +} + TEST(MSGPACK_STL, simple_buffer_multiset) { typedef multiset, test::allocator > type; @@ -283,6 +431,18 @@ TEST(MSGPACK_STL, simple_buffer_multiset) } } +TEST(MSGPACK_STL, simple_buffer_multiset_empty) +{ + typedef multiset, test::allocator > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); +} + TEST(MSGPACK_TUPLE, simple_tuple) { msgpack::sbuffer sbuf; @@ -350,6 +510,18 @@ TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_map) } } +TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_map_empty) +{ + typedef tr1::unordered_map, test::equal_to, test::allocator > > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); +} + TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_multimap) { typedef tr1::unordered_multimap, test::equal_to, test::allocator > > type; @@ -379,6 +551,19 @@ TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_multimap) EXPECT_TRUE(v1 == v2); } } + +TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_multimap_empty) +{ + typedef tr1::unordered_multimap, test::equal_to, test::allocator > > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); +} + #endif #ifdef MSGPACK_HAS_STD_TR1_UNORDERED_SET @@ -403,6 +588,18 @@ TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_set) } } +TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_set_empty) +{ + typedef tr1::unordered_set, test::equal_to, test::allocator > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); +} + TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_multiset) { typedef tr1::unordered_multiset, test::equal_to, test::allocator > type; @@ -429,6 +626,19 @@ TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_multiset) EXPECT_TRUE(v1 == v2); } } + +TEST(MSGPACK_TR1, simple_buffer_tr1_unordered_multiset_empty) +{ + typedef tr1::unordered_multiset, test::equal_to, test::allocator > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); +} + #endif #if defined (MSGPACK_HAS_STD_UNORDERED_MAP) || defined (MSGPACK_HAS_STD_UNORDERED_SET) @@ -469,6 +679,18 @@ TEST(MSGPACK_TR1, simple_buffer_unordered_map) } } +TEST(MSGPACK_TR1, simple_buffer_unordered_map_empty) +{ + typedef unordered_map, test::equal_to, test::allocator > > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); +} + TEST(MSGPACK_TR1, simple_buffer_unordered_multimap) { typedef unordered_multimap, test::equal_to, test::allocator > > type; @@ -498,6 +720,19 @@ TEST(MSGPACK_TR1, simple_buffer_unordered_multimap) EXPECT_TRUE(v1 == v2); } } + +TEST(MSGPACK_TR1, simple_buffer_unordered_multimap_empty) +{ + typedef unordered_multimap, test::equal_to, test::allocator > > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); +} + #endif #ifdef MSGPACK_HAS_STD_UNORDERED_SET @@ -523,6 +758,18 @@ TEST(MSGPACK_TR1, simple_buffer_unordered_set) } } +TEST(MSGPACK_TR1, simple_buffer_unordered_set_empty) +{ + typedef unordered_set, test::equal_to, test::allocator > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); +} + TEST(MSGPACK_TR1, simple_buffer_unordered_multiset) { typedef unordered_multiset, test::equal_to, test::allocator > type; @@ -549,4 +796,17 @@ TEST(MSGPACK_TR1, simple_buffer_unordered_multiset) EXPECT_TRUE(v1 == v2); } } + +TEST(MSGPACK_TR1, simple_buffer_unordered_multiset_empty) +{ + typedef unordered_multiset, test::equal_to, test::allocator > type; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1.size(), val2.size()); +} + #endif diff --git a/test/msgpack_cpp11.cpp b/test/msgpack_cpp11.cpp index 79aab9511..9066408c7 100644 --- a/test/msgpack_cpp11.cpp +++ b/test/msgpack_cpp11.cpp @@ -76,6 +76,19 @@ TEST(MSGPACK_CPP11, simple_array) } } +TEST(MSGPACK_CPP11, simple_array_empty) +{ + array val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + EXPECT_EQ(ret.get().type, msgpack::type::ARRAY); + array val2 = ret.get().as >(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + TEST(MSGPACK_CPP11, simple_buffer_array_char) { for (unsigned int k = 0; k < kLoop; k++) { @@ -93,6 +106,19 @@ TEST(MSGPACK_CPP11, simple_buffer_array_char) } } +TEST(MSGPACK_CPP11, simple_buffer_array_char_empty) +{ + array val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + EXPECT_EQ(ret.get().type, msgpack::type::BIN); + array val2 = ret.get().as >(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + TEST(MSGPACK_CPP11, simple_buffer_array_unsigned_char) { if (!msgpack::is_same::value) return; @@ -111,6 +137,20 @@ TEST(MSGPACK_CPP11, simple_buffer_array_unsigned_char) } } +TEST(MSGPACK_CPP11, simple_buffer_array_unsigned_char_empty) +{ + if (!msgpack::is_same::value) return; + array val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + EXPECT_EQ(ret.get().type, msgpack::type::BIN); + array val2 = ret.get().as >(); + EXPECT_EQ(val1.size(), val2.size()); + EXPECT_TRUE(equal(val1.begin(), val1.end(), val2.begin())); +} + // strong typedefs namespace test { @@ -158,6 +198,18 @@ TEST(MSGPACK_STL, simple_buffer_forward_list) } } +TEST(MSGPACK_STL, simple_buffer_forward_list_empty) +{ + using type = forward_list>; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1, val2); +} + TEST(MSGPACK_STL, simple_buffer_unordered_map) { using type = unordered_map, test::equal_to, test::map_allocator>; @@ -174,6 +226,18 @@ TEST(MSGPACK_STL, simple_buffer_unordered_map) } } +TEST(MSGPACK_STL, simple_buffer_unordered_map_empty) +{ + using type = unordered_map, test::equal_to, test::map_allocator>; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1, val2); +} + TEST(MSGPACK_STL, simple_buffer_unordered_multimap) { using type = unordered_multimap, test::equal_to, test::map_allocator>; @@ -194,6 +258,19 @@ TEST(MSGPACK_STL, simple_buffer_unordered_multimap) } } +TEST(MSGPACK_STL, simple_buffer_unordered_multimap_empty) +{ + using type = unordered_multimap, test::equal_to, test::map_allocator>; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + + EXPECT_EQ(val1, val2); +} + TEST(MSGPACK_STL, simple_buffer_unordered_set) { using type = unordered_set, test::equal_to, test::set_allocator>; @@ -210,6 +287,18 @@ TEST(MSGPACK_STL, simple_buffer_unordered_set) } } +TEST(MSGPACK_STL, simple_buffer_unordered_set_empty) +{ + using type = unordered_set, test::equal_to, test::set_allocator>; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1, val2); +} + TEST(MSGPACK_STL, simple_buffer_unordered_multiset) { using type = unordered_multiset, test::equal_to, test::set_allocator>; @@ -226,6 +315,18 @@ TEST(MSGPACK_STL, simple_buffer_unordered_multiset) } } +TEST(MSGPACK_STL, simple_buffer_unordered_multiset_empty) +{ + using type = unordered_multiset, test::equal_to, test::set_allocator>; + type val1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, val1); + msgpack::unpacked ret; + msgpack::unpack(ret, sbuf.data(), sbuf.size()); + type val2 = ret.get().as(); + EXPECT_EQ(val1, val2); +} + TEST(MSGPACK_USER_DEFINED, simple_buffer_enum_class_member) { TestEnumClassMemberClass val1;