From 31a06a0682d3745736176a7d8e74bce4295c85f6 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Mon, 21 Mar 2016 22:34:57 +0900 Subject: [PATCH] Removed obsolete APIs form v2. Removed MSGPACK_DISABLE_LEGACY_CONVERT from v2. Those APIs are removed from v2. --- CMakeLists.txt | 171 ++++++++++++++++-- QUICKSTART-CPP.md | 8 +- README.md | 4 +- example/cpp03/CMakeLists.txt | 7 +- include/msgpack/object.hpp | 1 + .../msgpack/v1/adaptor/adaptor_base_decl.hpp | 2 +- include/msgpack/v1/object.hpp | 31 ++-- include/msgpack/v1/object_fwd.hpp | 17 +- include/msgpack/v1/unpack.hpp | 38 ++-- include/msgpack/v2/object.hpp | 33 ++++ include/msgpack/v2/object_decl.hpp | 12 -- include/msgpack/v2/object_fwd.hpp | 44 +++++ include/msgpack/v2/object_fwd_decl.hpp | 3 +- src/Makefile.am | 1 + test/Makefile.am | 2 +- test/convert.cpp | 4 +- test/user_class.cpp | 64 +++++++ 17 files changed, 362 insertions(+), 80 deletions(-) create mode 100644 include/msgpack/v2/object.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index e1aeec6d..2a026e4a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,9 +21,6 @@ OPTION (MSGPACK_CXX11 "Using c++11 compiler" OFF) OPTION (MSGPACK_32BIT "32bit compile" OFF) OPTION (MSGPACK_BOOST "Using boost libraries" OFF) -SET (CMAKE_CXX_FLAGS "-DMSGPACK_DISABLE_LEGACY_NIL ${CMAKE_CXX_FLAGS}") -SET (CMAKE_CXX_FLAGS "-DMSGPACK_DISABLE_LEGACY_CONVERT ${CMAKE_CXX_FLAGS}") - IF (APPLE) SET(CMAKE_MACOSX_RPATH ON) SET(CMAKE_SKIP_BUILD_RPATH FALSE) @@ -177,14 +174,18 @@ IF (MSGPACK_ENABLE_CXX) LIST (APPEND msgpack_HEADERS include/msgpack.hpp include/msgpack/adaptor/adaptor_base.hpp + include/msgpack/adaptor/adaptor_base_decl.hpp include/msgpack/adaptor/array_ref.hpp + include/msgpack/adaptor/array_ref_decl.hpp include/msgpack/adaptor/bool.hpp include/msgpack/adaptor/boost/fusion.hpp include/msgpack/adaptor/boost/msgpack_variant.hpp + include/msgpack/adaptor/boost/msgpack_variant_decl.hpp include/msgpack/adaptor/boost/optional.hpp include/msgpack/adaptor/boost/string_ref.hpp include/msgpack/adaptor/char_ptr.hpp include/msgpack/adaptor/check_container_size.hpp + include/msgpack/adaptor/check_container_size_decl.hpp include/msgpack/adaptor/cpp11/array.hpp include/msgpack/adaptor/cpp11/array_char.hpp include/msgpack/adaptor/cpp11/array_unsigned_char.hpp @@ -196,49 +197,195 @@ IF (MSGPACK_ENABLE_CXX) include/msgpack/adaptor/cpp11/unordered_map.hpp include/msgpack/adaptor/cpp11/unordered_set.hpp include/msgpack/adaptor/define.hpp + include/msgpack/adaptor/define_decl.hpp include/msgpack/adaptor/deque.hpp - include/msgpack/adaptor/detail/cpp03_define_array.hpp - include/msgpack/adaptor/detail/cpp03_define_map.hpp - include/msgpack/adaptor/detail/cpp03_msgpack_tuple.hpp - include/msgpack/adaptor/detail/cpp11_define_array.hpp - include/msgpack/adaptor/detail/cpp11_define_map.hpp - include/msgpack/adaptor/detail/cpp11_msgpack_tuple.hpp include/msgpack/adaptor/ext.hpp + include/msgpack/adaptor/ext_decl.hpp include/msgpack/adaptor/fixint.hpp + include/msgpack/adaptor/fixint_decl.hpp include/msgpack/adaptor/float.hpp include/msgpack/adaptor/int.hpp + include/msgpack/adaptor/int_decl.hpp include/msgpack/adaptor/list.hpp include/msgpack/adaptor/map.hpp + include/msgpack/adaptor/map_decl.hpp include/msgpack/adaptor/msgpack_tuple.hpp + include/msgpack/adaptor/msgpack_tuple_decl.hpp include/msgpack/adaptor/nil.hpp + include/msgpack/adaptor/nil_decl.hpp include/msgpack/adaptor/pair.hpp include/msgpack/adaptor/raw.hpp - include/msgpack/adaptor/v4raw.hpp + include/msgpack/adaptor/raw_decl.hpp include/msgpack/adaptor/set.hpp include/msgpack/adaptor/string.hpp include/msgpack/adaptor/tr1/unordered_map.hpp include/msgpack/adaptor/tr1/unordered_set.hpp + include/msgpack/adaptor/v4raw.hpp + include/msgpack/adaptor/v4raw_decl.hpp include/msgpack/adaptor/vector.hpp include/msgpack/adaptor/vector_bool.hpp include/msgpack/adaptor/vector_char.hpp include/msgpack/adaptor/vector_unsigned_char.hpp include/msgpack/cpp_config.hpp - include/msgpack/detail/cpp03_zone.hpp - include/msgpack/detail/cpp11_zone.hpp + include/msgpack/cpp_config_decl.hpp include/msgpack/fbuffer.hpp + include/msgpack/fbuffer_decl.hpp include/msgpack/iterator.hpp + include/msgpack/iterator_decl.hpp include/msgpack/meta.hpp + include/msgpack/meta_decl.hpp include/msgpack/object.hpp + include/msgpack/object_decl.hpp include/msgpack/object_fwd.hpp + include/msgpack/object_fwd_decl.hpp include/msgpack/pack.hpp + include/msgpack/pack_decl.hpp include/msgpack/sbuffer.hpp + include/msgpack/sbuffer_decl.hpp include/msgpack/type.hpp include/msgpack/unpack.hpp + include/msgpack/unpack_decl.hpp + include/msgpack/v1/adaptor/adaptor_base.hpp + include/msgpack/v1/adaptor/adaptor_base_decl.hpp + include/msgpack/v1/adaptor/array_ref.hpp + include/msgpack/v1/adaptor/array_ref_decl.hpp + include/msgpack/v1/adaptor/bool.hpp + include/msgpack/v1/adaptor/boost/fusion.hpp + include/msgpack/v1/adaptor/boost/msgpack_variant.hpp + include/msgpack/v1/adaptor/boost/msgpack_variant_decl.hpp + include/msgpack/v1/adaptor/boost/optional.hpp + include/msgpack/v1/adaptor/boost/string_ref.hpp + include/msgpack/v1/adaptor/char_ptr.hpp + include/msgpack/v1/adaptor/check_container_size.hpp + include/msgpack/v1/adaptor/check_container_size_decl.hpp + include/msgpack/v1/adaptor/cpp11/array.hpp + include/msgpack/v1/adaptor/cpp11/array_char.hpp + include/msgpack/v1/adaptor/cpp11/array_unsigned_char.hpp + include/msgpack/v1/adaptor/cpp11/forward_list.hpp + include/msgpack/v1/adaptor/cpp11/reference_wrapper.hpp + include/msgpack/v1/adaptor/cpp11/shared_ptr.hpp + include/msgpack/v1/adaptor/cpp11/tuple.hpp + include/msgpack/v1/adaptor/cpp11/unique_ptr.hpp + include/msgpack/v1/adaptor/cpp11/unordered_map.hpp + include/msgpack/v1/adaptor/cpp11/unordered_set.hpp + include/msgpack/v1/adaptor/define.hpp + include/msgpack/v1/adaptor/define_decl.hpp + include/msgpack/v1/adaptor/deque.hpp + include/msgpack/v1/adaptor/detail/cpp03_define_array.hpp + include/msgpack/v1/adaptor/detail/cpp03_define_array_decl.hpp + include/msgpack/v1/adaptor/detail/cpp03_define_map.hpp + include/msgpack/v1/adaptor/detail/cpp03_define_map_decl.hpp + include/msgpack/v1/adaptor/detail/cpp03_msgpack_tuple.hpp + include/msgpack/v1/adaptor/detail/cpp03_msgpack_tuple_decl.hpp + include/msgpack/v1/adaptor/detail/cpp11_define_array.hpp + include/msgpack/v1/adaptor/detail/cpp11_define_array_decl.hpp + include/msgpack/v1/adaptor/detail/cpp11_define_map.hpp + include/msgpack/v1/adaptor/detail/cpp11_define_map_decl.hpp + include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple.hpp + include/msgpack/v1/adaptor/detail/cpp11_msgpack_tuple_decl.hpp + include/msgpack/v1/adaptor/ext.hpp + include/msgpack/v1/adaptor/ext_decl.hpp + include/msgpack/v1/adaptor/fixint.hpp + include/msgpack/v1/adaptor/fixint_decl.hpp + include/msgpack/v1/adaptor/float.hpp + include/msgpack/v1/adaptor/int.hpp + include/msgpack/v1/adaptor/int_decl.hpp + include/msgpack/v1/adaptor/list.hpp + include/msgpack/v1/adaptor/map.hpp + include/msgpack/v1/adaptor/map_decl.hpp + include/msgpack/v1/adaptor/msgpack_tuple.hpp + include/msgpack/v1/adaptor/msgpack_tuple_decl.hpp + include/msgpack/v1/adaptor/nil.hpp + include/msgpack/v1/adaptor/nil_decl.hpp + include/msgpack/v1/adaptor/pair.hpp + include/msgpack/v1/adaptor/raw.hpp + include/msgpack/v1/adaptor/raw_decl.hpp + include/msgpack/v1/adaptor/set.hpp + include/msgpack/v1/adaptor/string.hpp + include/msgpack/v1/adaptor/tr1/unordered_map.hpp + include/msgpack/v1/adaptor/tr1/unordered_set.hpp + include/msgpack/v1/adaptor/v4raw.hpp + include/msgpack/v1/adaptor/v4raw_decl.hpp + include/msgpack/v1/adaptor/vector.hpp + include/msgpack/v1/adaptor/vector_bool.hpp + include/msgpack/v1/adaptor/vector_char.hpp + include/msgpack/v1/adaptor/vector_unsigned_char.hpp + include/msgpack/v1/cpp_config.hpp + include/msgpack/v1/cpp_config_decl.hpp + include/msgpack/v1/detail/cpp03_zone.hpp + include/msgpack/v1/detail/cpp03_zone_decl.hpp + include/msgpack/v1/detail/cpp11_zone.hpp + include/msgpack/v1/detail/cpp11_zone_decl.hpp + include/msgpack/v1/fbuffer.hpp + include/msgpack/v1/fbuffer_decl.hpp + include/msgpack/v1/iterator.hpp + include/msgpack/v1/iterator_decl.hpp + include/msgpack/v1/meta.hpp + include/msgpack/v1/meta_decl.hpp + include/msgpack/v1/object.hpp + include/msgpack/v1/object_decl.hpp + include/msgpack/v1/object_fwd.hpp + include/msgpack/v1/object_fwd_decl.hpp + include/msgpack/v1/pack.hpp + include/msgpack/v1/pack_decl.hpp + include/msgpack/v1/preprocessor.hpp + include/msgpack/v1/sbuffer.hpp + include/msgpack/v1/sbuffer_decl.hpp + include/msgpack/v1/type.hpp + include/msgpack/v1/unpack.hpp + include/msgpack/v1/unpack_decl.hpp + include/msgpack/v1/version.hpp + include/msgpack/v1/versioning.hpp + include/msgpack/v1/vrefbuffer.hpp + include/msgpack/v1/vrefbuffer_decl.hpp + include/msgpack/v1/zbuffer.hpp + include/msgpack/v1/zbuffer_decl.hpp + include/msgpack/v1/zone.hpp + include/msgpack/v1/zone_decl.hpp + include/msgpack/v2/adaptor/adaptor_base.hpp + include/msgpack/v2/adaptor/adaptor_base_decl.hpp + include/msgpack/v2/adaptor/array_ref_decl.hpp + include/msgpack/v2/adaptor/boost/msgpack_variant_decl.hpp + include/msgpack/v2/adaptor/check_container_size_decl.hpp + include/msgpack/v2/adaptor/define_decl.hpp + include/msgpack/v2/adaptor/detail/cpp03_define_array_decl.hpp + include/msgpack/v2/adaptor/detail/cpp03_define_map_decl.hpp + include/msgpack/v2/adaptor/detail/cpp03_msgpack_tuple_decl.hpp + include/msgpack/v2/adaptor/detail/cpp11_define_array_decl.hpp + include/msgpack/v2/adaptor/detail/cpp11_define_map_decl.hpp + include/msgpack/v2/adaptor/detail/cpp11_msgpack_tuple_decl.hpp + include/msgpack/v2/adaptor/ext_decl.hpp + include/msgpack/v2/adaptor/fixint_decl.hpp + include/msgpack/v2/adaptor/int_decl.hpp + include/msgpack/v2/adaptor/map_decl.hpp + include/msgpack/v2/adaptor/msgpack_tuple_decl.hpp + include/msgpack/v2/adaptor/nil_decl.hpp + include/msgpack/v2/adaptor/raw_decl.hpp + include/msgpack/v2/adaptor/v4raw_decl.hpp + include/msgpack/v2/cpp_config_decl.hpp + include/msgpack/v2/detail/cpp03_zone_decl.hpp + include/msgpack/v2/detail/cpp11_zone_decl.hpp + include/msgpack/v2/fbuffer_decl.hpp + include/msgpack/v2/iterator_decl.hpp + include/msgpack/v2/meta_decl.hpp + include/msgpack/v2/object.hpp + include/msgpack/v2/object_decl.hpp + include/msgpack/v2/object_fwd.hpp + include/msgpack/v2/object_fwd_decl.hpp + include/msgpack/v2/pack_decl.hpp + include/msgpack/v2/sbuffer_decl.hpp + include/msgpack/v2/unpack_decl.hpp + include/msgpack/v2/vrefbuffer_decl.hpp + include/msgpack/v2/zbuffer_decl.hpp + include/msgpack/v2/zone_decl.hpp include/msgpack/version.hpp include/msgpack/versioning.hpp include/msgpack/vrefbuffer.hpp + include/msgpack/vrefbuffer_decl.hpp include/msgpack/zbuffer.hpp + include/msgpack/zbuffer_decl.hpp include/msgpack/zone.hpp + include/msgpack/zone_decl.hpp ) FILE (GLOB_RECURSE PREPROCESSOR_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/include/msgpack/preprocessor/*.hpp) diff --git a/QUICKSTART-CPP.md b/QUICKSTART-CPP.md index a4c4a7d7..1d112565 100644 --- a/QUICKSTART-CPP.md +++ b/QUICKSTART-CPP.md @@ -47,13 +47,11 @@ int main(void) { Compile it as follows: ``` -$ g++ -Ipath_to_msgpack/include -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT hello.cc -o hello +$ g++ -Ipath_to_msgpack/include hello.cc -o hello $ ./hello ["Hello", "MessagePack"] ``` -See [MSGPACK_DISABLE_LEGACY_NIL](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_nil-since-140) and [MSGPACK_DISABLE_LEGACY_CONVERT](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_convert-since-140). - ## Streaming feature ```cpp @@ -85,7 +83,7 @@ int main(void) { } // results: - // $ g++ -Ipath_to_msgpack/include -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT stream.cc -o stream + // $ g++ -Ipath_to_msgpack/include stream.cc -o stream // $ ./stream // "Log message ... 1" // "Log message ... 2" @@ -93,8 +91,6 @@ int main(void) { } ``` -See [MSGPACK_DISABLE_LEGACY_NIL](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_nil-since-140) and [MSGPACK_DISABLE_LEGACY_CONVERT](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_convert-since-140). - ### Streaming into an array or map ```cpp diff --git a/README.md b/README.md index 36df9a52..f66f7bb2 100644 --- a/README.md +++ b/README.md @@ -113,9 +113,7 @@ Usage When you use msgpack on C++03 and C++11, you can just add msgpack-c/include to your include path: - g++ -I msgpack-c/include -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT your_source_file.cpp - -See [MSGPACK_DISABLE_LEGACY_NIL](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_nil-since-140) and [MSGPACK_DISABLE_LEGACY_CONVERT](https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_configure#msgpack_disable_legacy_convert-since-140). + g++ -I msgpack-c/include your_source_file.cpp If you want to use C version of msgpack, you need to build it. You can also install the C and C++ versions of msgpack. diff --git a/example/cpp03/CMakeLists.txt b/example/cpp03/CMakeLists.txt index 1e5c02a2..88e8b88d 100644 --- a/example/cpp03/CMakeLists.txt +++ b/example/cpp03/CMakeLists.txt @@ -5,12 +5,17 @@ LIST (APPEND exec_PROGRAMS custom.cpp enum.cpp map_based_versionup.cpp - protocol.cpp protocol_new.cpp reuse_zone.cpp simple.cpp ) +IF (MSGPACK_DEFAULT_API_VERSION EQUAL 1) + LIST (APPEND exec_PROGRAMS + protocol.cpp + ) +ENDIF () + IF (NOT MSVC) LIST (APPEND with_pthread_PROGRAMS stream.cpp diff --git a/include/msgpack/object.hpp b/include/msgpack/object.hpp index 4843d994..32799926 100644 --- a/include/msgpack/object.hpp +++ b/include/msgpack/object.hpp @@ -13,5 +13,6 @@ #include "msgpack/object_decl.hpp" #include "msgpack/v1/object.hpp" +#include "msgpack/v2/object.hpp" #endif // MSGPACK_OBJECT_HPP diff --git a/include/msgpack/v1/adaptor/adaptor_base_decl.hpp b/include/msgpack/v1/adaptor/adaptor_base_decl.hpp index c3718bc3..13bef574 100644 --- a/include/msgpack/v1/adaptor/adaptor_base_decl.hpp +++ b/include/msgpack/v1/adaptor/adaptor_base_decl.hpp @@ -43,7 +43,7 @@ struct object_with_zone; // operators template - msgpack::object const& operator>> (msgpack::object const& o, T& v); +msgpack::object const& operator>> (msgpack::object const& o, T& v); template msgpack::packer& operator<< (msgpack::packer& o, T const& v); diff --git a/include/msgpack/v1/object.hpp b/include/msgpack/v1/object.hpp index 941f0f59..07b5bcb4 100644 --- a/include/msgpack/v1/object.hpp +++ b/include/msgpack/v1/object.hpp @@ -26,6 +26,19 @@ namespace msgpack { MSGPACK_API_VERSION_NAMESPACE(v1) { /// @endcond +struct object_kv { + msgpack::object key; + msgpack::object val; +}; + +struct object::with_zone : msgpack::object { + with_zone(msgpack::zone& z) : zone(z) { } + msgpack::zone& zone; +private: + with_zone(); +}; + + /// The class holds object and zone class object_handle { public: @@ -171,16 +184,8 @@ inline object_handle clone(msgpack::object const& obj) { return object_handle(newobj, msgpack::move(z)); } -struct object::implicit_type { - implicit_type(object const& o) : obj(o) { } - ~implicit_type() { } - - template - operator T() { return obj.as(); } - -private: - msgpack::object const& obj; -}; +template +inline object::implicit_type::operator T() { return obj.as(); } namespace detail { template @@ -515,9 +520,9 @@ inline bool operator!=(const T& y, const msgpack::object& x) { return x != y; } -inline msgpack::object::implicit_type object::convert() const +inline object::implicit_type object::convert() const { - return msgpack::object::implicit_type(*this); + return object::implicit_type(*this); } template @@ -580,7 +585,7 @@ inline object::object() template inline object::object(const T& v) { - msgpack::operator<<(*this, v); + *this << v; } template diff --git a/include/msgpack/v1/object_fwd.hpp b/include/msgpack/v1/object_fwd.hpp index 8edb5371..9f6a931f 100644 --- a/include/msgpack/v1/object_fwd.hpp +++ b/include/msgpack/v1/object_fwd.hpp @@ -212,7 +212,7 @@ struct object { struct with_zone; -private: +protected: struct implicit_type; public: @@ -221,16 +221,15 @@ public: class type_error : public std::bad_cast { }; -struct object_kv { - msgpack::object key; - msgpack::object val; -}; +struct object::implicit_type { + implicit_type(object const& o) : obj(o) { } + ~implicit_type() { } + + template + operator T(); -struct object::with_zone : object { - with_zone(msgpack::zone& z) : zone(z) { } - msgpack::zone& zone; private: - with_zone(); + object const& obj; }; /// @cond diff --git a/include/msgpack/v1/unpack.hpp b/include/msgpack/v1/unpack.hpp index c65d2bbe..cc18b05c 100644 --- a/include/msgpack/v1/unpack.hpp +++ b/include/msgpack/v1/unpack.hpp @@ -1003,7 +1003,7 @@ public: * This function is obsolete. Use the reference inteface version of next() function instead of * the pointer interface version. */ - bool next(object_handle* result); + bool next(msgpack::object_handle* result); /// Unpack one msgpack::object. /** @@ -1019,7 +1019,7 @@ public: * See: * https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_unpacker#msgpack-controls-a-buffer */ - bool next(object_handle& result, bool& referenced); + bool next(msgpack::object_handle& result, bool& referenced); /// Unpack one msgpack::object. /** @@ -1033,7 +1033,7 @@ public: * See: * https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_unpacker#msgpack-controls-a-buffer */ - bool next(object_handle& result); + bool next(msgpack::object_handle& result); /// Get message size. /** @@ -1281,7 +1281,7 @@ inline void unpacker::buffer_consumed(std::size_t size) m_free -= size; } -inline bool unpacker::next(object_handle& result, bool& referenced) +inline bool unpacker::next(msgpack::object_handle& result, bool& referenced) { referenced = false; int ret = execute_imp(); @@ -1291,7 +1291,7 @@ inline bool unpacker::next(object_handle& result, bool& referenced) if(ret == 0) { result.zone().reset(); - result.set(object()); + result.set(msgpack::object()); return false; } else { @@ -1303,13 +1303,13 @@ inline bool unpacker::next(object_handle& result, bool& referenced) } } -inline bool unpacker::next(object_handle& result) +inline bool unpacker::next(msgpack::object_handle& result) { bool referenced; return next(result, referenced); } -inline bool unpacker::next(object_handle* result) +inline bool unpacker::next(msgpack::object_handle* result) { return next(*result); } @@ -1461,7 +1461,7 @@ unpack_imp(const char* data, std::size_t len, std::size_t& off, // reference version -inline object_handle unpack( +inline msgpack::object_handle 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 @@ -1477,20 +1477,20 @@ inline object_handle unpack( switch(ret) { case UNPACK_SUCCESS: off = noff; - return object_handle(obj, msgpack::move(z)); + return msgpack::object_handle(obj, msgpack::move(z)); case UNPACK_EXTRA_BYTES: off = noff; - return object_handle(obj, msgpack::move(z)); + return msgpack::object_handle(obj, msgpack::move(z)); case UNPACK_CONTINUE: throw msgpack::insufficient_bytes("insufficient bytes"); case UNPACK_PARSE_ERROR: default: throw msgpack::parse_error("parse error"); } - return object_handle(); + return msgpack::object_handle(); } -inline object_handle unpack( +inline msgpack::object_handle unpack( const char* data, std::size_t len, std::size_t& off, unpack_reference_func f, void* user_data, unpack_limit const& limit) @@ -1499,7 +1499,7 @@ inline object_handle unpack( return unpack(data, len, off, referenced, f, user_data, limit); } -inline object_handle unpack( +inline msgpack::object_handle unpack( const char* data, std::size_t len, bool& referenced, unpack_reference_func f, void* user_data, unpack_limit const& limit) @@ -1508,7 +1508,7 @@ inline object_handle unpack( return unpack(data, len, off, referenced, f, user_data, limit); } -inline object_handle unpack( +inline msgpack::object_handle unpack( const char* data, std::size_t len, unpack_reference_func f, void* user_data, unpack_limit const& limit) @@ -1519,7 +1519,7 @@ inline object_handle unpack( } inline void unpack( - object_handle& result, + msgpack::object_handle& 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) @@ -1551,7 +1551,7 @@ inline void unpack( } inline void unpack( - object_handle& result, + msgpack::object_handle& result, const char* data, std::size_t len, std::size_t& off, unpack_reference_func f, void* user_data, unpack_limit const& limit) @@ -1561,7 +1561,7 @@ inline void unpack( } inline void unpack( - object_handle& result, + msgpack::object_handle& result, const char* data, std::size_t len, bool& referenced, unpack_reference_func f, void* user_data, unpack_limit const& limit) @@ -1571,7 +1571,7 @@ inline void unpack( } inline void unpack( - object_handle& result, + msgpack::object_handle& result, const char* data, std::size_t len, unpack_reference_func f, void* user_data, unpack_limit const& limit) @@ -1644,7 +1644,7 @@ inline msgpack::object unpack( // obsolete // pointer version inline void unpack( - object_handle* result, + msgpack::object_handle* 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/include/msgpack/v2/object.hpp b/include/msgpack/v2/object.hpp new file mode 100644 index 00000000..f267fe12 --- /dev/null +++ b/include/msgpack/v2/object.hpp @@ -0,0 +1,33 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2016 KONDO Takatoshi +// +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) +// +#ifndef MSGPACK_V2_OBJECT_HPP +#define MSGPACK_V2_OBJECT_HPP + +#include "msgpack/object_fwd.hpp" + + +namespace msgpack { + +/// @cond +MSGPACK_API_VERSION_NAMESPACE(v2) { +/// @endcond + +inline object::implicit_type object::convert() const +{ + return v1::object::convert(); +} + +/// @cond +} // MSGPACK_API_VERSION_NAMESPACE(v2) +/// @endcond + +} // namespace msgpack + +#endif // MSGPACK_V2_OBJECT_HPP diff --git a/include/msgpack/v2/object_decl.hpp b/include/msgpack/v2/object_decl.hpp index 5441dba5..bb66a390 100644 --- a/include/msgpack/v2/object_decl.hpp +++ b/include/msgpack/v2/object_decl.hpp @@ -37,21 +37,9 @@ using v1::detail::packer_serializer; } // namespace detail -// obsolete -using v1::define; - using v1::operator==; using v1::operator!=; -// obsolete -using v1::convert; - -// obsolete -using v1::pack; - -// obsolete -using v1::pack_copy; - /// @cond } // MSGPACK_API_VERSION_NAMESPACE(v2) /// @endcond diff --git a/include/msgpack/v2/object_fwd.hpp b/include/msgpack/v2/object_fwd.hpp index 7ddbdd65..4ada56b5 100644 --- a/include/msgpack/v2/object_fwd.hpp +++ b/include/msgpack/v2/object_fwd.hpp @@ -12,6 +12,7 @@ #define MSGPACK_V2_OBJECT_FWD_HPP #include "msgpack/v2/object_fwd_decl.hpp" +#include "msgpack/object_fwd.hpp" namespace msgpack { @@ -19,6 +20,49 @@ namespace msgpack { MSGPACK_API_VERSION_NAMESPACE(v2) { /// @endcond +struct object : v1::object { + object() {} + object(v1::object const& o):v1::object(o) {} + /// Construct object from T + /** + * If `v` is the type that is corresponding to MessegePack format str, bin, ext, array, or map, + * you need to call `object(const T& v, msgpack::zone& z)` instead of this constructor. + * + * @tparam T The type of `v`. + * @param v The value you want to convert. + */ + template + explicit object(const T& v) { + *this << v; + } + + /// Construct object from T + /** + * The object is constructed on the zone `z`. + * See https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_object + * + * @tparam T The type of `v`. + * @param v The value you want to convert. + * @param z The zone that is used by the object. + */ + template + object(const T& v, msgpack::zone& z):v1::object(v, z) {} + +public: + /// Convert the object + /** + * If the object can't be converted to T, msgpack::type_error would be thrown. + * @tparam T The type of v. + * @param v The value you want to get. `v` is output parameter. `v` is overwritten by converted value from the object. + * @return The reference of `v`. + */ + template + T& convert(T& v) const { return v1::object::convert(v); } + + using v1::object::with_zone; + implicit_type convert() const; +}; + #if !defined(MSGPACK_USE_CPP03) namespace adaptor { diff --git a/include/msgpack/v2/object_fwd_decl.hpp b/include/msgpack/v2/object_fwd_decl.hpp index ab1e4468..92bd29b1 100644 --- a/include/msgpack/v2/object_fwd_decl.hpp +++ b/include/msgpack/v2/object_fwd_decl.hpp @@ -36,7 +36,8 @@ using v1::type::MAP; using v1::type::EXT; } // namespace type -using v1::object; +struct object; + using v1::object_kv; using v1::object_array; diff --git a/src/Makefile.am b/src/Makefile.am index e825c599..5c8f77c7 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -357,6 +357,7 @@ nobase_include_HEADERS += \ ../include/msgpack/v2/fbuffer_decl.hpp \ ../include/msgpack/v2/iterator_decl.hpp \ ../include/msgpack/v2/meta_decl.hpp \ + ../include/msgpack/v2/object.hpp \ ../include/msgpack/v2/object_decl.hpp \ ../include/msgpack/v2/object_fwd.hpp \ ../include/msgpack/v2/object_fwd_decl.hpp \ diff --git a/test/Makefile.am b/test/Makefile.am index 3ce6a568..5f451d02 100644 --- a/test/Makefile.am +++ b/test/Makefile.am @@ -1,4 +1,4 @@ -AM_CPPFLAGS = -I$(top_srcdir)/include -pthread -DMSGPACK_DISABLE_LEGACY_NIL -DMSGPACK_DISABLE_LEGACY_CONVERT +AM_CPPFLAGS = -I$(top_srcdir)/include -pthread AM_C_CPPFLAGS = -I$(top_srcdir)/include -pthread AM_LDFLAGS = $(top_builddir)/src/libmsgpackc.la -lgtest_main -lgtest -lpthread diff --git a/test/convert.cpp b/test/convert.cpp index ae63a0ea..784fe8f2 100644 --- a/test/convert.cpp +++ b/test/convert.cpp @@ -84,7 +84,7 @@ TEST(convert, return_value_ref) EXPECT_EQ(i, j); } -#if !defined(MSGPACK_DISABLE_LEGACY_CONVERT) +#if MSGPACK_DEFAULT_API_VERSION == 1 && !defined(MSGPACK_DISABLE_LEGACY_CONVERT) TEST(convert, return_value_ptr) { @@ -96,7 +96,7 @@ TEST(convert, return_value_ptr) EXPECT_EQ(1, i); } -#endif // !defined(MSGPACK_DISABLE_LEGACY_CONVERT) +#endif // MSGPACK_DEFAULT_API_VERSION == 1 && !defined(MSGPACK_DISABLE_LEGACY_CONVERT) TEST(convert, if_not_nil_nil) { diff --git a/test/user_class.cpp b/test/user_class.cpp index 787417ae..78e8987e 100644 --- a/test/user_class.cpp +++ b/test/user_class.cpp @@ -459,3 +459,67 @@ TEST(MSGPACK_MIGRATION, order_number_changed) EXPECT_EQ(v2.s, "foo"); // from v1 EXPECT_EQ(v2.i, 42); // from v1 } + +// non intrusive with operator << + +class test_non_intrusive { +public: + const std::string& name() const { return m_name; } + void set_name(const std::string& name) { m_name = name; } +private: + std::string m_name; +}; + +namespace msgpack { +MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) { +namespace adaptor { + +template<> +struct convert +{ + msgpack::object const& operator()( + msgpack::object const& o, + test_non_intrusive& t) const { + t.set_name(o.as()); + return o; + } +}; + +template<> +struct pack +{ + template + msgpack::packer& operator()( + msgpack::packer& p, + test_non_intrusive const& t) const { + p.pack(t.name()); + return p; + } +}; + +template <> +struct object_with_zone +{ + void operator()( + msgpack::object::with_zone& o, + const test_non_intrusive& t) const { + o << t.name(); + } +}; + +} // namespace adaptor +} // MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS) +} // namespace msgpack + +TEST(MSGPACK_USER_DEFINED, test_non_intrusive) +{ + test_non_intrusive t1; + msgpack::sbuffer sbuf; + msgpack::pack(sbuf, t1); + + msgpack::object_handle oh = + msgpack::unpack(sbuf.data(), sbuf.size()); + test_non_intrusive t2 = oh.get().as(); + + EXPECT_EQ(t1.name(), t2.name()); +}