MessagePack for C++
span.hpp
Go to the documentation of this file.
1 //
2 // MessagePack for C++ static resolution routine
3 //
4 // Copyright (C) 2021 KONDO Takatoshi and Daniil Kovalev
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 
11 #ifndef MSGPACK_V1_TYPE_CPP20_SPAN_HPP
12 #define MSGPACK_V1_TYPE_CPP20_SPAN_HPP
13 
14 #include "msgpack/cpp_version.hpp"
15 
16 // Some compilers still do not set the corresponding macro to 202002
17 #if MSGPACK_CPP_VERSION > 201703
18 
19 #include "msgpack/versioning.hpp"
21 #include "msgpack/object.hpp"
23 #include "msgpack/meta.hpp"
24 
25 #include <span>
26 #include <cstring>
27 #include <cstddef>
28 
29 namespace msgpack {
30 
34 
35 namespace adaptor {
36 
37 #define MSGPACK_ADAPTOR_CONVERT_SPAN_BINARY(byte_t) \
38  template <> \
39  struct convert<std::span<const byte_t> > { \
40  msgpack::object const& operator()(msgpack::object const& o, std::span<const byte_t>& v) const { \
41  switch (o.type) { \
42  case msgpack::type::BIN: \
43  v = std::span(reinterpret_cast<const byte_t*>(o.via.bin.ptr), o.via.bin.size); \
44  break; \
45  default: \
46  throw msgpack::type_error(); \
47  break; \
48  } \
49  return o; \
50  } \
51  };
52 
53 #define MSGPACK_ADAPTOR_PACK_SPAN_BINARY(byte_t) \
54  template <> \
55  struct pack<std::span<byte_t> > { \
56  template <typename Stream> \
57  msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::span<byte_t>& v) const { \
58  uint32_t size = checked_get_container_size(v.size()); \
59  o.pack_bin(size); \
60  if (size != 0) { \
61  o.pack_bin_body(reinterpret_cast<char const*>(v.data()), size); \
62  } \
63  return o; \
64  } \
65  };
66 
67 #define MSGPACK_ADAPTOR_OBJECT_SPAN_BINARY(byte_t) \
68  template <> \
69  struct object<std::span<byte_t> > { \
70  void operator()(msgpack::object& o, const std::span<byte_t>& v) const { \
71  uint32_t size = checked_get_container_size(v.size()); \
72  o.type = msgpack::type::BIN; \
73  if (size != 0) { \
74  o.via.bin.ptr = reinterpret_cast<char const*>(v.data()); \
75  } \
76  o.via.bin.size = size; \
77  } \
78  };
79 
80 #define MSGPACK_ADAPTOR_OBJECT_WITH_ZONE_SPAN_BINARY(byte_t) \
81  template <> \
82  struct object_with_zone<std::span<byte_t> > { \
83  void operator()(msgpack::object::with_zone& o, const std::span<byte_t>& v) const { \
84  uint32_t size = checked_get_container_size(v.size()); \
85  o.type = msgpack::type::BIN; \
86  o.via.bin.size = size; \
87  if (size != 0) { \
88  char* ptr = static_cast<char*>(o.zone.allocate_align(size, MSGPACK_ZONE_ALIGNOF(char))); \
89  o.via.bin.ptr = ptr; \
90  std::memcpy(ptr, v.data(), size); \
91  } \
92  } \
93  };
94 
95 #define MSGPACK_ADAPTOR_SPAN_BINARY(byte_t) \
96  MSGPACK_ADAPTOR_CONVERT_SPAN_BINARY(byte_t) \
97  MSGPACK_ADAPTOR_PACK_SPAN_BINARY(byte_t) \
98  MSGPACK_ADAPTOR_PACK_SPAN_BINARY(const byte_t) \
99  MSGPACK_ADAPTOR_OBJECT_SPAN_BINARY(byte_t) \
100  MSGPACK_ADAPTOR_OBJECT_SPAN_BINARY(const byte_t) \
101  MSGPACK_ADAPTOR_OBJECT_WITH_ZONE_SPAN_BINARY(byte_t) \
102  MSGPACK_ADAPTOR_OBJECT_WITH_ZONE_SPAN_BINARY(const byte_t)
103 
104 MSGPACK_ADAPTOR_SPAN_BINARY(char)
105 MSGPACK_ADAPTOR_SPAN_BINARY(unsigned char)
106 MSGPACK_ADAPTOR_SPAN_BINARY(std::byte)
107 
108 #undef MSGPACK_ADAPTOR_SPAN_BINARY
109 #undef MSGPACK_ADAPTOR_OBJECT_WITH_ZONE_SPAN_BINARY
110 #undef MSGPACK_ADAPTOR_OBJECT_SPAN_BINARY
111 #undef MSGPACK_ADAPTOR_PACK_SPAN_BINARY
112 #undef MSGPACK_ADAPTOR_CONVERT_SPAN_BINARY
113 
114 } // namespace adaptor
115 
117 } // MSGPACK_API_VERSION_NAMESPACE(v1)
119 
120 } // namespace msgpack
121 
122 #endif // MSGPACK_CPP_VERSION > 201703
123 
124 #endif // MSGPACK_V1_TYPE_CPP11_ARRAY_HPP
Definition: adaptor_base.hpp:15
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition: versioning.hpp:66