mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-05-29 23:42:40 +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
|
#ifndef MSGPACK_CPP11_DEFINE_HPP
|
||||||
#define MSGPACK_CPP11_DEFINE_HPP
|
#define MSGPACK_CPP11_DEFINE_HPP
|
||||||
|
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
#define MSGPACK_DEFINE(...) \
|
#define MSGPACK_DEFINE(...) \
|
||||||
template <typename Packer> \
|
template <typename Packer> \
|
||||||
void msgpack_pack(Packer& pk) const \
|
void msgpack_pack(Packer& pk) const \
|
||||||
@ -42,20 +44,20 @@
|
|||||||
{ \
|
{ \
|
||||||
int tmp; \
|
int tmp; \
|
||||||
o >> tmp; \
|
o >> tmp; \
|
||||||
v = static_cast<enum>(tmp); \
|
v = static_cast<enum>(tmp); \
|
||||||
return v; \
|
return v; \
|
||||||
} \
|
} \
|
||||||
template <> \
|
template <> \
|
||||||
inline void operator<< (object::with_zone& o, const enum& v) \
|
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; \
|
o << tmp; \
|
||||||
} \
|
} \
|
||||||
namespace detail { \
|
namespace detail { \
|
||||||
template <typename Stream> \
|
template <typename Stream> \
|
||||||
struct packer_serializer<Stream, enum> { \
|
struct packer_serializer<Stream, enum> { \
|
||||||
static packer<Stream>& pack(packer<Stream>& o, const enum& v) { \
|
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);
|
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
|
class TestUnionMemberClass
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user