Skip to content

Commit

Permalink
Merge pull request #384 from jpetso/jpetso_refwrap
Browse files Browse the repository at this point in the history
Support to-object conversions for std::reference_wrapper<const T>.
  • Loading branch information
redboltz committed Nov 13, 2015
2 parents 1a7aa5e + b5599ef commit b76c8ae
Show file tree
Hide file tree
Showing 2 changed files with 40 additions and 3 deletions.
5 changes: 3 additions & 2 deletions include/msgpack/adaptor/cpp11/reference_wrapper.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
#include "msgpack/adaptor/check_container_size.hpp"

#include <memory>
#include <type_traits>

namespace msgpack {

Expand Down Expand Up @@ -53,14 +54,14 @@ struct pack<std::reference_wrapper<T>> {
template <typename T>
struct object<std::reference_wrapper<T> > {
void operator()(msgpack::object& o, const std::reference_wrapper<T>& v) const {
msgpack::adaptor::object<T>()(o, v.get());
msgpack::adaptor::object<typename std::remove_const<T>::type>()(o, v.get());
}
};

template <typename T>
struct object_with_zone<std::reference_wrapper<T>> {
void operator()(msgpack::object::with_zone& o, const std::reference_wrapper<T>& v) const {
msgpack::adaptor::object_with_zone<T>()(o, v.get());
msgpack::adaptor::object_with_zone<typename std::remove_const<T>::type>()(o, v.get());
}
};

Expand Down
38 changes: 37 additions & 1 deletion test/reference_wrapper_cpp11.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<int> 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<const int> 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<int> val2(i2);
oh.get().convert(val2);
EXPECT_EQ(i1, i2);
}

Expand All @@ -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<const int> val1(i1);
msgpack::object o(val1);
int i2 = 0;
std::reference_wrapper<int> val2(i2);
o.convert(val2);
EXPECT_EQ(i1, i2);
}

TEST(MSGPACK_REFERENCE_WRAPPER, object_with_zone)
{
std::string s1 = "ABC";
Expand All @@ -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<const std::string> val1(s1);
msgpack::zone z;
msgpack::object o(val1, z);
std::string s2 = "DE";
std::reference_wrapper<std::string> val2(s2);
o.convert(val2);
EXPECT_EQ(s1, s2);
}

#endif // !defined(MSGPACK_USE_CPP03)

0 comments on commit b76c8ae

Please sign in to comment.