Added convert adaptor support.

This commit is contained in:
Takatoshi Kondo 2015-10-11 12:16:34 +09:00
parent 428780db53
commit 20104301f3
2 changed files with 18 additions and 17 deletions

View File

@ -33,6 +33,14 @@ MSGPACK_API_VERSION_NAMESPACE(v1) {
namespace adaptor { namespace adaptor {
template <typename T>
struct convert<std::reference_wrapper<T>> {
msgpack::object const& operator()(msgpack::object const& o, std::reference_wrapper<T>& v) const {
msgpack::adaptor::convert<T>()(o, v.get());
return o;
}
};
template <typename T> template <typename T>
struct pack<std::reference_wrapper<T>> { struct pack<std::reference_wrapper<T>> {
template <typename Stream> template <typename Stream>

View File

@ -8,15 +8,16 @@
#if !defined(MSGPACK_USE_CPP03) #if !defined(MSGPACK_USE_CPP03)
TEST(MSGPACK_REFERENCE_WRAPPER, pack) TEST(MSGPACK_REFERENCE_WRAPPER, pack_convert)
{ {
int i1 = 42; int i1 = 42;
std::reference_wrapper<int> val1(i1); std::reference_wrapper<int> val1(i1);
std::stringstream ss; std::stringstream ss;
msgpack::pack(ss, val1); msgpack::pack(ss, val1);
msgpack::object_handle oh = msgpack::unpack(ss.str().data(), ss.str().size()); msgpack::object_handle oh = msgpack::unpack(ss.str().data(), ss.str().size());
int i2= oh.get().as<int>(); int i2 = 0;
EXPECT_EQ(val1, i2); std::reference_wrapper<int> val2(i2);
oh.get().convert(val2);;
EXPECT_EQ(i1, i2); EXPECT_EQ(i1, i2);
} }
@ -37,29 +38,21 @@ TEST(MSGPACK_REFERENCE_WRAPPER, object)
int i1 = 42; int i1 = 42;
std::reference_wrapper<int> val1(i1); std::reference_wrapper<int> val1(i1);
msgpack::object o(val1); msgpack::object o(val1);
int i2= o.as<int>(); int i2 = 0;
EXPECT_EQ(val1, i2); std::reference_wrapper<int> val2(i2);
o.convert(val2);
EXPECT_EQ(i1, i2); EXPECT_EQ(i1, i2);
} }
TEST(MSGPACK_REFERENCE_WRAPPER, object_with_zone) TEST(MSGPACK_REFERENCE_WRAPPER, object_with_zone)
{
int i1 = 42;
std::reference_wrapper<int> val1(i1);
msgpack::zone z;
msgpack::object o(val1, z);
int i2= o.as<int>();
EXPECT_EQ(val1, i2);
EXPECT_EQ(i1, i2);
}
TEST(MSGPACK_REFERENCE_WRAPPER, object_with_zone_string)
{ {
std::string s1 = "ABC"; std::string s1 = "ABC";
std::reference_wrapper<std::string> val1(s1); std::reference_wrapper<std::string> val1(s1);
msgpack::zone z; msgpack::zone z;
msgpack::object o(val1, z); msgpack::object o(val1, z);
std::string s2= o.as<std::string>(); std::string s2 = "DE";
std::reference_wrapper<std::string> val2(s2);
o.convert(val2);
EXPECT_EQ(s1, s2); EXPECT_EQ(s1, s2);
} }