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)25 MSGPACK_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