1 // 2 // MessagePack for C++ static resolution routine 3 // 4 // Copyright (C) 2015 KONDO Takatoshi 5 // 6 // Distributed under the Boost Software License, Version 1.0. 7 // (See accompanying file LICENSE_1_0.txt or copy at 8 // http://www.boost.org/LICENSE_1_0.txt) 9 // 10 #ifndef MSGPACK_V1_TYPE_BOOST_STRING_REF_HPP 11 #define MSGPACK_V1_TYPE_BOOST_STRING_REF_HPP 12 13 #include <boost/version.hpp> 14 #if (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 15 16 #include "msgpack/versioning.hpp" 17 #include "msgpack/adaptor/adaptor_base.hpp" 18 #include "msgpack/adaptor/check_container_size.hpp" 19 20 #include <boost/utility/string_ref.hpp> 21 22 namespace msgpack { 23 24 /// @cond MSGPACK_API_VERSION_NAMESPACE(v1)25MSGPACK_API_VERSION_NAMESPACE(v1) { 26 /// @endcond 27 28 namespace adaptor { 29 30 template <> 31 struct convert<boost::string_ref> { 32 msgpack::object const& operator()(msgpack::object const& o, boost::string_ref& v) const { 33 switch (o.type) { 34 case msgpack::type::BIN: 35 v = boost::string_ref(o.via.bin.ptr, o.via.bin.size); 36 break; 37 case msgpack::type::STR: 38 v = boost::string_ref(o.via.str.ptr, o.via.str.size); 39 break; 40 default: 41 throw msgpack::type_error(); 42 break; 43 } 44 return o; 45 } 46 }; 47 48 template <> 49 struct pack<boost::string_ref> { 50 template <typename Stream> 51 msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const boost::string_ref& v) const { 52 uint32_t size = checked_get_container_size(v.size()); 53 o.pack_str(size); 54 o.pack_str_body(v.data(), size); 55 return o; 56 } 57 }; 58 59 template <> 60 struct object<boost::string_ref> { 61 void operator()(msgpack::object& o, const boost::string_ref& v) const { 62 uint32_t size = checked_get_container_size(v.size()); 63 o.type = msgpack::type::STR; 64 o.via.str.ptr = v.data(); 65 o.via.str.size = size; 66 } 67 }; 68 69 template <> 70 struct object_with_zone<boost::string_ref> { 71 void operator()(msgpack::object::with_zone& o, const boost::string_ref& v) const { 72 static_cast<msgpack::object&>(o) << v; 73 } 74 }; 75 76 77 } // namespace adaptor 78 79 /// @cond 80 } // MSGPACK_API_VERSION_NAMESPACE(v1) 81 /// @endcond 82 83 } // namespace msgpack 84 85 #endif // (BOOST_VERSION / 100000) >= 1 && ((BOOST_VERSION / 100) % 1000) >= 53 86 87 #endif // MSGPACK_V1_TYPE_BOOST_STRING_REF_HPP 88