From 530561eec0c6883a1bcf81a86828541f3ed4df30 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Tue, 12 Feb 2019 11:39:40 +0900 Subject: [PATCH 1/2] Added tests for `msgpack::object::clone()`. Converting C++ types from cloned object after original zone is destroyed. --- test/object.cpp | 116 +++++++++++++++++++++++++++++------------------- 1 file changed, 71 insertions(+), 45 deletions(-) diff --git a/test/object.cpp b/test/object.cpp index 64895102..abf253ee 100644 --- a/test/object.cpp +++ b/test/object.cpp @@ -361,67 +361,93 @@ TEST(object, clone_int) TEST(object, clone_str) { - msgpack::zone z; + msgpack::object_handle oh; std::string v = "123456789"; - msgpack::object obj(v, z); - std::size_t sz1 = msgpack::aligned_zone_size(obj); - msgpack::object_handle h = msgpack::clone(obj); - EXPECT_EQ(h.get(), obj); - EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); - h = msgpack::clone(obj); - EXPECT_EQ(h.get(), obj); - EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); + { + msgpack::zone z; + msgpack::object obj(v, z); + std::size_t sz1 = msgpack::aligned_zone_size(obj); + msgpack::object_handle h = msgpack::clone(obj); + EXPECT_EQ(h.get(), obj); + EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); + h = msgpack::clone(obj); + EXPECT_EQ(h.get(), obj); + EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); + oh = msgpack::move(h); + } + EXPECT_EQ(v, oh.get().as()); } TEST(object, clone_bin) { - msgpack::zone z; + msgpack::object_handle oh; std::vector v; - v.push_back('A'); - v.push_back('B'); - v.push_back('C'); - msgpack::object obj(v, z); - std::size_t sz1 = msgpack::aligned_zone_size(obj); - msgpack::object_handle h = msgpack::clone(obj); - EXPECT_EQ(h.get(), obj); - EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); - h = msgpack::clone(obj); - EXPECT_EQ(h.get(), obj); - EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); + { + msgpack::zone z; + v.push_back('A'); + v.push_back('B'); + v.push_back('C'); + msgpack::object obj(v, z); + std::size_t sz1 = msgpack::aligned_zone_size(obj); + msgpack::object_handle h = msgpack::clone(obj); + EXPECT_EQ(h.get(), obj); + EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); + h = msgpack::clone(obj); + EXPECT_EQ(h.get(), obj); + EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); + oh = msgpack::move(h); + } + std::vector v2 = oh.get().as >(); + EXPECT_EQ(v.size(), v2.size()); + EXPECT_TRUE(equal(v.begin(), v.end(), v2.begin())); } TEST(object, clone_array) { - msgpack::zone z; + msgpack::object_handle oh; std::vector v; - v.push_back(1); - v.push_back(2); - v.push_back(3); - msgpack::object obj(v, z); - std::size_t sz1 = msgpack::aligned_zone_size(obj); - msgpack::object_handle h = msgpack::clone(obj); - EXPECT_EQ(h.get(), obj); - EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); - h = msgpack::clone(obj); - EXPECT_EQ(h.get(), obj); - EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); + { + msgpack::zone z; + v.push_back(1); + v.push_back(2); + v.push_back(3); + msgpack::object obj(v, z); + std::size_t sz1 = msgpack::aligned_zone_size(obj); + msgpack::object_handle h = msgpack::clone(obj); + EXPECT_EQ(h.get(), obj); + EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); + h = msgpack::clone(obj); + EXPECT_EQ(h.get(), obj); + EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); + oh = msgpack::move(h); + } + std::vector v2 = oh.get().as >(); + EXPECT_EQ(v.size(), v2.size()); + EXPECT_TRUE(equal(v.begin(), v.end(), v2.begin())); } TEST(object, clone_map) { - msgpack::zone z; + msgpack::object_handle oh; std::map v; - v.insert(std::map::value_type(1, "ABC")); - v.insert(std::map::value_type(2, "DEF")); - v.insert(std::map::value_type(3, "GHI")); - msgpack::object obj(v, z); - std::size_t sz1 = msgpack::aligned_zone_size(obj); - msgpack::object_handle h = msgpack::clone(obj); - EXPECT_EQ(h.get(), obj); - EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); - h = msgpack::clone(obj); - EXPECT_EQ(h.get(), obj); - EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); + { + msgpack::zone z; + v.insert(std::map::value_type(1, "ABC")); + v.insert(std::map::value_type(2, "DEF")); + v.insert(std::map::value_type(3, "GHI")); + msgpack::object obj(v, z); + std::size_t sz1 = msgpack::aligned_zone_size(obj); + msgpack::object_handle h = msgpack::clone(obj); + EXPECT_EQ(h.get(), obj); + EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); + h = msgpack::clone(obj); + EXPECT_EQ(h.get(), obj); + EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get())); + oh = msgpack::move(h); + } + std::map v2 = oh.get().as >(); + EXPECT_EQ(v.size(), v2.size()); + EXPECT_TRUE(equal(v.begin(), v.end(), v2.begin())); } TEST(object, pack_float) From f72372314e25ffdfbe98eff8354019e54cfaa966 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Tue, 12 Feb 2019 11:40:34 +0900 Subject: [PATCH 2/2] Fixed #763. Fixed aligned_zone_size_visitor size passing. Replaced by value with by reference. --- include/msgpack/v1/object.hpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/include/msgpack/v1/object.hpp b/include/msgpack/v1/object.hpp index 6172774b..793e40fb 100644 --- a/include/msgpack/v1/object.hpp +++ b/include/msgpack/v1/object.hpp @@ -527,7 +527,7 @@ private: }; struct aligned_zone_size_visitor { - explicit aligned_zone_size_visitor(std::size_t s) + explicit aligned_zone_size_visitor(std::size_t& s) :m_size(s) {} bool visit_nil() { return true; @@ -596,7 +596,7 @@ struct aligned_zone_size_visitor { return true; } private: - std::size_t m_size; + std::size_t& m_size; }; inline std::size_t aligned_zone_size(msgpack::object const& obj) {