MessagePack for C++
Toggle main menu visibility
Loading...
Searching...
No Matches
msgpack
v1
adaptor
cpp20
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
"
20
#include "
msgpack/adaptor/adaptor_base.hpp
"
21
#include "
msgpack/object.hpp
"
22
#include "
msgpack/adaptor/check_container_size.hpp
"
23
#include "
msgpack/meta.hpp
"
24
25
#include <span>
26
#include <cstring>
27
#include <cstddef>
28
29
namespace
msgpack
{
30
32
MSGPACK_API_VERSION_NAMESPACE
(v1) {
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
adaptor_base.hpp
check_container_size.hpp
cpp_version.hpp
meta.hpp
msgpack::adaptor
Definition
adaptor_base.hpp:22
msgpack
Definition
adaptor_base.hpp:15
object.hpp
MSGPACK_API_VERSION_NAMESPACE
#define MSGPACK_API_VERSION_NAMESPACE(ns)
Definition
versioning.hpp:66
versioning.hpp
Generated by
1.17.0