From b5599ef3fc642bc5316e81cd3bfbd10b3bbf07fe Mon Sep 17 00:00:00 2001 From: Jakob Petsovits Date: Wed, 11 Nov 2015 18:16:44 -0500 Subject: [PATCH] Support to-object conversions for std::reference_wrapper. Previously the conversion would fail because struct object is not generally provided for the const version of the type, but because the wrapper would pass down the type unchanged, it would look for exactly that missing template specialization unsuccessfully. This is specifically an issue for std::reference_wrapper because std::cref() returns an std::reference_wrapper. --- .../adaptor/cpp11/reference_wrapper.hpp | 5 ++- test/reference_wrapper_cpp11.cpp | 38 ++++++++++++++++++- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/include/msgpack/adaptor/cpp11/reference_wrapper.hpp b/include/msgpack/adaptor/cpp11/reference_wrapper.hpp index 214a6a7f..59974e67 100644 --- a/include/msgpack/adaptor/cpp11/reference_wrapper.hpp +++ b/include/msgpack/adaptor/cpp11/reference_wrapper.hpp @@ -24,6 +24,7 @@ #include "msgpack/adaptor/check_container_size.hpp" #include +#include namespace msgpack { @@ -53,14 +54,14 @@ struct pack> { template struct object > { void operator()(msgpack::object& o, const std::reference_wrapper& v) const { - msgpack::adaptor::object()(o, v.get()); + msgpack::adaptor::object::type>()(o, v.get()); } }; template struct object_with_zone> { void operator()(msgpack::object::with_zone& o, const std::reference_wrapper& v) const { - msgpack::adaptor::object_with_zone()(o, v.get()); + msgpack::adaptor::object_with_zone::type>()(o, v.get()); } }; diff --git a/test/reference_wrapper_cpp11.cpp b/test/reference_wrapper_cpp11.cpp index b1ed8876..6550af37 100644 --- a/test/reference_wrapper_cpp11.cpp +++ b/test/reference_wrapper_cpp11.cpp @@ -17,7 +17,20 @@ TEST(MSGPACK_REFERENCE_WRAPPER, pack_convert) msgpack::object_handle oh = msgpack::unpack(ss.str().data(), ss.str().size()); int i2 = 0; std::reference_wrapper val2(i2); - oh.get().convert(val2);; + oh.get().convert(val2); + EXPECT_EQ(i1, i2); +} + +TEST(MSGPACK_REFERENCE_WRAPPER, pack_convert_const) +{ + const int i1 = 42; + std::reference_wrapper val1(i1); + std::stringstream ss; + msgpack::pack(ss, val1); + msgpack::object_handle oh = msgpack::unpack(ss.str().data(), ss.str().size()); + int i2 = 0; + std::reference_wrapper val2(i2); + oh.get().convert(val2); EXPECT_EQ(i1, i2); } @@ -44,6 +57,17 @@ TEST(MSGPACK_REFERENCE_WRAPPER, object) EXPECT_EQ(i1, i2); } +TEST(MSGPACK_REFERENCE_WRAPPER, object_const) +{ + const int i1 = 42; + std::reference_wrapper val1(i1); + msgpack::object o(val1); + int i2 = 0; + std::reference_wrapper val2(i2); + o.convert(val2); + EXPECT_EQ(i1, i2); +} + TEST(MSGPACK_REFERENCE_WRAPPER, object_with_zone) { std::string s1 = "ABC"; @@ -56,4 +80,16 @@ TEST(MSGPACK_REFERENCE_WRAPPER, object_with_zone) EXPECT_EQ(s1, s2); } +TEST(MSGPACK_REFERENCE_WRAPPER, object_with_zone_const) +{ + const std::string s1 = "ABC"; + std::reference_wrapper val1(s1); + msgpack::zone z; + msgpack::object o(val1, z); + std::string s2 = "DE"; + std::reference_wrapper val2(s2); + o.convert(val2); + EXPECT_EQ(s1, s2); +} + #endif // !defined(MSGPACK_USE_CPP03)