mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-05-28 15:14:11 +02:00
Supported the C++11's enum class.
This commit is contained in:
parent
f6a5402194
commit
212f025f00
@ -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); \
|
||||
} \
|
||||
}; \
|
||||
} \
|
||||
|
@ -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:
|
||||
|
Loading…
x
Reference in New Issue
Block a user