Skip to content

Commit 388891e

Browse files
committed
Add support for more binary buffer types
Add support for the following types: - `std::array<std::byte>` - `std::span<char>` - `std::span<unsigned char>` - `std::span<std::byte>`
1 parent fc3de98 commit 388891e

File tree

8 files changed

+415
-5
lines changed

8 files changed

+415
-5
lines changed

CMakeLists.txt

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,15 @@ IF (MSGPACK_USE_X3_PARSE)
3535
ENDIF ()
3636
ENDIF ()
3737
ELSE ()
38-
IF (MSGPACK_CXX17)
38+
IF (MSGPACK_CXX20)
39+
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
40+
SET (CMAKE_CXX_FLAGS "-std=c++20 ${CMAKE_CXX_FLAGS}")
41+
ELSEIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
42+
SET (CMAKE_CXX_FLAGS "-std=c++20 ${CMAKE_CXX_FLAGS}")
43+
ELSEIF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
44+
# MESSAGE ( FATAL_ERROR "MSVC doesn't support C++20.")
45+
ENDIF ()
46+
ELSEIF (MSGPACK_CXX17)
3947
IF ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
4048
SET (CMAKE_CXX_FLAGS "-std=c++17 ${CMAKE_CXX_FLAGS}")
4149
ELSEIF ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")

