Separated unpacked from object_handle to preserve the original ABI.

This commit is contained in:
Takatoshi Kondo 2015-05-26 09:27:35 +09:00
parent 9cb2c91d58
commit f75da23e1d
4 changed files with 108 additions and 33 deletions

View File

@ -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:

View File

@ -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)

View File

@ -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()));
} }

View File

@ -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)