mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-05-21 21:26:35 +02:00
Separated unpacked from object_handle to preserve the original ABI.
This commit is contained in:
parent
9cb2c91d58
commit
f75da23e1d
@ -36,6 +36,67 @@ namespace msgpack {
|
|||||||
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
MSGPACK_API_VERSION_NAMESPACE(v1) {
|
||||||
/// @endcond
|
/// @endcond
|
||||||
|
|
||||||
|
#if defined(MSGPACK_USE_CPP03)
|
||||||
|
class unpacked;
|
||||||
|
struct unpacked_ref {
|
||||||
|
unpacked_ref(unpacked* unp):m_unp(unp) {}
|
||||||
|
unpacked* m_unp;
|
||||||
|
};
|
||||||
|
#endif // defined(MSGPACK_USE_CPP03)
|
||||||
|
|
||||||
|
// obsolete (use object_handle)
|
||||||
|
class unpacked {
|
||||||
|
public:
|
||||||
|
unpacked() {}
|
||||||
|
|
||||||
|
unpacked(msgpack::object const& obj, msgpack::unique_ptr<msgpack::zone> z) :
|
||||||
|
m_obj(obj), m_zone(msgpack::move(z)) { }
|
||||||
|
|
||||||
|
void set(msgpack::object const& obj)
|
||||||
|
{ m_obj = obj; }
|
||||||
|
|
||||||
|
const msgpack::object& get() const
|
||||||
|
{ return m_obj; }
|
||||||
|
|
||||||
|
msgpack::unique_ptr<msgpack::zone>& zone()
|
||||||
|
{ return m_zone; }
|
||||||
|
|
||||||
|
const msgpack::unique_ptr<msgpack::zone>& zone() const
|
||||||
|
{ return m_zone; }
|
||||||
|
|
||||||
|
#if defined(MSGPACK_USE_CPP03)
|
||||||
|
unpacked(unpacked& other):
|
||||||
|
m_obj(other.m_obj),
|
||||||
|
m_zone(msgpack::move(other.m_zone)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
unpacked(unpacked_ref ref):
|
||||||
|
m_obj(ref.m_unp->m_obj),
|
||||||
|
m_zone(msgpack::move(ref.m_unp->m_zone)) {
|
||||||
|
}
|
||||||
|
|
||||||
|
unpacked& operator=(unpacked& other) {
|
||||||
|
m_obj = other.m_obj;
|
||||||
|
m_zone = msgpack::move(other.m_zone);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
unpacked& operator=(unpacked_ref ref) {
|
||||||
|
m_obj = ref.m_unp->m_obj;
|
||||||
|
m_zone = msgpack::move(ref.m_unp->m_zone);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
operator msgpack::unpacked_ref() {
|
||||||
|
return msgpack::unpacked_ref(this);
|
||||||
|
}
|
||||||
|
#endif // defined(MSGPACK_USE_CPP03)
|
||||||
|
|
||||||
|
private:
|
||||||
|
msgpack::object m_obj;
|
||||||
|
msgpack::unique_ptr<msgpack::zone> m_zone;
|
||||||
|
};
|
||||||
|
|
||||||
class object_handle {
|
class object_handle {
|
||||||
public:
|
public:
|
||||||
object_handle() {}
|
object_handle() {}
|
||||||
@ -43,10 +104,6 @@ public:
|
|||||||
object_handle(msgpack::object const& obj, msgpack::unique_ptr<msgpack::zone> z) :
|
object_handle(msgpack::object const& obj, msgpack::unique_ptr<msgpack::zone> z) :
|
||||||
m_obj(obj), m_zone(msgpack::move(z)) { }
|
m_obj(obj), m_zone(msgpack::move(z)) { }
|
||||||
|
|
||||||
// deprecated
|
|
||||||
void set(msgpack::object const& obj)
|
|
||||||
{ m_obj = obj; }
|
|
||||||
|
|
||||||
const msgpack::object& get() const
|
const msgpack::object& get() const
|
||||||
{ return m_obj; }
|
{ return m_obj; }
|
||||||
|
|
||||||
@ -72,6 +129,11 @@ public:
|
|||||||
m_zone(msgpack::move(ref.m_oh->m_zone)) {
|
m_zone(msgpack::move(ref.m_oh->m_zone)) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object_handle(msgpack::unpacked_ref ref):
|
||||||
|
m_obj(ref.m_unp->get()),
|
||||||
|
m_zone(msgpack::move(ref.m_unp->zone())) {
|
||||||
|
}
|
||||||
|
|
||||||
object_handle& operator=(object_handle& other) {
|
object_handle& operator=(object_handle& other) {
|
||||||
m_obj = other.m_obj;
|
m_obj = other.m_obj;
|
||||||
m_zone = msgpack::move(other.m_zone);
|
m_zone = msgpack::move(other.m_zone);
|
||||||
@ -84,9 +146,17 @@ public:
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
object_handle& operator=(msgpack::unpacked_ref ref) {
|
||||||
|
m_obj = ref.m_unp->get();
|
||||||
|
m_zone = msgpack::move(ref.m_unp->zone());
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
operator object_handle_ref() {
|
operator object_handle_ref() {
|
||||||
return object_handle_ref(this);
|
return object_handle_ref(this);
|
||||||
}
|
}
|
||||||
|
#else // defined(MSGPACK_USE_CPP03)
|
||||||
|
object_handle(msgpack::unpacked&& unp): m_obj(unp.get()), m_zone(std::move(unp.zone())) {}
|
||||||
#endif // defined(MSGPACK_USE_CPP03)
|
#endif // defined(MSGPACK_USE_CPP03)
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
@ -991,8 +991,6 @@ inline int context::execute(const char* data, std::size_t len, std::size_t& off)
|
|||||||
} // detail
|
} // detail
|
||||||
|
|
||||||
|
|
||||||
typedef object_handle unpacked;
|
|
||||||
|
|
||||||
class unpacker {
|
class unpacker {
|
||||||
public:
|
public:
|
||||||
unpacker(unpack_reference_func f = &unpacker::default_reference_func,
|
unpacker(unpack_reference_func f = &unpacker::default_reference_func,
|
||||||
@ -1120,8 +1118,6 @@ private:
|
|||||||
#endif // defined(MSGPACK_USE_CPP03)
|
#endif // defined(MSGPACK_USE_CPP03)
|
||||||
};
|
};
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
unpacked unpack(
|
unpacked unpack(
|
||||||
const char* data, std::size_t len, std::size_t& off, bool& referenced,
|
const char* data, std::size_t len, std::size_t& off, bool& referenced,
|
||||||
unpack_reference_func f = nullptr, void* user_data = nullptr,
|
unpack_reference_func f = nullptr, void* user_data = nullptr,
|
||||||
@ -1139,8 +1135,6 @@ unpacked unpack(
|
|||||||
unpack_reference_func f = nullptr, void* user_data = nullptr,
|
unpack_reference_func f = nullptr, void* user_data = nullptr,
|
||||||
unpack_limit const& limit = unpack_limit());
|
unpack_limit const& limit = unpack_limit());
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
|
|
||||||
void unpack(unpacked& result,
|
void unpack(unpacked& result,
|
||||||
const char* data, std::size_t len, std::size_t& off, bool& referenced,
|
const char* data, std::size_t len, std::size_t& off, bool& referenced,
|
||||||
@ -1531,8 +1525,6 @@ unpack_imp(const char* data, std::size_t len, std::size_t& off,
|
|||||||
|
|
||||||
// reference version
|
// reference version
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
inline unpacked unpack(
|
inline unpacked unpack(
|
||||||
const char* data, std::size_t len, std::size_t& off, bool& referenced,
|
const char* data, std::size_t len, std::size_t& off, bool& referenced,
|
||||||
unpack_reference_func f, void* user_data, unpack_limit const& limit)
|
unpack_reference_func f, void* user_data, unpack_limit const& limit)
|
||||||
@ -1582,8 +1574,6 @@ inline unpacked unpack(
|
|||||||
return unpack(data, len, off, referenced, f, user_data, limit);
|
return unpack(data, len, off, referenced, f, user_data, limit);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
inline void unpack(unpacked& result,
|
inline void unpack(unpacked& result,
|
||||||
const char* data, std::size_t len, std::size_t& off, bool& referenced,
|
const char* data, std::size_t len, std::size_t& off, bool& referenced,
|
||||||
unpack_reference_func f, void* user_data, unpack_limit const& limit)
|
unpack_reference_func f, void* user_data, unpack_limit const& limit)
|
||||||
|
@ -352,9 +352,6 @@ TEST(object, clone_int)
|
|||||||
h = msgpack::clone(obj);
|
h = msgpack::clone(obj);
|
||||||
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()));
|
||||||
h = msgpack::move(h);
|
|
||||||
EXPECT_EQ(h.get(), obj);
|
|
||||||
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(object, clone_str)
|
TEST(object, clone_str)
|
||||||
@ -369,9 +366,6 @@ TEST(object, clone_str)
|
|||||||
h = msgpack::clone(obj);
|
h = msgpack::clone(obj);
|
||||||
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()));
|
||||||
h = msgpack::move(h);
|
|
||||||
EXPECT_EQ(h.get(), obj);
|
|
||||||
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(object, clone_bin)
|
TEST(object, clone_bin)
|
||||||
@ -389,9 +383,6 @@ TEST(object, clone_bin)
|
|||||||
h = msgpack::clone(obj);
|
h = msgpack::clone(obj);
|
||||||
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()));
|
||||||
h = msgpack::move(h);
|
|
||||||
EXPECT_EQ(h.get(), obj);
|
|
||||||
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(object, clone_array)
|
TEST(object, clone_array)
|
||||||
@ -409,9 +400,6 @@ TEST(object, clone_array)
|
|||||||
h = msgpack::clone(obj);
|
h = msgpack::clone(obj);
|
||||||
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()));
|
||||||
h = msgpack::move(h);
|
|
||||||
EXPECT_EQ(h.get(), obj);
|
|
||||||
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(object, clone_map)
|
TEST(object, clone_map)
|
||||||
@ -429,7 +417,4 @@ TEST(object, clone_map)
|
|||||||
h = msgpack::clone(obj);
|
h = msgpack::clone(obj);
|
||||||
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()));
|
||||||
h = msgpack::move(h);
|
|
||||||
EXPECT_EQ(h.get(), obj);
|
|
||||||
EXPECT_EQ(sz1, msgpack::aligned_zone_size(h.get()));
|
|
||||||
}
|
}
|
||||||
|
@ -50,8 +50,6 @@ TEST(pack, myclass)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
TEST(unpack, int_ret_no_offset_no_ref)
|
TEST(unpack, int_ret_no_offset_no_ref)
|
||||||
{
|
{
|
||||||
msgpack::sbuffer sbuf;
|
msgpack::sbuffer sbuf;
|
||||||
@ -97,8 +95,6 @@ TEST(unpack, int_ret_offset_ref)
|
|||||||
EXPECT_EQ(off, sbuf.size());
|
EXPECT_EQ(off, sbuf.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // !defined(MSGPACK_USE_CPP03)
|
|
||||||
|
|
||||||
|
|
||||||
TEST(unpack, int_no_offset_no_ref)
|
TEST(unpack, int_no_offset_no_ref)
|
||||||
{
|
{
|
||||||
@ -290,3 +286,37 @@ TEST(unpack, sequence)
|
|||||||
|
|
||||||
EXPECT_EQ(off, sbuf.size());
|
EXPECT_EQ(off, sbuf.size());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEST(unpack, convert_to_object_handle)
|
||||||
|
{
|
||||||
|
msgpack::sbuffer sbuf;
|
||||||
|
msgpack::pack(sbuf, 1);
|
||||||
|
msgpack::unpacked msg;
|
||||||
|
|
||||||
|
msgpack::unpack(msg, sbuf.data(), sbuf.size());
|
||||||
|
msgpack::object_handle oh(msgpack::move(msg));
|
||||||
|
EXPECT_EQ(1, oh.get().as<int>());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(unpack, convert_to_object_handle_direct)
|
||||||
|
{
|
||||||
|
msgpack::sbuffer sbuf;
|
||||||
|
msgpack::pack(sbuf, 1);
|
||||||
|
msgpack::object_handle oh(msgpack::unpack(sbuf.data(), sbuf.size()));
|
||||||
|
EXPECT_EQ(1, oh.get().as<int>());
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#if !defined(MSGPACK_USE_CPP03)
|
||||||
|
|
||||||
|
TEST(unpack, convert_to_object_handle_direct_implicit)
|
||||||
|
{
|
||||||
|
msgpack::sbuffer sbuf;
|
||||||
|
msgpack::pack(sbuf, 1);
|
||||||
|
msgpack::object_handle oh = msgpack::unpack(sbuf.data(), sbuf.size());
|
||||||
|
EXPECT_EQ(1, oh.get().as<int>());
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif // !defined(MSGPACK_USE_CPP03)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user