Files.cmake

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,11 +28,13 @@ SET (msgpackc_HEADERS
2828
include/msgpack/adaptor/cpp11/unique_ptr.hpp
2929
include/msgpack/adaptor/cpp11/unordered_map.hpp
3030
include/msgpack/adaptor/cpp11/unordered_set.hpp
31+
include/msgpack/adaptor/cpp17/array_byte.hpp
3132
include/msgpack/adaptor/cpp17/byte.hpp
3233
include/msgpack/adaptor/cpp17/carray_byte.hpp
3334
include/msgpack/adaptor/cpp17/optional.hpp
3435
include/msgpack/adaptor/cpp17/string_view.hpp
3536
include/msgpack/adaptor/cpp17/vector_byte.hpp
37+
include/msgpack/adaptor/cpp20/span.hpp
3638
include/msgpack/adaptor/define.hpp
3739
include/msgpack/adaptor/define_decl.hpp
3840
include/msgpack/adaptor/deque.hpp
@@ -124,11 +126,13 @@ SET (msgpackc_HEADERS
124126
include/msgpack/v1/adaptor/cpp11/unique_ptr.hpp
125127
include/msgpack/v1/adaptor/cpp11/unordered_map.hpp
126128
include/msgpack/v1/adaptor/cpp11/unordered_set.hpp
129+
include/msgpack/v1/adaptor/cpp17/array_byte.hpp
127130
include/msgpack/v1/adaptor/cpp17/byte.hpp
128131
include/msgpack/v1/adaptor/cpp17/carray_byte.hpp
129132
include/msgpack/v1/adaptor/cpp17/optional.hpp
130133
include/msgpack/v1/adaptor/cpp17/string_view.hpp
131134
include/msgpack/v1/adaptor/cpp17/vector_byte.hpp
135+
include/msgpack/v1/adaptor/cpp20/span.hpp
132136
include/msgpack/v1/adaptor/define.hpp
133137
include/msgpack/v1/adaptor/define_decl.hpp
134138
include/msgpack/v1/adaptor/deque.hpp
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//
2+
// MessagePack for C++ static resolution routine
3+
//
4+
// Copyright (C) 2021 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+
11+
#ifndef MSGPACK_TYPE_CPP17_ARRAY_BYTE_HPP
12+
#define MSGPACK_TYPE_CPP17_ARRAY_BYTE_HPP
13+
14+
#include "msgpack/v1/adaptor/cpp17/array_byte.hpp"
15+
16+
#endif // MSGPACK_TYPE_CPP17_ARRAY_BYTE_HPP
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//
2+
// MessagePack for C++ static resolution routine
3+
//
4+
// Copyright (C) 2021 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+
11+
#ifndef MSGPACK_TYPE_CPP20_SPAN_HPP
12+
#define MSGPACK_TYPE_CPP20_SPAN_HPP
13+
14+
#include "msgpack/v1/adaptor/cpp20/span.hpp"
15+
16+
#endif // MSGPACK_TYPE_CPP20_SPAN_HPP

include/msgpack/type.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,10 +54,15 @@
5454
#include "adaptor/cpp17/string_view.hpp"
5555
#endif // MSGPACK_HAS_INCLUDE(<string_view>)
5656

57+
#include "adaptor/cpp17/array_byte.hpp"
5758
#include "adaptor/cpp17/byte.hpp"
5859
#include "adaptor/cpp17/carray_byte.hpp"
5960
#include "adaptor/cpp17/vector_byte.hpp"
6061

62+
#if MSGPACK_HAS_INCLUDE(<span>)
63+
#include "adaptor/cpp20/span.hpp"
64+
#endif // MSGPACK_HAS_INCLUDE(<span>)
65+
6166
#endif // defined(MSGPACK_USE_CPP03)
6267

6368
#include "adaptor/boost/fusion.hpp"
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
//
2+
// MessagePack for C++ static resolution routine
3+
//
4+
// Copyright (C) 2021 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_ARRAY_BYTE_HPP
11+
#define MSGPACK_V1_TYPE_ARRAY_BYTE_HPP
12+
13+
#if __cplusplus >= 201703
14+
15+
#include "msgpack/versioning.hpp"
16+
#include "msgpack/adaptor/adaptor_base.hpp"
17+
#include "msgpack/adaptor/check_container_size.hpp"
18+
19+
#include <array>
20+
#include <cstring>
21+
#include <cstddef>
22+
23+
namespace msgpack {
24+
25+
/// @cond
26+
MSGPACK_API_VERSION_NAMESPACE(v1) {
27+
/// @endcond
28+
29+
namespace adaptor {
30+
31+
template <std::size_t N>
32+
struct convert<std::array<std::byte, N> > {
33+
msgpack::object const& operator()(msgpack::object const& o, std::array<std::byte, N>& v) const {
34+
switch (o.type) {
35+
case msgpack::type::BIN:
36+
if (o.via.bin.size != N)
37+
throw msgpack::type_error();
38+
if (N != 0) {
39+
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
40+
#pragma GCC diagnostic push
41+
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
42+
#endif // defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
43+
std::memcpy(&v.front(), o.via.bin.ptr, o.via.bin.size);
44+
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
45+
#pragma GCC diagnostic pop
46+
#endif // defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
47+
}
48+
break;
49+
case msgpack::type::STR:
50+
if (o.via.bin.size != N)
51+
throw msgpack::type_error();
52+
if (N != 0) {
53+
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
54+
#pragma GCC diagnostic push
55+
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
56+
#endif // defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
57+
std::memcpy(&v.front(), o.via.str.ptr, o.via.str.size);
58+
#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
59+
#pragma GCC diagnostic pop
60+
#endif // defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7)) && !defined(__clang__)
61+
}
62+
break;
63+
default:
64+
throw msgpack::type_error();
65+
break;
66+
}
67+
return o;
68+
}
69+
};
70+
71+
template <std::size_t N>
72+
struct pack<std::array<std::byte, N> > {
73+
template <typename Stream>
74+
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::array<std::byte, N>& v) const {
75+
uint32_t size = checked_get_container_size(v.size());
76+
o.pack_bin(size);
77+
if (size != 0) {
78+
o.pack_bin_body(reinterpret_cast<char const*>(&v.front()), size);
79+
}
80+
81+
return o;
82+
}
83+
};
84+
85+
template <std::size_t N>
86+
struct object<std::array<std::byte, N> > {
87+
void operator()(msgpack::object& o, const std::array<std::byte, N>& v) const {
88+
uint32_t size = checked_get_container_size(v.size());
89+
o.type = msgpack::type::BIN;
90+
if (size != 0) {
91+
o.via.bin.ptr = reinterpret_cast<char const*>(&v.front());
92+
}
93+
o.via.bin.size = size;
94+
}
95+
};
96+
97+
template <std::size_t N>
98+
struct object_with_zone<std::array<std::byte, N> > {
99+
void operator()(msgpack::object::with_zone& o, const std::array<std::byte, N>& v) const {
100+
uint32_t size = checked_get_container_size(v.size());
101+
o.type = msgpack::type::BIN;
102+
o.via.bin.size = size;
103+
if (size != 0) {
104+
char* ptr = static_cast<char*>(o.zone.allocate_align(size, MSGPACK_ZONE_ALIGNOF(char)));
105+
o.via.bin.ptr = ptr;
106+
std::memcpy(ptr, &v.front(), size);
107+
}
108+
}
109+
};
110+
111+
} // namespace adaptor
112+
113+
/// @cond
114+
} // MSGPACK_API_VERSION_NAMESPACE(v1)
115+
/// @endcond
116+
117+
} // namespace msgpack
118+
119+
#endif // __cplusplus >= 201703
120+
121+
#endif // MSGPACK_V1_TYPE_ARRAY_BYTE_HPP
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
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+
// Some compilers still do not set __cplusplus to 202002
15+
#if __cplusplus > 201703
16+
17+
#include "msgpack/versioning.hpp"
18+
#include "msgpack/adaptor/adaptor_base.hpp"
19+
#include "msgpack/adaptor/check_container_size.hpp"
20+
#include "msgpack/meta.hpp"
21+
22+
#include <span>
23+
#include <cstring>
24+
#include <cstddef>
25+
26+
namespace msgpack {
27+
28+
/// @cond
29+
MSGPACK_API_VERSION_NAMESPACE(v1) {
30+
/// @endcond
31+
32+
namespace adaptor {
33+
34+
#define MSGPACK_ADAPTOR_CONVERT_SPAN_BINARY(byte_t) \
35+
template <> \
36+
struct convert<std::span<const byte_t> > { \
37+
msgpack::object const& operator()(msgpack::object const& o, std::span<const byte_t>& v) const { \
38+
switch (o.type) { \
39+
case msgpack::type::BIN: \
40+
v = std::span(reinterpret_cast<const byte_t*>(o.via.bin.ptr), o.via.bin.size); \
41+
break; \
42+
default: \
43+
throw msgpack::type_error(); \
44+
break; \
45+
} \
46+
return o; \
47+
} \
48+
};
49+
50+
#define MSGPACK_ADAPTOR_PACK_SPAN_BINARY(byte_t) \
51+
template <> \
52+
struct pack<std::span<byte_t> > { \
53+
template <typename Stream> \
54+
msgpack::packer<Stream>& operator()(msgpack::packer<Stream>& o, const std::span<byte_t>& v) const { \
55+
uint32_t size = checked_get_container_size(v.size()); \
56+
o.pack_bin(size); \
57+
if (size != 0) { \
58+
o.pack_bin_body(reinterpret_cast<char const*>(v.data()), size); \
59+
} \
60+
return o; \
61+
} \
62+
};
63+
64+
#define MSGPACK_ADAPTOR_OBJECT_SPAN_BINARY(byte_t) \
65+
template <> \
66+
struct object<std::span<byte_t> > { \
67+
void operator()(msgpack::object& o, const std::span<byte_t>& v) const { \
68+
uint32_t size = checked_get_container_size(v.size()); \
69+
o.type = msgpack::type::BIN; \
70+
if (size != 0) { \
71+
o.via.bin.ptr = reinterpret_cast<char const*>(v.data()); \
72+
} \
73+
o.via.bin.size = size; \
74+
} \
75+
};
76+
77+
#define MSGPACK_ADAPTOR_OBJECT_WITH_ZONE_SPAN_BINARY(byte_t) \
78+
template <> \
79+
struct object_with_zone<std::span<byte_t> > { \
80+
void operator()(msgpack::object::with_zone& o, const std::span<byte_t>& v) const { \
81+
uint32_t size = checked_get_container_size(v.size()); \
82+
o.type = msgpack::type::BIN; \
83+
o.via.bin.size = size; \
84+
if (size != 0) { \
85+
char* ptr = static_cast<char*>(o.zone.allocate_align(size, MSGPACK_ZONE_ALIGNOF(char))); \
86+
o.via.bin.ptr = ptr; \
87+
std::memcpy(ptr, v.data(), size); \
88+
} \
89+
} \
90+
};
91+
92+
#define MSGPACK_ADAPTOR_SPAN_BINARY(byte_t) \
93+
MSGPACK_ADAPTOR_CONVERT_SPAN_BINARY(byte_t) \
94+
MSGPACK_ADAPTOR_PACK_SPAN_BINARY(byte_t) \
95+
MSGPACK_ADAPTOR_PACK_SPAN_BINARY(const byte_t) \
96+
MSGPACK_ADAPTOR_OBJECT_SPAN_BINARY(byte_t) \
97+
MSGPACK_ADAPTOR_OBJECT_SPAN_BINARY(const byte_t) \
98+
MSGPACK_ADAPTOR_OBJECT_WITH_ZONE_SPAN_BINARY(byte_t) \
99+
MSGPACK_ADAPTOR_OBJECT_WITH_ZONE_SPAN_BINARY(const byte_t)
100+
101+
MSGPACK_ADAPTOR_SPAN_BINARY(char)
102+
MSGPACK_ADAPTOR_SPAN_BINARY(unsigned char)
103+
MSGPACK_ADAPTOR_SPAN_BINARY(std::byte)
104+
105+
#undef MSGPACK_ADAPTOR_SPAN_BINARY
106+
#undef MSGPACK_ADAPTOR_OBJECT_WITH_ZONE_SPAN_BINARY
107+
#undef MSGPACK_ADAPTOR_OBJECT_SPAN_BINARY
108+
#undef MSGPACK_ADAPTOR_PACK_SPAN_BINARY
109+
#undef MSGPACK_ADAPTOR_CONVERT_SPAN_BINARY
110+
111+
} // namespace adaptor
112+
113+
/// @cond
114+
} // MSGPACK_API_VERSION_NAMESPACE(v1)
115+
/// @endcond
116+
117+
} // namespace msgpack
118+
119+
#endif // __cplusplus > 201703
120+
121+
#endif // MSGPACK_V1_TYPE_CPP11_ARRAY_HPP

0 commit comments

Comments
 (0)