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