MessagePack for C++
Loading...
Searching...
No Matches
carray.hpp
Go to the documentation of this file.
1//
2// MessagePack for C++ static resolution routine
3//
4// Copyright (C) 2016 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_CARRAY_HPP
11#define MSGPACK_V1_TYPE_CARRAY_HPP
12
17
18namespace msgpack {
19
23
24namespace adaptor {
25
26template <typename T, std::size_t N>
27struct convert<T[N]> {
28 msgpack::object const& operator()(msgpack::object const& o, T* v) const {
29 if (o.type != msgpack::type::ARRAY) { throw msgpack::type_error(); }
30 if (o.via.array.size > N) { throw msgpack::type_error(); }
32 msgpack::object* const pend = o.via.array.ptr + o.via.array.size;
33 for (; p < pend; ++p, ++v) {
34 p->convert(*v);
35 }
36 return o;
37 }
38};
39
40template <std::size_t N>
41struct convert<char[N]> {
42 msgpack::object const& operator()(msgpack::object const& o, char(&v)[N]) const {
43 switch (o.type) {
45 if (o.via.bin.size > N) { throw msgpack::type_error(); }
46 std::memcpy(v, o.via.bin.ptr, o.via.bin.size);
47 break;
49 if (o.via.str.size > N) { throw msgpack::type_error(); }
50 std::memcpy(v, o.via.str.ptr, o.via.str.size);
51 if (o.via.str.size < N) v[o.via.str.size] = '\0';
52 break;
53 default:
54 throw msgpack::type_error();
55 break;
56 }
57 return o;
58 }
59};
60
61template <std::size_t N>
62struct convert<unsigned char[N]> {
63 msgpack::object const& operator()(msgpack::object const& o, unsigned char(&v)[N]) const {
64 switch (o.type) {
66 if (o.via.bin.size > N) { throw msgpack::type_error(); }
67 std::memcpy(v, o.via.bin.ptr, o.via.bin.size);
68 break;
70 if (o.via.str.size > N) { throw msgpack::type_error(); }
71 std::memcpy(v, o.via.str.ptr, o.via.str.size);
72 if (o.via.str.size < N) v[o.via.str.size] = '\0';
73 break;
74 default:
75 throw msgpack::type_error();
76 break;
77 }
78 return o;
79 }
80};
81
82
83template <typename T, std::size_t N>
84struct pack<T[N]> {
85 template <typename Stream>
87 uint32_t size = checked_get_container_size(N);
88 o.pack_array(size);
89 const T* ptr = v;
90 for (; ptr != &v[N]; ++ptr) o.pack(*ptr);
91 return o;
92 }
93};
94
95template <std::size_t N>
96struct pack<char[N]> {
97 template <typename Stream>
99 char const* p = v;
100 uint32_t size = checked_get_container_size(N);
101 char const* p2 = static_cast<char const*>(std::memchr(p, '\0', size));
102 uint32_t adjusted_size = p2 ? static_cast<uint32_t>(p2 - p) : size;
103 o.pack_str(adjusted_size);
104 o.pack_str_body(p, adjusted_size);
105 return o;
106 }
107};
108
109template <std::size_t N>
110struct pack<const char[N]> {
111 template <typename Stream>
113 uint32_t size = checked_get_container_size(N);
114 char const* p = v;
115 char const* p2 = static_cast<char const*>(std::memchr(p, '\0', size));
116 uint32_t adjusted_size = p2 ? static_cast<uint32_t>(p2 - p) : size;
117 o.pack_str(adjusted_size);
118 o.pack_str_body(p, adjusted_size);
119 return o;
120 }
121};
122
123template <std::size_t N>
124struct pack<unsigned char[N]> {
125 template <typename Stream>
126 msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const unsigned char(&v)[N]) const {
127 unsigned char const* p = v;
128 uint32_t size = checked_get_container_size(N);
129 o.pack_bin(size);
130 o.pack_bin_body(reinterpret_cast<char const*>(p), size);
131 return o;
132 }
133};
134
135template <std::size_t N>
136struct pack<const unsigned char[N]> {
137 template <typename Stream>
138 msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const unsigned char(&v)[N]) const {
139 unsigned char const* p = v;
140 uint32_t size = checked_get_container_size(N);
141 o.pack_bin(size);
142 o.pack_bin_body(reinterpret_cast<char const*>(p), size);
143 return o;
144 }
145};
146
147template <typename T, std::size_t N>
148struct object_with_zone<T[N]> {
149 void operator()(msgpack::object::with_zone& o, const T(&v)[N]) const {
150 uint32_t size = checked_get_container_size(N);
153 o.via.array.ptr = ptr;
154 o.via.array.size = size;
155 const T* pv = v;
156 for (; pv != &v[size]; ++pv) {
157 *ptr++ = msgpack::object(*pv, o.zone);
158 }
159 }
160};
161
162template <std::size_t N>
163struct object_with_zone<char[N]> {
164 void operator()(msgpack::object::with_zone& o, const char(&v)[N]) const {
165 char const* p = v;
166 uint32_t size = checked_get_container_size(N);
167 char const* p2 = static_cast<char const*>(std::memchr(p, '\0', size));
168 uint32_t adjusted_size = p2 ? static_cast<uint32_t>(p2 - p) : size;
170 char* ptr = static_cast<char*>(o.zone.allocate_align(adjusted_size, MSGPACK_ZONE_ALIGNOF(char)));
171 o.via.str.ptr = ptr;
172 o.via.str.size = adjusted_size;
173 std::memcpy(ptr, p, adjusted_size);
174 }
175};
176
177template <std::size_t N>
178struct object_with_zone<const char[N]> {
179 void operator()(msgpack::object::with_zone& o, const char(&v)[N]) const {
180 char const* p = v;
181 uint32_t size = checked_get_container_size(N);
182 char const* p2 = static_cast<char const*>(std::memchr(p, '\0', size));
183 uint32_t adjusted_size = p2 ? static_cast<uint32_t>(p2 - p) : size;
185 char* ptr = static_cast<char*>(o.zone.allocate_align(adjusted_size, MSGPACK_ZONE_ALIGNOF(char)));
186 o.via.str.ptr = ptr;
187 o.via.str.size = adjusted_size;
188 std::memcpy(ptr, p, adjusted_size);
189 }
190};
191
192template <std::size_t N>
193struct object_with_zone<unsigned char[N]> {
194 void operator()(msgpack::object::with_zone& o, const unsigned char(&v)[N]) const {
195 uint32_t size = checked_get_container_size(N);
197 char* ptr = static_cast<char*>(o.zone.allocate_align(size, MSGPACK_ZONE_ALIGNOF(char)));
198 o.via.bin.ptr = ptr;
199 o.via.bin.size = size;
200 std::memcpy(ptr, v, size);
201 }
202};
203
204template <std::size_t N>
205struct object_with_zone<const unsigned char[N]> {
206 void operator()(msgpack::object::with_zone& o, const unsigned char(&v)[N]) const {
207 uint32_t size = checked_get_container_size(N);
209 char* ptr = static_cast<char*>(o.zone.allocate_align(size, MSGPACK_ZONE_ALIGNOF(char)));
210 o.via.bin.ptr = ptr;
211 o.via.bin.size = size;
212 std::memcpy(ptr, v, size);
213 }
214};
215
216template <std::size_t N>
217struct object<char[N]> {
218 void operator()(msgpack::object& o, const char(&v)[N]) const {
219 char const* p = v;
220 uint32_t size = checked_get_container_size(N);
221 char const* p2 = static_cast<char const*>(std::memchr(p, '\0', size));
222 uint32_t adjusted_size = p2 ? static_cast<uint32_t>(p2 - p) : size;
224 o.via.str.ptr = p;
225 o.via.str.size = adjusted_size;
226 }
227};
228
229template <std::size_t N>
230struct object<const char[N]> {
231 void operator()(msgpack::object& o, const char(&v)[N]) const {
232 char const* p = v;
233 uint32_t size = checked_get_container_size(N);
234 char const* p2 = static_cast<char const*>(std::memchr(p, '\0', size));
235 uint32_t adjusted_size = p2 ? static_cast<uint32_t>(p2 - p) : size;
237 o.via.str.ptr = p;
238 o.via.str.size = adjusted_size;
239 }
240};
241
242
243} // namespace adaptor
244
246} // MSGPACK_API_VERSION_NAMESPACE(v1)
248
249} // namespace msgpack
250
251#endif // MSGPACK_V1_TYPE_CARRAY_HPP
The class template that supports continuous packing.
Definition pack.hpp:33
packer< Stream > & pack_bin(uint32_t l)
Packing bin header and length.
Definition pack.hpp:1290
packer< Stream > & pack_str_body(const char *b, uint32_t l)
Packing str body.
Definition pack.hpp:1255
packer< Stream > & pack_bin_body(const char *b, uint32_t l)
Packing bin body.
Definition pack.hpp:1309
packer< Stream > & pack_str(uint32_t l)
Packing str header and length.
Definition pack.hpp:1232
packer< Stream > & pack_array(uint32_t n)
Packing array header and size.
Definition pack.hpp:1195
packer< Stream > & pack(const T &v)
Packing function template.
Definition object_fwd.hpp:234
void * allocate_align(size_t size, size_t align=MSGPACK_ZONE_ALIGN)
Definition cpp03_zone.hpp:255
Definition adaptor_base.hpp:22
@ STR
Definition object_fwd_decl.hpp:38
@ ARRAY
Definition object_fwd_decl.hpp:40
@ BIN
Definition object_fwd_decl.hpp:39
Definition adaptor_base.hpp:15
uint32_t checked_get_container_size(T size)
Definition check_container_size.hpp:55
msgpack::object const & operator()(msgpack::object const &o, T *v) const
Definition carray.hpp:28
msgpack::object const & operator()(msgpack::object const &o, char(&v)[N]) const
Definition carray.hpp:42
msgpack::object const & operator()(msgpack::object const &o, unsigned char(&v)[N]) const
Definition carray.hpp:63
Definition adaptor_base.hpp:27
void operator()(msgpack::object &o, const char(&v)[N]) const
Definition carray.hpp:218
void operator()(msgpack::object &o, const char(&v)[N]) const
Definition carray.hpp:231
void operator()(msgpack::object::with_zone &o, const T(&v)[N]) const
Definition carray.hpp:149
void operator()(msgpack::object::with_zone &o, const char(&v)[N]) const
Definition carray.hpp:164
void operator()(msgpack::object::with_zone &o, const char(&v)[N]) const
Definition carray.hpp:179
void operator()(msgpack::object::with_zone &o, const unsigned char(&v)[N]) const
Definition carray.hpp:206
void operator()(msgpack::object::with_zone &o, const unsigned char(&v)[N]) const
Definition carray.hpp:194
Definition adaptor_base.hpp:43
Definition adaptor_base.hpp:38
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, const T(&v)[N]) const
Definition carray.hpp:86
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, const char(&v)[N]) const
Definition carray.hpp:98
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, const char(&v)[N]) const
Definition carray.hpp:112
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, const unsigned char(&v)[N]) const
Definition carray.hpp:138
msgpack::packer< Stream > & operator()(msgpack::packer< Stream > &o, const unsigned char(&v)[N]) const
Definition carray.hpp:126
Definition adaptor_base.hpp:32
uint32_t size
Definition object_fwd.hpp:23
msgpack::object * ptr
Definition object_fwd.hpp:24
uint32_t size
Definition object_fwd.hpp:38
const char * ptr
Definition object_fwd.hpp:39
const char * ptr
Definition object_fwd.hpp:34
uint32_t size
Definition object_fwd.hpp:33
msgpack::zone & zone
Definition object.hpp:37
Object class that corresponding to MessagePack format object.
Definition object_fwd.hpp:77
msgpack::enable_if<!msgpack::is_array< T >::value &&!msgpack::is_pointer< T >::value, T & >::type convert(T &v) const
Convert the object.
Definition object.hpp:1076
union_type via
Definition object_fwd.hpp:95
msgpack::type::object_type type
Definition object_fwd.hpp:94
object_with_zone_type with_zone
Definition object_fwd.hpp:225
msgpack::object_array array
Definition object_fwd.hpp:87
msgpack::object_str str
Definition object_fwd.hpp:89
msgpack::object_bin bin
Definition object_fwd.hpp:90
#define MSGPACK_ZONE_ALIGNOF(type)
Definition cpp03_zone_decl.hpp:30
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition versioning.hpp:66