mirror of
https://github.com/msgpack/msgpack-c.git
synced 2025-05-21 05:18:37 +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) {
|
||||
/// @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 {
|
||||
public:
|
||||
object_handle() {}
|
||||
@ -43,10 +104,6 @@ public:
|
||||
object_handle(msgpack::object const& obj, msgpack::unique_ptr<msgpack::zone> z) :
|
||||
m_obj(obj), m_zone(msgpack::move(z)) { }
|
||||
|
||||
// deprecated
|
||||
void set(msgpack::object const& obj)
|
||||
{ m_obj = obj; }
|
||||
|
||||
const msgpack::object& get() const
|
||||
{ return m_obj; }
|
||||
|
||||
@ -72,6 +129,11 @@ public:
|
||||
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) {
|
||||
m_obj = other.m_obj;
|
||||
m_zone = msgpack::move(other.m_zone);
|
||||
@ -84,9 +146,17 @@ public:
|
||||
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() {
|
||||
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)
|
||||
|
||||
private:
|
||||
|
@ -991,8 +991,6 @@ inline int context::execute(const char* data, std::size_t len, std::size_t& off)
|
||||
} // detail
|
||||
|
||||
|
||||
typedef object_handle unpacked;
|
||||
|
||||
class unpacker {
|
||||
public:
|
||||
unpacker(unpack_reference_func f = &unpacker::default_reference_func,
|
||||
@ -1120,8 +1118,6 @@ private:
|
||||
#endif // defined(MSGPACK_USE_CPP03)
|
||||
};
|
||||
|
||||
#if !defined(MSGPACK_USE_CPP03)
|
||||
|
||||
unpacked unpack(
|
||||
const char* data, std::size_t len, std::size_t& off, bool& referenced,
|
||||
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_limit const& limit = unpack_limit());
|
||||
|
||||
#endif // !defined(MSGPACK_USE_CPP03)
|
||||
|
||||
|
||||
void unpack(unpacked& result,
|
||||
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
|
||||
|
||||
#if !defined(MSGPACK_USE_CPP03)
|
||||
|
||||
inline unpacked unpack(
|
||||
const char* data, std::size_t len, std::size_t& off, bool& referenced,
|
||||
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);
|
||||
}
|
||||
|
||||
#endif // !defined(MSGPACK_USE_CPP03)
|
||||
|
||||
inline void unpack(unpacked& result,
|
||||
const char* data, std::size_t len, std::size_t& off, bool& referenced,
|
||||
unpack_reference_func f, void* user_data, unpack_limit const& limit)
|
||||
|
@ -352,9 +352,6 @@ TEST(object, clone_int)
|
||||
h = msgpack::clone(obj);
|
||||
EXPECT_EQ(h.get(), obj);
|
||||
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)
|
||||
@ -369,9 +366,6 @@ TEST(object, clone_str)
|
||||
h = msgpack::clone(obj);
|
||||
EXPECT_EQ(h.get(), obj);
|
||||
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)
|
||||
@ -389,9 +383,6 @@ TEST(object, clone_bin)
|
||||
h = msgpack::clone(obj);
|
||||
EXPECT_EQ(h.get(), obj);
|
||||
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)
|
||||
@ -409,9 +400,6 @@ TEST(object, clone_array)
|
||||
h = msgpack::clone(obj);
|
||||
EXPECT_EQ(h.get(), obj);
|
||||
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)
|
||||
@ -429,7 +417,4 @@ TEST(object, clone_map)
|
||||
h = msgpack::clone(obj);
|
||||
EXPECT_EQ(h.get(), obj);
|
||||
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)
|
||||
{
|
||||
msgpack::sbuffer sbuf;
|
||||
@ -97,8 +95,6 @@ TEST(unpack, int_ret_offset_ref)
|
||||
EXPECT_EQ(off, sbuf.size());
|
||||
}
|
||||
|
||||
#endif // !defined(MSGPACK_USE_CPP03)
|
||||
|
||||
|
||||
TEST(unpack, int_no_offset_no_ref)
|
||||
{
|
||||
@ -290,3 +286,37 @@ TEST(unpack, sequence)
|
||||
|
||||
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