Supported the C++11's enum class.

This commit is contained in:
Takatoshi Kondo 2014-07-08 19:31:02 +09:00
parent f6a5402194
commit 212f025f00
2 changed files with 50 additions and 3 deletions

View File

@ -18,6 +18,8 @@
#ifndef MSGPACK_CPP11_DEFINE_HPP
#define MSGPACK_CPP11_DEFINE_HPP
#include <type_traits>
#define MSGPACK_DEFINE(...) \
template <typename Packer> \
void msgpack_pack(Packer& pk) const \
@ -42,20 +44,20 @@
{ \
int tmp; \
o >> tmp; \
v = static_cast<enum>(tmp); \
v = static_cast<enum>(tmp); \
return v; \
} \
template <> \
inline void operator<< (object::with_zone& o, const enum& v) \
{ \
int tmp = static_cast<enum>(v); \
int tmp = static_cast<std::underlying_type<enum>::type>(v); \
o << tmp; \
} \
namespace detail { \
template <typename Stream> \
struct packer_serializer<Stream, enum> { \
static packer<Stream>& pack(packer<Stream>& o, const enum& v) { \
return o << static_cast<int>(v); \
return o << static_cast<std::underlying_type<enum>::type>(v); \
} \
}; \
} \

View File

@ -888,6 +888,51 @@ TEST(MSGPACK_USER_DEFINED, simple_buffer_enum_member)
EXPECT_EQ(val1.t3, val2.t3);
}
#if !defined(MSGPACK_USE_CPP03)
class TestEnumClassMemberClass
{
public:
TestEnumClassMemberClass()
: t1(TestEnumClassType::STATE_A), t2(TestEnumClassType::STATE_B), t3(TestEnumClassType::STATE_C) {}
enum class TestEnumClassType:long {
STATE_INVALID = 0,
STATE_A = 1,
STATE_B = 2,
STATE_C = 3
};
TestEnumClassType t1;
TestEnumClassType t2;
TestEnumClassType t3;
MSGPACK_DEFINE(t1, t2, t3);
};
MSGPACK_ADD_ENUM(TestEnumClassMemberClass::TestEnumClassType);
TEST(MSGPACK_USER_DEFINED, simple_buffer_enum_class_member)
{
TestEnumClassMemberClass val1;
msgpack::sbuffer sbuf;
msgpack::pack(sbuf, val1);
msgpack::zone z;
msgpack::object obj;
msgpack::unpack_return ret =
msgpack::unpack(sbuf.data(), sbuf.size(), NULL, z, obj);
EXPECT_EQ(msgpack::UNPACK_SUCCESS, ret);
TestEnumClassMemberClass val2;
val2.t1 = TestEnumClassMemberClass::TestEnumClassType::STATE_INVALID;
val2.t2 = TestEnumClassMemberClass::TestEnumClassType::STATE_INVALID;
val2.t3 = TestEnumClassMemberClass::TestEnumClassType::STATE_INVALID;
obj.convert(&val2);
EXPECT_EQ(val1.t1, val2.t1);
EXPECT_EQ(val1.t2, val2.t2);
EXPECT_EQ(val1.t3, val2.t3);
}
#endif // !defined(MSGPACK_USE_CPP03)
class TestUnionMemberClass
{
public: