MessagePack for C++
char_ptr.hpp
Go to the documentation of this file.
1 //
2 // MessagePack for C++ static resolution routine
3 //
4 // Copyright (C) 2014-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_CHAR_PTR_HPP
11 #define MSGPACK_V1_TYPE_CHAR_PTR_HPP
12 
13 #include "msgpack/versioning.hpp"
14 #include "msgpack/object_fwd.hpp"
17 
18 #include <cstring>
19 
20 namespace msgpack {
21 
25 
26 namespace adaptor {
27 
28 template <>
29 struct pack<const char*> {
30  template <typename Stream>
32  uint32_t size = checked_get_container_size(std::strlen(v));
33  o.pack_str(size);
34  o.pack_str_body(v, size);
35  return o;
36  }
37 };
38 
39 template <>
40 struct object_with_zone<const char*> {
41  void operator()(msgpack::object::with_zone& o, const char* v) const {
42  uint32_t size = checked_get_container_size(std::strlen(v));
44  char* ptr = static_cast<char*>(o.zone.allocate_align(size));
45  o.via.str.ptr = ptr;
46  o.via.str.size = size;
47  std::memcpy(ptr, v, size);
48  }
49 };
50 
51 template <>
52 struct object<const char*> {
53  void operator()(msgpack::object& o, const char* v) const {
54  uint32_t size = checked_get_container_size(std::strlen(v));
56  o.via.str.ptr = v;
57  o.via.str.size = size;
58  }
59 };
60 
61 
62 template <>
63 struct pack<char*> {
64  template <typename Stream>
66  return o << static_cast<const char*>(v);
67  }
68 };
69 
70 template <>
71 struct object_with_zone<char*> {
72  void operator()(msgpack::object::with_zone& o, char* v) const {
73  o << static_cast<const char*>(v);
74  }
75 };
76 
77 template <>
78 struct object<char*> {
79  void operator()(msgpack::object& o, char* v) const {
80  o << static_cast<const char*>(v);
81  }
82 };
83 
84 template <std::size_t N>
85 struct pack<char[N]> {
86  template <typename Stream>
88  uint32_t size = checked_get_container_size(std::strlen(v));
89  o.pack_str(size);
90  o.pack_str_body(v, size);
91  return o;
92  }
93 };
94 
95 template <std::size_t N>
96 struct object_with_zone<char[N]> {
97  void operator()(msgpack::object::with_zone& o, const char* v) const {
98  uint32_t size = checked_get_container_size(std::strlen(v));
100  char* ptr = static_cast<char*>(o.zone.allocate_align(size));
101  o.via.str.ptr = ptr;
102  o.via.str.size = size;
103  std::memcpy(ptr, v, size);
104  }
105 };
106 
107 template <std::size_t N>
108 struct object<char[N]> {
109  void operator()(msgpack::object& o, const char* v) const {
110  uint32_t size = checked_get_container_size(std::strlen(v));
112  o.via.str.ptr = v;
113  o.via.str.size = size;
114  }
115 };
116 
117 template <std::size_t N>
118 struct pack<const char[N]> {
119  template <typename Stream>
121  uint32_t size = checked_get_container_size(std::strlen(v));
122  o.pack_str(size);
123  o.pack_str_body(v, size);
124  return o;
125  }
126 };
127 
128 template <std::size_t N>
129 struct object_with_zone<const char[N]> {
130  void operator()(msgpack::object::with_zone& o, const char* v) const {
131  uint32_t size = checked_get_container_size(std::strlen(v));
133  char* ptr = static_cast<char*>(o.zone.allocate_align(size));
134  o.via.str.ptr = ptr;
135  o.via.str.size = size;
136  std::memcpy(ptr, v, size);
137  }
138 };
139 
140 template <std::size_t N>
141 struct object<const char[N]> {
142  void operator()(msgpack::object& o, const char* v) const {
143  uint32_t size = checked_get_container_size(std::strlen(v));
145  o.via.str.ptr = v;
146  o.via.str.size = size;
147  }
148 };
149 
150 } // namespace adaptor
151 
153 } // MSGPACK_API_VERSION_NAMESPACE(v1)
155 
156 } // namespace msgpack
157 
158 #endif // MSGPACK_V1_TYPE_CHAR_PTR_HPP
void operator()(msgpack::object &o, char *v) const
Definition: char_ptr.hpp:79
Definition: object_fwd_decl.hpp:37
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, const char *v) const
Definition: char_ptr.hpp:87
void * allocate_align(size_t size, size_t align=MSGPACK_ZONE_ALIGN)
Definition: cpp03_zone.hpp:236
void operator()(msgpack::object &o, const char *v) const
Definition: char_ptr.hpp:109
uint32_t checked_get_container_size(T size)
Definition: check_container_size.hpp:55
union_type via
Definition: object_fwd.hpp:92
msgpack::zone & zone
Definition: object.hpp:36
void operator()(msgpack::object::with_zone &o, const char *v) const
Definition: char_ptr.hpp:41
Definition: adaptor_base.hpp:15
const char * ptr
Definition: object_fwd.hpp:34
void operator()(msgpack::object &o, const char *v) const
Definition: char_ptr.hpp:53
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, const char *v) const
Definition: char_ptr.hpp:120
Definition: object.hpp:34
packer< Stream > & pack_str_body(const char *b, uint32_t l)
Packing str body.
Definition: pack.hpp:1220
void operator()(msgpack::object::with_zone &o, const char *v) const
Definition: char_ptr.hpp:130
void operator()(msgpack::object::with_zone &o, char *v) const
Definition: char_ptr.hpp:72
Definition: adaptor_base.hpp:43
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, const char *v) const
Definition: char_ptr.hpp:31
Definition: adaptor_base.hpp:32
msgpack::object_str str
Definition: object_fwd.hpp:86
Object class that corresponding to MessagePack format object.
Definition: object_fwd.hpp:75
void operator()(msgpack::object &o, const char *v) const
Definition: char_ptr.hpp:142
msgpack::type::object_type type
Definition: object_fwd.hpp:91
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition: versioning.hpp:58
packer< Stream > & operator()(packer< Stream > &o, char *v) const
Definition: char_ptr.hpp:65
uint32_t size
Definition: object_fwd.hpp:33
Definition: adaptor_base.hpp:38
The class template that supports continuous packing.
Definition: adaptor_base_decl.hpp:23
packer< Stream > & pack_str(uint32_t l)
Packing str header and length.
Definition: pack.hpp:1197
void operator()(msgpack::object::with_zone &o, const char *v) const
Definition: char_ptr.hpp:97