36 struct convert<boost::optional<T>> {
39 const clmdep_msgpack::object &operator()(
40 const clmdep_msgpack::object &o,
41 boost::optional<T> &v)
const {
43 if (o.type != clmdep_msgpack::type::ARRAY) {
48 if (o.via.array.size == 1) {
51 }
else if (o.via.array.size == 2) {
53 v.reset(o.via.array.ptr[1].as<T>());
63 struct pack<boost::optional<T>> {
64 template <
typename Stream>
65 packer<Stream> &operator()(
66 clmdep_msgpack::packer<Stream> &o,
67 const boost::optional<T> &v)
const {
83 struct object_with_zone<boost::optional<T>> {
85 clmdep_msgpack::object::with_zone &o,
86 const boost::optional<T> &v)
const {
91 o.via.array.ptr =
static_cast<clmdep_msgpack::object*
>(o.zone.allocate_align(
92 sizeof(clmdep_msgpack::object) * o.via.array.size,
93 MSGPACK_ZONE_ALIGNOF(clmdep_msgpack::object)));
95 o.via.array.ptr[0] = clmdep_msgpack::object(
true, o.zone);
97 o.via.array.ptr[1] = clmdep_msgpack::object(*v, o.zone);
100 o.via.array.size = 1;
101 o.via.array.ptr =
static_cast<clmdep_msgpack::object*
>(o.zone.allocate_align(
102 sizeof(clmdep_msgpack::object) * o.via.array.size,
103 MSGPACK_ZONE_ALIGNOF(clmdep_msgpack::object)));
105 o.via.array.ptr[0] = clmdep_msgpack::object(
false, o.zone);
114 template<
typename... Ts>
115 struct convert<boost::variant2::variant<Ts...>> {
117 const clmdep_msgpack::object &operator()(
118 const clmdep_msgpack::object &o,
119 boost::variant2::variant<Ts...> &v)
const {
121 if (o.type != clmdep_msgpack::type::ARRAY) {
125 if (o.via.array.size != 2) {
129 const auto index = o.via.array.ptr[0].as<uint64_t>();
130 copy_to_variant(index, o, v, std::make_index_sequence<
sizeof...(Ts)>());
137 template <u
int64_t I>
138 static void copy_to_variant_impl(
139 const clmdep_msgpack::object &o,
140 boost::variant2::variant<Ts...> &v) {
142 auto dummy = std::get<I>(std::tuple<Ts...>{});
143 using T =
decltype(dummy);
144 v = o.via.array.ptr[1].as<T>();
147 template <uint64_t... Is>
151 static void copy_to_variant(
153 const uint64_t index,
155 const clmdep_msgpack::object &o,
157 boost::variant2::variant<Ts...> &v,
159 std::index_sequence<Is...>) {
163 std::initializer_list<int> ({
164 (index == Is ? copy_to_variant_impl<Is>(o, v), 0 : 0)...
170 template<
typename... Ts>
171 struct pack<boost::variant2::variant<Ts...>> {
174 template <
typename Stream>
175 packer<Stream> &operator()(
176 clmdep_msgpack::packer<Stream> &o,
177 const boost::variant2::variant<Ts...> &v)
const {
179 o.pack(
static_cast<uint64_t
>(v.index()));
181 boost::variant2::visit([&](
const auto &value) { o.pack(value); }, v);
187 template<
typename... Ts>
188 struct object_with_zone<boost::variant2::variant<Ts...>> {
192 clmdep_msgpack::object::with_zone &o,
193 const boost::variant2::variant<Ts...> &v)
const {
195 o.type = type::ARRAY;
197 o.via.array.size = 2;
202 o.via.array.ptr =
static_cast<clmdep_msgpack::object*
>(o.zone.allocate_align(
203 sizeof(clmdep_msgpack::object) * o.via.array.size,
204 MSGPACK_ZONE_ALIGNOF(clmdep_msgpack::object)));
206 o.via.array.ptr[0] = clmdep_msgpack::object(
static_cast<uint64_t
>(v.index()), o.zone);
207 boost::variant2::visit([&](
const auto &value) {
208 o.via.array.ptr[1] = clmdep_msgpack::object(value, o.zone);