12 #include <boost/optional.hpp> 13 #include <boost/variant.hpp> 26 struct convert<boost::optional<T>> {
27 const clmdep_msgpack::object &operator()(
28 const clmdep_msgpack::object &o,
29 boost::optional<T> &v)
const {
30 if (o.type != clmdep_msgpack::type::ARRAY) {
33 if (o.via.array.size == 1) {
35 }
else if (o.via.array.size == 2) {
36 v.reset(o.via.array.ptr[1].as<T>());
45 struct pack<boost::optional<T>> {
46 template <
typename Stream>
47 packer<Stream> &operator()(
48 clmdep_msgpack::packer<Stream> &o,
49 const boost::optional<T> &v)
const {
63 struct object_with_zone<boost::optional<T>> {
65 clmdep_msgpack::object::with_zone &o,
66 const boost::optional<T> &v)
const {
70 o.via.array.ptr =
static_cast<clmdep_msgpack::object*
>(o.zone.allocate_align(
71 sizeof(clmdep_msgpack::object) * o.via.array.size,
72 MSGPACK_ZONE_ALIGNOF(clmdep_msgpack::object)));
73 o.via.array.ptr[0] = clmdep_msgpack::object(
true, o.zone);
74 o.via.array.ptr[1] = clmdep_msgpack::object(*v, o.zone);
77 o.via.array.ptr =
static_cast<clmdep_msgpack::object*
>(o.zone.allocate_align(
78 sizeof(clmdep_msgpack::object) * o.via.array.size,
79 MSGPACK_ZONE_ALIGNOF(clmdep_msgpack::object)));
80 o.via.array.ptr[0] = clmdep_msgpack::object(
false, o.zone);
89 template<
typename... Ts>
90 struct convert<boost::variant<Ts...>> {
92 const clmdep_msgpack::object &operator()(
93 const clmdep_msgpack::object &o,
94 boost::variant<Ts...> &v)
const {
95 if (o.type != clmdep_msgpack::type::ARRAY) {
98 if (o.via.array.size != 2) {
101 const auto index = o.via.array.ptr[0].as<uint64_t>();
102 copy_to_variant(index, o, v, std::make_index_sequence<
sizeof...(Ts)>());
108 template <u
int64_t I>
109 static void copy_to_variant_impl(
110 const clmdep_msgpack::object &o,
111 boost::variant<Ts...> &v) {
113 auto dummy = std::get<I>(std::tuple<Ts...>{});
114 using T = decltype(dummy);
115 v = o.via.array.ptr[1].as<T>();
118 template <uint64_t... Is>
119 static void copy_to_variant(
120 const uint64_t index,
121 const clmdep_msgpack::object &o,
122 boost::variant<Ts...> &v,
123 std::index_sequence<Is...>) {
124 std::initializer_list<int> ({
125 (index == Is ? copy_to_variant_impl<Is>(o, v), 0 : 0)...
130 template<
typename... Ts>
131 struct pack<boost::variant<Ts...>> {
132 template <
typename Stream>
133 packer<Stream> &operator()(
134 clmdep_msgpack::packer<Stream> &o,
135 const boost::variant<Ts...> &v)
const {
137 o.pack(static_cast<uint64_t>(v.which()));
138 boost::apply_visitor([&](
const auto &value) { o.pack(value); }, v);
143 template<
typename... Ts>
144 struct object_with_zone<boost::variant<Ts...>> {
146 clmdep_msgpack::object::with_zone &o,
147 const boost::variant<Ts...> &v)
const {
148 o.type = type::ARRAY;
149 o.via.array.size = 2;
150 o.via.array.ptr =
static_cast<clmdep_msgpack::object*
>(o.zone.allocate_align(
151 sizeof(clmdep_msgpack::object) * o.via.array.size,
152 MSGPACK_ZONE_ALIGNOF(clmdep_msgpack::object)));
153 o.via.array.ptr[0] = clmdep_msgpack::object(static_cast<uint64_t>(v.which()), o.zone);
154 boost::apply_visitor([&](
const auto &value) {
155 o.via.array.ptr[1] = clmdep_msgpack::object(value, o.zone);
void throw_exception(const std::exception &e)
MSGPACK_API_VERSION_NAMESPACE(MSGPACK_DEFAULT_API_NS)