diff --git a/include/msgpack/object.hpp b/include/msgpack/object.hpp index 9fcaf130..337df50a 100644 --- a/include/msgpack/object.hpp +++ b/include/msgpack/object.hpp @@ -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 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& zone() + { return m_zone; } + + const msgpack::unique_ptr& 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 m_zone; +}; + class object_handle { public: object_handle() {} @@ -43,10 +104,6 @@ public: object_handle(msgpack::object const& obj, msgpack::unique_ptr 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: diff --git a/include/msgpack/unpack.hpp b/include/msgpack/unpack.hpp index cf009d3a..d033ee20 100644 --- a/include/msgpack/unpack.hpp +++ b/include/msgpack/unpack.hpp @@ -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) diff --git a/test/object.cpp b/test/object.cpp index deadd1e1..ec271824 100644 --- a/test/object.cpp +++ b/test/object.cpp @@ -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())); } diff --git a/test/pack_unpack.cpp b/test/pack_unpack.cpp index ee909661..b4f8fb48 100644 --- a/test/pack_unpack.cpp +++ b/test/pack_unpack.cpp @@ -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()); + +} + +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()); + +} + +#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()); + +} +#endif // !defined(MSGPACK_USE_CPP03)