MessagePack for C++
Loading...
Searching...
No Matches
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
15
16// Some compilers still do not set the corresponding macro to 202002
17#if MSGPACK_CPP_VERSION > 201703
18
21#include "msgpack/object.hpp"
23#include "msgpack/meta.hpp"
24
25#include <span>
26#include <cstring>
27#include <cstddef>
28
29namespace msgpack {
30
34
35namespace 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
104MSGPACK_ADAPTOR_SPAN_BINARY(char)
105MSGPACK_ADAPTOR_SPAN_BINARY(unsigned char)
106MSGPACK_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