From 3f4ffb9386cb4970e13911c8c63d9a6e0fbb25db Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Sat, 20 Feb 2016 18:50:13 +0900 Subject: [PATCH 01/10] Backported #423 to version 1.4.0. --- src/zone.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zone.c b/src/zone.c index 1c4279479..372a1f5b8 100644 --- a/src/zone.c +++ b/src/zone.c @@ -74,7 +74,7 @@ void* msgpack_zone_malloc_expand(msgpack_zone* zone, size_t size) while(sz < size) { size_t tmp_sz = sz * 2; if (tmp_sz <= sz) { - tmp_sz = size; + sz = size; break; } sz = tmp_sz; From f642b70e6aa4fcaadd70cafe359e5ca6363a46cf Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Sat, 20 Feb 2016 19:09:18 +0900 Subject: [PATCH 02/10] Backported #426 to version 1.4.0. --- include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp b/include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp index bbeb84945..9429d215b 100644 --- a/include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp +++ b/include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp @@ -36,12 +36,13 @@ namespace type { public: using base = std::tuple; - using base::base; - tuple() = default; tuple(tuple const&) = default; tuple(tuple&&) = default; + template + tuple(OtherTypes&&... other):base(std::forward(other)...) {} + template tuple(tuple const& other):base(static_cast const&>(other)) {} template From 1088aa55af30aff8b693db35c6a3d80dff4a06c5 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Sun, 6 Mar 2016 12:45:27 +0900 Subject: [PATCH 03/10] Backported #435 to version 1.4.0. --- include/msgpack/adaptor/map.hpp | 24 +- include/msgpack/adaptor/vector_char.hpp | 38 ++- .../msgpack/adaptor/vector_unsigned_char.hpp | 38 ++- test/msgpack_container.cpp | 260 ++++++++++++++++++ test/msgpack_cpp11.cpp | 101 +++++++ 5 files changed, 440 insertions(+), 21 deletions(-) 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; From 94c9bc2ddc1061e39c3780d3026a1686d0f12370 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Sun, 6 Mar 2016 14:19:10 +0900 Subject: [PATCH 04/10] Backported #436 to version 1.4.0. --- include/msgpack/sysdep.h | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/include/msgpack/sysdep.h b/include/msgpack/sysdep.h index a3f9edc9d..ed340f11b 100644 --- a/include/msgpack/sysdep.h +++ b/include/msgpack/sysdep.h @@ -186,4 +186,8 @@ # define inline __inline #endif +#ifdef __APPLE__ +# include +#endif + #endif /* msgpack/sysdep.h */ From 437400c6fecdd3c2740dc4d9f8e309f1654d55c4 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Sun, 6 Mar 2016 19:54:33 +0900 Subject: [PATCH 05/10] Updated the version to 1.4.1. --- CHANGELOG.md | 7 +++++++ README.md | 2 +- include/msgpack/version_master.h | 2 +- 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 6f7b0318e..b4cb8b78b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,10 @@ +# 2016-03-06 version 1.4.1 + + * Fix TARGET_OS_IPHONE checking (#436, #438) + * Fix invalid front() call for empty container (#435. #437) + * Fix compile error on g++6 (C++11 only) (#426, #428) + * Fix zone size expansion logic (#423, #427) + # 2016-01-22 version 1.4.0 ## << recommended changes >> diff --git a/README.md b/README.md index f7520506d..8ad6fbfb6 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ `msgpack` for C/C++ =================== -Version 1.4.0 [![Build Status](https://travis-ci.org/msgpack/msgpack-c.svg?branch=master)](https://travis-ci.org/msgpack/msgpack-c) [![Build status](https://ci.appveyor.com/api/projects/status/8kstcgt79qj123mw/branch/master?svg=true)](https://ci.appveyor.com/project/redboltz/msgpack-c/branch/master) +Version 1.4.1 [![Build Status](https://travis-ci.org/msgpack/msgpack-c.svg?branch=master)](https://travis-ci.org/msgpack/msgpack-c) [![Build status](https://ci.appveyor.com/api/projects/status/8kstcgt79qj123mw/branch/master?svg=true)](https://ci.appveyor.com/project/redboltz/msgpack-c/branch/master) It's like JSON but small and fast. diff --git a/include/msgpack/version_master.h b/include/msgpack/version_master.h index ec7555dd9..2907271a8 100644 --- a/include/msgpack/version_master.h +++ b/include/msgpack/version_master.h @@ -1,3 +1,3 @@ #define MSGPACK_VERSION_MAJOR 1 #define MSGPACK_VERSION_MINOR 4 -#define MSGPACK_VERSION_REVISION 0 +#define MSGPACK_VERSION_REVISION 1 From 0dcab0b2b17c6e1625b036a567013241cb25025b Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Wed, 18 May 2016 19:21:52 +0900 Subject: [PATCH 06/10] Backported #441 to cpp-1.4. Fixed a pointer operation problem at msgpack::zone::chunk_list::clear(). It was only happened on C++03. --- erb/cpp03_zone.hpp.erb | 1 + include/msgpack/detail/cpp03_zone.hpp | 1 + 2 files changed, 2 insertions(+) diff --git a/erb/cpp03_zone.hpp.erb b/erb/cpp03_zone.hpp.erb index e62eabb3d..ba5400c76 100644 --- a/erb/cpp03_zone.hpp.erb +++ b/erb/cpp03_zone.hpp.erb @@ -125,6 +125,7 @@ class zone { ::free(c); c = n; } else { + m_head = c; break; } } diff --git a/include/msgpack/detail/cpp03_zone.hpp b/include/msgpack/detail/cpp03_zone.hpp index e84fae352..fe885b737 100644 --- a/include/msgpack/detail/cpp03_zone.hpp +++ b/include/msgpack/detail/cpp03_zone.hpp @@ -125,6 +125,7 @@ class zone { ::free(c); c = n; } else { + m_head = c; break; } } From 9eca5a9ff6c7f9b6d8f20319321888ff6aef2dcb Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Thu, 26 May 2016 19:50:07 +0900 Subject: [PATCH 07/10] Updated version number. --- include/msgpack/version_master.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/msgpack/version_master.h b/include/msgpack/version_master.h index 2907271a8..766508067 100644 --- a/include/msgpack/version_master.h +++ b/include/msgpack/version_master.h @@ -1,3 +1,3 @@ #define MSGPACK_VERSION_MAJOR 1 #define MSGPACK_VERSION_MINOR 4 -#define MSGPACK_VERSION_REVISION 1 +#define MSGPACK_VERSION_REVISION 2 From 9a8405bcd7fc07954ba4e143d6190c8f102f232f Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Thu, 26 May 2016 20:27:08 +0900 Subject: [PATCH 08/10] Updated change log and readme. --- CHANGELOG.md | 3 +++ README.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b4cb8b78b..6ba6255bf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# 2016-05-26 version 1.4.2 + * Fix C++03 msgpack::zone::clear() memory access violation bug (#467) + # 2016-03-06 version 1.4.1 * Fix TARGET_OS_IPHONE checking (#436, #438) diff --git a/README.md b/README.md index 8ad6fbfb6..8a01d496d 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ `msgpack` for C/C++ =================== -Version 1.4.1 [![Build Status](https://travis-ci.org/msgpack/msgpack-c.svg?branch=master)](https://travis-ci.org/msgpack/msgpack-c) [![Build status](https://ci.appveyor.com/api/projects/status/8kstcgt79qj123mw/branch/master?svg=true)](https://ci.appveyor.com/project/redboltz/msgpack-c/branch/master) +Version 1.4.2 [![Build Status](https://travis-ci.org/msgpack/msgpack-c.svg?branch=master)](https://travis-ci.org/msgpack/msgpack-c) [![Build status](https://ci.appveyor.com/api/projects/status/8kstcgt79qj123mw/branch/master?svg=true)](https://ci.appveyor.com/project/redboltz/msgpack-c/branch/master) It's like JSON but small and fast. From c951f58531e445336fa8b0c98549ea9ce8ef3d56 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Thu, 30 Jun 2016 21:59:12 +0900 Subject: [PATCH 09/10] Fixed #494 Added warning supression code. --- test/object_with_zone.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/test/object_with_zone.cpp b/test/object_with_zone.cpp index 9e3a80dd7..3bbb4b3b3 100644 --- a/test/object_with_zone.cpp +++ b/test/object_with_zone.cpp @@ -742,7 +742,14 @@ TEST(object_with_zone, user_defined_non_virtual) msgpack::zone z; msgpack::object obj(b, z); +#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__) bottom br = obj.as(); +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) EXPECT_EQ(b.b, br.b); EXPECT_EQ(b.m1, br.m1); EXPECT_EQ(b.m2, br.m2); @@ -780,7 +787,14 @@ TEST(object_with_zone, user_defined_virtual) msgpack::zone z; msgpack::object obj(b, z); +#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__) v_bottom br = obj.as(); +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) EXPECT_EQ(b.b, br.b); EXPECT_EQ(b.m1, br.m1); EXPECT_EQ(b.m2, br.m2); From 8a2be5b4e959f3dac62e506d05b89bda90c81377 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Fri, 22 Jul 2016 16:00:50 +0900 Subject: [PATCH 10/10] Fixed #494. Added false positive warinig suppression code for user_class.cpp. --- test/user_class.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/user_class.cpp b/test/user_class.cpp index f8ad20f24..efe0eb495 100644 --- a/test/user_class.cpp +++ b/test/user_class.cpp @@ -382,7 +382,14 @@ TEST(MSGPACK_INHERIT, define_map_non_virtual) msgpack::pack(sbuf, b); msgpack::unpacked ret; msgpack::unpack(ret, sbuf.data(), sbuf.size()); +#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__) dm_bottom br = ret.get().as(); +#if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) +#pragma GCC diagnostic pop +#endif // (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) && !defined(__clang__) EXPECT_EQ(b.b, br.b); EXPECT_EQ(b.m1, br.m1); EXPECT_EQ(b.m2, br.m2);