From 1f515b3ae77b14b198511f0a6b03dd54420ab056 Mon Sep 17 00:00:00 2001 From: Takatoshi Kondo Date: Sun, 15 Jan 2017 19:09:31 +0900 Subject: [PATCH] Added boost string_view adaptor. --- include/msgpack/adaptor/boost/string_view.hpp | 15 ++++ include/msgpack/type.hpp | 1 + .../msgpack/v1/adaptor/boost/string_view.hpp | 87 +++++++++++++++++++ test/CMakeLists.txt | 1 + test/boost_string_view.cpp | 47 ++++++++++ 5 files changed, 151 insertions(+) create mode 100644 include/msgpack/adaptor/boost/string_view.hpp create mode 100644 include/msgpack/v1/adaptor/boost/string_view.hpp create mode 100644 test/boost_string_view.cpp diff --git a/include/msgpack/adaptor/boost/string_view.hpp b/include/msgpack/adaptor/boost/string_view.hpp new file mode 100644 index 00000000..ccf272cf --- /dev/null +++ b/include/msgpack/adaptor/boost/string_view.hpp @@ -0,0 +1,15 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2017 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_TYPE_BOOST_STRING_VIEW_HPP +#define MSGPACK_TYPE_BOOST_STRING_VIEW_HPP + +#include "msgpack/v1/adaptor/boost/string_view.hpp" + +#endif // MSGPACK_TYPE_BOOST_STRING_VIEW_HPP diff --git a/include/msgpack/type.hpp b/include/msgpack/type.hpp index bca42266..7fd49e53 100644 --- a/include/msgpack/type.hpp +++ b/include/msgpack/type.hpp @@ -50,5 +50,6 @@ #include "adaptor/boost/msgpack_variant.hpp" #include "adaptor/boost/optional.hpp" #include "adaptor/boost/string_ref.hpp" +#include "adaptor/boost/string_view.hpp" #endif // defined(MSGPACK_USE_BOOST) diff --git a/include/msgpack/v1/adaptor/boost/string_view.hpp b/include/msgpack/v1/adaptor/boost/string_view.hpp new file mode 100644 index 00000000..e3023ca3 --- /dev/null +++ b/include/msgpack/v1/adaptor/boost/string_view.hpp @@ -0,0 +1,87 @@ +// +// MessagePack for C++ static resolution routine +// +// Copyright (C) 2017 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_V1_TYPE_BOOST_STRING_VIEW_HPP +#define MSGPACK_V1_TYPE_BOOST_STRING_VIEW_HPP + +#include +#if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 61 + +#include "msgpack/versioning.hpp" +#include "msgpack/adaptor/adaptor_base.hpp" +#include "msgpack/adaptor/check_container_size.hpp" + +#include + +namespace msgpack { + +/// @cond +MSGPACK_API_VERSION_NAMESPACE(v1) { +/// @endcond + +namespace adaptor { + +template <> +struct convert { + msgpack::object const& operator()(msgpack::object const& o, boost::string_view& v) const { + switch (o.type) { + case msgpack::type::BIN: + v = boost::string_view(o.via.bin.ptr, o.via.bin.size); + break; + case msgpack::type::STR: + v = boost::string_view(o.via.str.ptr, o.via.str.size); + break; + default: + throw msgpack::type_error(); + break; + } + return o; + } +}; + +template <> +struct pack { + template + msgpack::packer& operator()(msgpack::packer& o, const boost::string_view& v) const { + uint32_t size = checked_get_container_size(v.size()); + o.pack_str(size); + o.pack_str_body(v.data(), size); + return o; + } +}; + +template <> +struct object { + void operator()(msgpack::object& o, const boost::string_view& v) const { + uint32_t size = checked_get_container_size(v.size()); + o.type = msgpack::type::STR; + o.via.str.ptr = v.data(); + o.via.str.size = size; + } +}; + +template <> +struct object_with_zone { + void operator()(msgpack::object::with_zone& o, const boost::string_view& v) const { + static_cast(o) << v; + } +}; + + +} // namespace adaptor + +/// @cond +} // MSGPACK_API_VERSION_NAMESPACE(v1) +/// @endcond + +} // namespace msgpack + +#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 + +#endif // MSGPACK_V1_TYPE_BOOST_STRING_VIEW_HPP diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index 8f51a0ca..04d63578 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -45,6 +45,7 @@ IF (MSGPACK_BOOST) boost_variant.cpp boost_optional.cpp boost_string_ref.cpp + boost_string_view.cpp ) ENDIF () diff --git a/test/boost_string_view.cpp b/test/boost_string_view.cpp new file mode 100644 index 00000000..f68ad0df --- /dev/null +++ b/test/boost_string_view.cpp @@ -0,0 +1,47 @@ +#include +#include +#include +#include + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#if defined(MSGPACK_USE_BOOST) +#if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 61 + +TEST(MSGPACK_BOOST, pack_convert_string_view) +{ + std::stringstream ss; + std::string s = "ABC"; + boost::string_view val1(s); + + msgpack::pack(ss, val1); + + msgpack::object_handle oh; + msgpack::unpack(oh, ss.str().data(), ss.str().size()); + boost::string_view val2 = oh.get().as(); + EXPECT_TRUE(val1 == val2); +} + +TEST(MSGPACK_BOOST, object_strinf_view) +{ + std::string s = "ABC"; + boost::string_view val1(s); + msgpack::object obj(val1); + boost::string_view val2 = obj.as(); + EXPECT_TRUE(val1 == val2); +} + +TEST(MSGPACK_BOOST, object_with_zone_string_view) +{ + msgpack::zone z; + std::string s = "ABC"; + boost::string_view val1(s); + msgpack::object obj(val1, z); + boost::string_view val2 = obj.as(); + EXPECT_TRUE(val1 == val2); +} + +#endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 61 +#endif // defined(MSGPACK_USE_BOOST)