mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-06-01 21:03:41 +02:00
Reverted msgpack::move() on the C++03. Const-correntness isn't broken now.
Implemented msgpack::object_handle using the same design pattern as std::auto_ptr and std::auto_ptr_ref. Minimized the uses of #if defined(MSGPACK_USE_CPP03) conditional macro.
This commit is contained in:
parent
e18f5b2d52
commit
9e18ac5d2d
@ -63,9 +63,9 @@ T& move(T& t)
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
T& move(T const& t)
|
T const& move(T const& t)
|
||||||
{
|
{
|
||||||
return const_cast<T&>(t);
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <bool P, typename T = void>
|
template <bool P, typename T = void>
|
||||||
|
@ -56,6 +56,39 @@ public:
|
|||||||
const msgpack::unique_ptr<msgpack::zone>& zone() const
|
const msgpack::unique_ptr<msgpack::zone>& zone() const
|
||||||
{ return m_zone; }
|
{ return m_zone; }
|
||||||
|
|
||||||
|
#if defined(MSGPACK_USE_CPP03)
|
||||||
|
struct object_handle_ref {
|
||||||
|
object_handle_ref(object_handle* oh):m_oh(oh) {}
|
||||||
|
object_handle* m_oh;
|
||||||
|
};
|
||||||
|
|
||||||
|
object_handle(object_handle& other):
|
||||||
|
m_obj(other.m_obj),
|
||||||
|
m_zone(msgpack::move(other.m_zone)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
object_handle(object_handle_ref ref):
|
||||||
|
m_obj(ref.m_oh->m_obj),
|
||||||
|
m_zone(msgpack::move(ref.m_oh->m_zone)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
object_handle& operator=(object_handle& other) {
|
||||||
|
m_obj = other.m_obj;
|
||||||
|
m_zone = msgpack::move(other.m_zone);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
object_handle& operator=(object_handle_ref ref) {
|
||||||
|
m_obj = ref.m_oh->m_obj;
|
||||||
|
m_zone = msgpack::move(ref.m_oh->m_zone);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator object_handle_ref() {
|
||||||
|
return object_handle_ref(this);
|
||||||
|
}
|
||||||
|
#endif // defined(MSGPACK_USE_CPP03)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
msgpack::object m_obj;
|
msgpack::object m_obj;
|
||||||
msgpack::unique_ptr<msgpack::zone> m_zone;
|
msgpack::unique_ptr<msgpack::zone> m_zone;
|
||||||
@ -110,13 +143,8 @@ inline std::size_t aligned_zone_size(msgpack::object const& obj) {
|
|||||||
inline object_handle clone(msgpack::object const& obj) {
|
inline object_handle clone(msgpack::object const& obj) {
|
||||||
std::size_t size = msgpack::aligned_zone_size(obj);
|
std::size_t size = msgpack::aligned_zone_size(obj);
|
||||||
msgpack::unique_ptr<msgpack::zone> z(size == 0 ? nullptr : new msgpack::zone(size));
|
msgpack::unique_ptr<msgpack::zone> z(size == 0 ? nullptr : new msgpack::zone(size));
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
msgpack::object newobj = z.get() ? msgpack::object(obj, *z) : obj;
|
||||||
msgpack::object newobj = z.get() ? msgpack::move(msgpack::object(obj, *z)) : msgpack::move(obj);
|
|
||||||
return msgpack::move(object_handle(newobj, msgpack::move(z)));
|
|
||||||
#else // defined(MSGPACK_USE_CPP03)
|
|
||||||
msgpack::object newobj = z ? msgpack::object(obj, *z) : obj;
|
|
||||||
return object_handle(newobj, msgpack::move(z));
|
return object_handle(newobj, msgpack::move(z));
|
||||||
#endif // defined(MSGPACK_USE_CPP03)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct object::implicit_type {
|
struct object::implicit_type {
|
||||||
|
@ -346,11 +346,13 @@ TEST(object, clone_int)
|
|||||||
int v = 0;
|
int v = 0;
|
||||||
msgpack::object obj(v);
|
msgpack::object obj(v);
|
||||||
std::size_t sz1 = msgpack::aligned_zone_size(obj);
|
std::size_t sz1 = msgpack::aligned_zone_size(obj);
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
msgpack::object_handle h = msgpack::move(msgpack::clone(obj));
|
|
||||||
#else // defined(MSGPACK_USE_CPP03)
|
|
||||||
msgpack::object_handle h = msgpack::clone(obj);
|
msgpack::object_handle h = msgpack::clone(obj);
|
||||||
#endif // defined(MSGPACK_USE_CPP03)
|
EXPECT_EQ(h.get(), obj);
|
||||||
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
|
h = msgpack::clone(obj);
|
||||||
|
EXPECT_EQ(h.get(), obj);
|
||||||
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
|
h = h;
|
||||||
EXPECT_EQ(h.get(), obj);
|
EXPECT_EQ(h.get(), obj);
|
||||||
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
}
|
}
|
||||||
@ -361,11 +363,13 @@ TEST(object, clone_str)
|
|||||||
std::string v = "123456789";
|
std::string v = "123456789";
|
||||||
msgpack::object obj(v, z);
|
msgpack::object obj(v, z);
|
||||||
std::size_t sz1 = msgpack::aligned_zone_size(obj);
|
std::size_t sz1 = msgpack::aligned_zone_size(obj);
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
msgpack::object_handle h = msgpack::move(msgpack::clone(obj));
|
|
||||||
#else // defined(MSGPACK_USE_CPP03)
|
|
||||||
msgpack::object_handle h = msgpack::clone(obj);
|
msgpack::object_handle h = msgpack::clone(obj);
|
||||||
#endif // defined(MSGPACK_USE_CPP03)
|
EXPECT_EQ(h.get(), obj);
|
||||||
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
|
h = msgpack::clone(obj);
|
||||||
|
EXPECT_EQ(h.get(), obj);
|
||||||
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
|
h = h;
|
||||||
EXPECT_EQ(h.get(), obj);
|
EXPECT_EQ(h.get(), obj);
|
||||||
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
}
|
}
|
||||||
@ -379,11 +383,13 @@ TEST(object, clone_bin)
|
|||||||
v.push_back('C');
|
v.push_back('C');
|
||||||
msgpack::object obj(v, z);
|
msgpack::object obj(v, z);
|
||||||
std::size_t sz1 = msgpack::aligned_zone_size(obj);
|
std::size_t sz1 = msgpack::aligned_zone_size(obj);
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
msgpack::object_handle h = msgpack::move(msgpack::clone(obj));
|
|
||||||
#else // defined(MSGPACK_USE_CPP03)
|
|
||||||
msgpack::object_handle h = msgpack::clone(obj);
|
msgpack::object_handle h = msgpack::clone(obj);
|
||||||
#endif // defined(MSGPACK_USE_CPP03)
|
EXPECT_EQ(h.get(), obj);
|
||||||
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
|
h = msgpack::clone(obj);
|
||||||
|
EXPECT_EQ(h.get(), obj);
|
||||||
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
|
h = h;
|
||||||
EXPECT_EQ(h.get(), obj);
|
EXPECT_EQ(h.get(), obj);
|
||||||
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
}
|
}
|
||||||
@ -397,11 +403,13 @@ TEST(object, clone_array)
|
|||||||
v.push_back(3);
|
v.push_back(3);
|
||||||
msgpack::object obj(v, z);
|
msgpack::object obj(v, z);
|
||||||
std::size_t sz1 = msgpack::aligned_zone_size(obj);
|
std::size_t sz1 = msgpack::aligned_zone_size(obj);
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
msgpack::object_handle h = msgpack::move(msgpack::clone(obj));
|
|
||||||
#else // defined(MSGPACK_USE_CPP03)
|
|
||||||
msgpack::object_handle h = msgpack::clone(obj);
|
msgpack::object_handle h = msgpack::clone(obj);
|
||||||
#endif // defined(MSGPACK_USE_CPP03)
|
EXPECT_EQ(h.get(), obj);
|
||||||
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
|
h = msgpack::clone(obj);
|
||||||
|
EXPECT_EQ(h.get(), obj);
|
||||||
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
|
h = h;
|
||||||
EXPECT_EQ(h.get(), obj);
|
EXPECT_EQ(h.get(), obj);
|
||||||
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
}
|
}
|
||||||
@ -415,11 +423,13 @@ TEST(object, clone_map)
|
|||||||
v.insert(std::map<int, std::string>::value_type(3, "GHI"));
|
v.insert(std::map<int, std::string>::value_type(3, "GHI"));
|
||||||
msgpack::object obj(v, z);
|
msgpack::object obj(v, z);
|
||||||
std::size_t sz1 = msgpack::aligned_zone_size(obj);
|
std::size_t sz1 = msgpack::aligned_zone_size(obj);
|
||||||
#if defined(MSGPACK_USE_CPP03)
|
|
||||||
msgpack::object_handle h = msgpack::move(msgpack::clone(obj));
|
|
||||||
#else // defined(MSGPACK_USE_CPP03)
|
|
||||||
msgpack::object_handle h = msgpack::clone(obj);
|
msgpack::object_handle h = msgpack::clone(obj);
|
||||||
#endif // defined(MSGPACK_USE_CPP03)
|
EXPECT_EQ(h.get(), obj);
|
||||||
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
|
h = msgpack::clone(obj);
|
||||||
|
EXPECT_EQ(h.get(), obj);
|
||||||
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
|
h = h;
|
||||||
EXPECT_EQ(h.get(), obj);
|
EXPECT_EQ(h.get(), obj);
|
||||||
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user