Coverage Report

Created: 2025-06-13 06:26

/src/boost/boost/variant2/variant.hpp
Line
Count
Source (jump to first uncovered line)
1
#ifndef BOOST_VARIANT2_VARIANT_HPP_INCLUDED
2
#define BOOST_VARIANT2_VARIANT_HPP_INCLUDED
3
4
// Copyright 2017-2019 Peter Dimov.
5
//
6
// Distributed under the Boost Software License, Version 1.0.
7
//
8
// See accompanying file LICENSE_1_0.txt or copy at
9
// http://www.boost.org/LICENSE_1_0.txt
10
11
#if defined(_MSC_VER) && _MSC_VER < 1910
12
# pragma warning( push )
13
# pragma warning( disable: 4521 4522 ) // multiple copy operators
14
#endif
15
16
#include <boost/mp11.hpp>
17
#include <boost/assert.hpp>
18
#include <boost/assert/source_location.hpp>
19
#include <boost/config.hpp>
20
#include <boost/config/workaround.hpp>
21
#include <cstddef>
22
#include <type_traits>
23
#include <exception>
24
#include <utility>
25
#include <typeindex> // std::hash
26
#include <iosfwd>
27
#include <cstdint>
28
#include <cerrno>
29
#include <limits>
30
31
//
32
33
namespace boost
34
{
35
36
#ifdef BOOST_NO_EXCEPTIONS
37
38
BOOST_NORETURN void throw_exception( std::exception const & e ); // user defined
39
40
#endif
41
42
template<class T> struct hash;
43
44
namespace variant2
45
{
46
47
// bad_variant_access
48
49
class bad_variant_access: public std::exception
50
{
51
public:
52
53
    bad_variant_access() noexcept
54
    {
55
    }
56
57
    char const * what() const noexcept
58
    {
59
        return "bad_variant_access";
60
    }
61
};
62
63
namespace detail
64
{
65
66
BOOST_NORETURN inline void throw_bad_variant_access()
67
{
68
#ifdef BOOST_NO_EXCEPTIONS
69
70
    boost::throw_exception( bad_variant_access() );
71
72
#else
73
74
    throw bad_variant_access();
75
76
#endif
77
}
78
79
} // namespace detail
80
81
// monostate
82
83
struct monostate
84
{
85
};
86
87
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1950)
88
89
constexpr bool operator<(monostate, monostate) noexcept { return false; }
90
constexpr bool operator>(monostate, monostate) noexcept { return false; }
91
constexpr bool operator<=(monostate, monostate) noexcept { return true; }
92
constexpr bool operator>=(monostate, monostate) noexcept { return true; }
93
constexpr bool operator==(monostate, monostate) noexcept { return true; }
94
constexpr bool operator!=(monostate, monostate) noexcept { return false; }
95
96
#else
97
98
constexpr bool operator<(monostate const&, monostate const&) noexcept { return false; }
99
constexpr bool operator>(monostate const&, monostate const&) noexcept { return false; }
100
constexpr bool operator<=(monostate const&, monostate const&) noexcept { return true; }
101
constexpr bool operator>=(monostate const&, monostate const&) noexcept { return true; }
102
constexpr bool operator==(monostate const&, monostate const&) noexcept { return true; }
103
constexpr bool operator!=(monostate const&, monostate const&) noexcept { return false; }
104
105
#endif
106
107
// variant forward declaration
108
109
template<class... T> class variant;
110
111
// variant_size
112
113
template<class T> struct variant_size
114
{
115
};
116
117
template<class T> struct variant_size<T const>: variant_size<T>
118
{
119
};
120
121
template<class T> struct variant_size<T volatile>: variant_size<T>
122
{
123
};
124
125
template<class T> struct variant_size<T const volatile>: variant_size<T>
126
{
127
};
128
129
template<class T> struct variant_size<T&>: variant_size<T>
130
{
131
};
132
133
template<class T> struct variant_size<T&&>: variant_size<T>
134
{
135
};
136
137
#if !defined(BOOST_NO_CXX14_VARIABLE_TEMPLATES)
138
139
template <class T> /*inline*/ constexpr std::size_t variant_size_v = variant_size<T>::value;
140
141
#endif
142
143
template <class... T> struct variant_size<variant<T...>>: mp11::mp_size<variant<T...>>
144
{
145
};
146
147
// variant_alternative
148
149
template<std::size_t I, class T> struct variant_alternative;
150
151
template<std::size_t I, class T> using variant_alternative_t = typename variant_alternative<I, T>::type;
152
153
#if BOOST_WORKAROUND(BOOST_GCC, < 40900)
154
155
namespace detail
156
{
157
158
template<std::size_t I, class T, bool E> struct variant_alternative_impl
159
{
160
};
161
162
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...>, true>
163
{
164
    using type = mp11::mp_at_c<variant<T...>, I>;
165
};
166
167
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...> const, true>: std::add_const< mp11::mp_at_c<variant<T...>, I> >
168
{
169
};
170
171
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...> volatile, true>: std::add_volatile< mp11::mp_at_c<variant<T...>, I> >
172
{
173
};
174
175
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...> const volatile, true>: std::add_cv< mp11::mp_at_c<variant<T...>, I> >
176
{
177
};
178
179
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...>&, true>: std::add_lvalue_reference< mp11::mp_at_c<variant<T...>, I> >
180
{
181
};
182
183
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...> const&, true>: std::add_lvalue_reference< mp11::mp_at_c<variant<T...>, I> const >
184
{
185
};
186
187
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...> volatile&, true>: std::add_lvalue_reference< mp11::mp_at_c<variant<T...>, I> volatile >
188
{
189
};
190
191
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...> const volatile&, true>: std::add_lvalue_reference< mp11::mp_at_c<variant<T...>, I> const volatile >
192
{
193
};
194
195
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...>&&, true>: std::add_rvalue_reference< mp11::mp_at_c<variant<T...>, I> >
196
{
197
};
198
199
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...> const&&, true>: std::add_rvalue_reference< mp11::mp_at_c<variant<T...>, I> const >
200
{
201
};
202
203
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...> volatile&&, true>: std::add_rvalue_reference< mp11::mp_at_c<variant<T...>, I> volatile >
204
{
205
};
206
207
template<std::size_t I, class... T> struct variant_alternative_impl<I, variant<T...> const volatile&&, true>: std::add_rvalue_reference< mp11::mp_at_c<variant<T...>, I> const volatile >
208
{
209
};
210
211
} // namespace detail
212
213
template<std::size_t I, class T> struct variant_alternative
214
{
215
};
216
217
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...>>: public detail::variant_alternative_impl<I, variant<T...>, (I < sizeof...(T))>
218
{
219
};
220
221
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...> const>: public detail::variant_alternative_impl<I, variant<T...> const, (I < sizeof...(T))>
222
{
223
};
224
225
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...> volatile>: public detail::variant_alternative_impl<I, variant<T...> volatile, (I < sizeof...(T))>
226
{
227
};
228
229
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...> const volatile>: public detail::variant_alternative_impl<I, variant<T...> const volatile, (I < sizeof...(T))>
230
{
231
};
232
233
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...>&>: public detail::variant_alternative_impl<I, variant<T...>&, (I < sizeof...(T))>
234
{
235
};
236
237
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...> const&>: public detail::variant_alternative_impl<I, variant<T...> const&, (I < sizeof...(T))>
238
{
239
};
240
241
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...> volatile&>: public detail::variant_alternative_impl<I, variant<T...> volatile&, (I < sizeof...(T))>
242
{
243
};
244
245
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...> const volatile&>: public detail::variant_alternative_impl<I, variant<T...> const volatile&, (I < sizeof...(T))>
246
{
247
};
248
249
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...>&&>: public detail::variant_alternative_impl<I, variant<T...>&&, (I < sizeof...(T))>
250
{
251
};
252
253
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...> const&&>: public detail::variant_alternative_impl<I, variant<T...> const&&, (I < sizeof...(T))>
254
{
255
};
256
257
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...> volatile&&>: public detail::variant_alternative_impl<I, variant<T...> volatile&&, (I < sizeof...(T))>
258
{
259
};
260
261
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...> const volatile&&>: public detail::variant_alternative_impl<I, variant<T...> const volatile&&, (I < sizeof...(T))>
262
{
263
};
264
265
#else
266
267
namespace detail
268
{
269
270
#if defined( BOOST_MP11_VERSION ) && BOOST_MP11_VERSION >= 107000
271
272
template<class I, class T, class Q> using var_alt_impl = mp11::mp_invoke_q<Q, variant_alternative_t<I::value, T>>;
273
274
#else
275
276
template<class I, class T, class Q> using var_alt_impl = mp11::mp_invoke<Q, variant_alternative_t<I::value, T>>;
277
278
#endif
279
280
} // namespace detail
281
282
template<std::size_t I, class T> struct variant_alternative
283
{
284
};
285
286
template<std::size_t I, class T> struct variant_alternative<I, T const>: mp11::mp_defer<detail::var_alt_impl, mp11::mp_size_t<I>, T, mp11::mp_quote_trait<std::add_const>>
287
{
288
};
289
290
template<std::size_t I, class T> struct variant_alternative<I, T volatile>: mp11::mp_defer<detail::var_alt_impl, mp11::mp_size_t<I>, T, mp11::mp_quote_trait<std::add_volatile>>
291
{
292
};
293
294
template<std::size_t I, class T> struct variant_alternative<I, T const volatile>: mp11::mp_defer<detail::var_alt_impl, mp11::mp_size_t<I>, T, mp11::mp_quote_trait<std::add_cv>>
295
{
296
};
297
298
template<std::size_t I, class T> struct variant_alternative<I, T&>: mp11::mp_defer<detail::var_alt_impl, mp11::mp_size_t<I>, T, mp11::mp_quote_trait<std::add_lvalue_reference>>
299
{
300
};
301
302
template<std::size_t I, class T> struct variant_alternative<I, T&&>: mp11::mp_defer<detail::var_alt_impl, mp11::mp_size_t<I>, T, mp11::mp_quote_trait<std::add_rvalue_reference>>
303
{
304
};
305
306
template<std::size_t I, class... T> struct variant_alternative<I, variant<T...>>: mp11::mp_defer<mp11::mp_at, variant<T...>, mp11::mp_size_t<I>>
307
{
308
};
309
310
#endif
311
312
// variant_npos
313
314
constexpr std::size_t variant_npos = ~static_cast<std::size_t>( 0 );
315
316
// holds_alternative
317
318
template<class U, class... T> constexpr bool holds_alternative( variant<T...> const& v ) noexcept
319
{
320
    static_assert( mp11::mp_count<variant<T...>, U>::value == 1, "The type must occur exactly once in the list of variant alternatives" );
321
    return v.index() == mp11::mp_find<variant<T...>, U>::value;
322
}
323
324
// get (index)
325
326
template<std::size_t I, class... T> constexpr variant_alternative_t<I, variant<T...>>& get(variant<T...>& v)
327
{
328
    static_assert( I < sizeof...(T), "Index out of bounds" );
329
    return ( v.index() != I? detail::throw_bad_variant_access(): (void)0 ), v._get_impl( mp11::mp_size_t<I>() );
330
}
331
332
template<std::size_t I, class... T> constexpr variant_alternative_t<I, variant<T...>>&& get(variant<T...>&& v)
333
{
334
    static_assert( I < sizeof...(T), "Index out of bounds" );
335
336
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1930)
337
338
    return ( v.index() != I? detail::throw_bad_variant_access(): (void)0 ), std::move( v._get_impl( mp11::mp_size_t<I>() ) );
339
340
#else
341
342
    if( v.index() != I ) detail::throw_bad_variant_access();
343
    return std::move( v._get_impl( mp11::mp_size_t<I>() ) );
344
345
#endif
346
}
347
348
template<std::size_t I, class... T> constexpr variant_alternative_t<I, variant<T...>> const& get(variant<T...> const& v)
349
{
350
    static_assert( I < sizeof...(T), "Index out of bounds" );
351
    return ( v.index() != I? detail::throw_bad_variant_access(): (void)0 ), v._get_impl( mp11::mp_size_t<I>() );
352
}
353
354
template<std::size_t I, class... T> constexpr variant_alternative_t<I, variant<T...>> const&& get(variant<T...> const&& v)
355
{
356
    static_assert( I < sizeof...(T), "Index out of bounds" );
357
358
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1930)
359
360
    return ( v.index() != I? detail::throw_bad_variant_access(): (void)0 ), std::move( v._get_impl( mp11::mp_size_t<I>() ) );
361
362
#else
363
364
    if( v.index() != I ) detail::throw_bad_variant_access();
365
    return std::move( v._get_impl( mp11::mp_size_t<I>() ) );
366
367
#endif
368
}
369
370
// unsafe_get
371
372
#if !defined(BOOST_NO_CXX14_CONSTEXPR)
373
0
# define BOOST_VARIANT2_CX14_ASSERT(expr) BOOST_ASSERT(expr);
374
#else
375
# define BOOST_VARIANT2_CX14_ASSERT(expr)
376
#endif
377
378
template<std::size_t I, class... T> constexpr variant_alternative_t<I, variant<T...>>& unsafe_get(variant<T...>& v)
379
0
{
380
0
    static_assert( I < sizeof...(T), "Index out of bounds" );
381
382
0
    BOOST_VARIANT2_CX14_ASSERT( v.index() == I )
383
384
0
    return v._get_impl( mp11::mp_size_t<I>() );
385
0
}
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<long, boost::system::error_code> >::type& boost::variant2::unsafe_get<0ul, long, boost::system::error_code>(boost::variant2::variant<long, boost::system::error_code>&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<long, boost::system::error_code> >::type& boost::variant2::unsafe_get<1ul, long, boost::system::error_code>(boost::variant2::variant<long, boost::system::error_code>&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<unsigned long, boost::system::error_code> >::type& boost::variant2::unsafe_get<0ul, unsigned long, boost::system::error_code>(boost::variant2::variant<unsigned long, boost::system::error_code>&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<unsigned long, boost::system::error_code> >::type& boost::variant2::unsafe_get<1ul, unsigned long, boost::system::error_code>(boost::variant2::variant<unsigned long, boost::system::error_code>&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<double, boost::system::error_code> >::type& boost::variant2::unsafe_get<0ul, double, boost::system::error_code>(boost::variant2::variant<double, boost::system::error_code>&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<double, boost::system::error_code> >::type& boost::variant2::unsafe_get<1ul, double, boost::system::error_code>(boost::variant2::variant<double, boost::system::error_code>&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<bool, boost::system::error_code> >::type& boost::variant2::unsafe_get<0ul, bool, boost::system::error_code>(boost::variant2::variant<bool, boost::system::error_code>&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<bool, boost::system::error_code> >::type& boost::variant2::unsafe_get<1ul, bool, boost::system::error_code>(boost::variant2::variant<bool, boost::system::error_code>&)
386
387
template<std::size_t I, class... T> constexpr variant_alternative_t<I, variant<T...>>&& unsafe_get(variant<T...>&& v)
388
{
389
    static_assert( I < sizeof...(T), "Index out of bounds" );
390
391
    BOOST_VARIANT2_CX14_ASSERT( v.index() == I )
392
393
    return std::move( v._get_impl( mp11::mp_size_t<I>() ) );
394
}
395
396
template<std::size_t I, class... T> constexpr variant_alternative_t<I, variant<T...>> const& unsafe_get(variant<T...> const& v)
397
0
{
398
0
    static_assert( I < sizeof...(T), "Index out of bounds" );
399
400
0
    BOOST_VARIANT2_CX14_ASSERT( v.index() == I )
401
402
0
    return v._get_impl( mp11::mp_size_t<I>() );
403
0
}
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<boost::json::value const*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<0ul, boost::json::value const*, boost::system::error_code>(boost::variant2::variant<boost::json::value const*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<boost::json::value const*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<1ul, boost::json::value const*, boost::system::error_code>(boost::variant2::variant<boost::json::value const*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<boost::json::value*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<0ul, boost::json::value*, boost::system::error_code>(boost::variant2::variant<boost::json::value*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<boost::json::value*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<1ul, boost::json::value*, boost::system::error_code>(boost::variant2::variant<boost::json::value*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<char const*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<0ul, char const*, boost::system::error_code>(boost::variant2::variant<char const*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<char const*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<1ul, char const*, boost::system::error_code>(boost::variant2::variant<char const*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<boost::json::object*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<1ul, boost::json::object*, boost::system::error_code>(boost::variant2::variant<boost::json::object*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<boost::json::object*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<0ul, boost::json::object*, boost::system::error_code>(boost::variant2::variant<boost::json::object*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<boost::json::object const*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<1ul, boost::json::object const*, boost::system::error_code>(boost::variant2::variant<boost::json::object const*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<boost::json::object const*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<0ul, boost::json::object const*, boost::system::error_code>(boost::variant2::variant<boost::json::object const*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<boost::json::array*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<1ul, boost::json::array*, boost::system::error_code>(boost::variant2::variant<boost::json::array*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<boost::json::array*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<0ul, boost::json::array*, boost::system::error_code>(boost::variant2::variant<boost::json::array*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<boost::json::array const*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<1ul, boost::json::array const*, boost::system::error_code>(boost::variant2::variant<boost::json::array const*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<boost::json::array const*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<0ul, boost::json::array const*, boost::system::error_code>(boost::variant2::variant<boost::json::array const*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<boost::json::string const*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<0ul, boost::json::string const*, boost::system::error_code>(boost::variant2::variant<boost::json::string const*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<boost::json::string const*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<1ul, boost::json::string const*, boost::system::error_code>(boost::variant2::variant<boost::json::string const*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<long*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<0ul, long*, boost::system::error_code>(boost::variant2::variant<long*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<long*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<1ul, long*, boost::system::error_code>(boost::variant2::variant<long*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<unsigned long*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<0ul, unsigned long*, boost::system::error_code>(boost::variant2::variant<unsigned long*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<unsigned long*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<1ul, unsigned long*, boost::system::error_code>(boost::variant2::variant<unsigned long*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<double*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<0ul, double*, boost::system::error_code>(boost::variant2::variant<double*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<double*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<1ul, double*, boost::system::error_code>(boost::variant2::variant<double*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<0ul, boost::variant2::variant<bool*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<0ul, bool*, boost::system::error_code>(boost::variant2::variant<bool*, boost::system::error_code> const&)
Unexecuted instantiation: boost::variant2::variant_alternative<1ul, boost::variant2::variant<bool*, boost::system::error_code> >::type const& boost::variant2::unsafe_get<1ul, bool*, boost::system::error_code>(boost::variant2::variant<bool*, boost::system::error_code> const&)
404
405
template<std::size_t I, class... T> constexpr variant_alternative_t<I, variant<T...>> const&& unsafe_get(variant<T...> const&& v)
406
{
407
    static_assert( I < sizeof...(T), "Index out of bounds" );
408
409
    BOOST_VARIANT2_CX14_ASSERT( v.index() == I )
410
411
    return std::move( v._get_impl( mp11::mp_size_t<I>() ) );
412
}
413
414
// get (type)
415
416
template<class U, class... T> constexpr U& get(variant<T...>& v)
417
{
418
    static_assert( mp11::mp_count<variant<T...>, U>::value == 1, "The type must occur exactly once in the list of variant alternatives" );
419
420
    using I = mp11::mp_find<variant<T...>, U>;
421
422
    return ( v.index() != I::value? detail::throw_bad_variant_access(): (void)0 ), v._get_impl( I() );
423
}
424
425
template<class U, class... T> constexpr U&& get(variant<T...>&& v)
426
{
427
    static_assert( mp11::mp_count<variant<T...>, U>::value == 1, "The type must occur exactly once in the list of variant alternatives" );
428
429
    using I = mp11::mp_find<variant<T...>, U>;
430
431
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1930)
432
433
    return ( v.index() != I::value? detail::throw_bad_variant_access(): (void)0 ), std::move( v._get_impl( I() ) );
434
435
#else
436
437
    if( v.index() != I::value ) detail::throw_bad_variant_access();
438
    return std::move( v._get_impl( I() ) );
439
440
#endif
441
}
442
443
template<class U, class... T> constexpr U const& get(variant<T...> const& v)
444
{
445
    static_assert( mp11::mp_count<variant<T...>, U>::value == 1, "The type must occur exactly once in the list of variant alternatives" );
446
447
    using I = mp11::mp_find<variant<T...>, U>;
448
449
    return ( v.index() != I::value? detail::throw_bad_variant_access(): (void)0 ), v._get_impl( I() );
450
}
451
452
template<class U, class... T> constexpr U const&& get(variant<T...> const&& v)
453
{
454
    static_assert( mp11::mp_count<variant<T...>, U>::value == 1, "The type must occur exactly once in the list of variant alternatives" );
455
456
    using I = mp11::mp_find<variant<T...>, U>;
457
458
#if !BOOST_WORKAROUND(BOOST_MSVC, < 1930)
459
460
    return ( v.index() != I::value? detail::throw_bad_variant_access(): (void)0 ), std::move( v._get_impl( I() ) );
461
462
#else
463
464
    if( v.index() != I::value ) detail::throw_bad_variant_access();
465
    return std::move( v._get_impl( I() ) );
466
467
#endif
468
}
469
470
// get_if
471
472
template<std::size_t I, class... T> constexpr typename std::add_pointer<variant_alternative_t<I, variant<T...>>>::type get_if(variant<T...>* v) noexcept
473
{
474
    static_assert( I < sizeof...(T), "Index out of bounds" );
475
    return v && v->index() == I? &v->_get_impl( mp11::mp_size_t<I>() ): 0;
476
}
477
478
template<std::size_t I, class... T> constexpr typename std::add_pointer<const variant_alternative_t<I, variant<T...>>>::type get_if(variant<T...> const * v) noexcept
479
{
480
    static_assert( I < sizeof...(T), "Index out of bounds" );
481
    return v && v->index() == I? &v->_get_impl( mp11::mp_size_t<I>() ): 0;
482
}
483
484
template<class U, class... T> constexpr typename std::add_pointer<U>::type get_if(variant<T...>* v) noexcept
485
{
486
    static_assert( mp11::mp_count<variant<T...>, U>::value == 1, "The type must occur exactly once in the list of variant alternatives" );
487
488
    using I = mp11::mp_find<variant<T...>, U>;
489
490
    return v && v->index() == I::value? &v->_get_impl( I() ): 0;
491
}
492
493
template<class U, class... T> constexpr typename std::add_pointer<U const>::type get_if(variant<T...> const * v) noexcept
494
{
495
    static_assert( mp11::mp_count<variant<T...>, U>::value == 1, "The type must occur exactly once in the list of variant alternatives" );
496
497
    using I = mp11::mp_find<variant<T...>, U>;
498
499
    return v && v->index() == I::value? &v->_get_impl( I() ): 0;
500
}
501
502
//
503
504
namespace detail
505
{
506
507
// trivially_*
508
509
#if defined( BOOST_LIBSTDCXX_VERSION ) && BOOST_LIBSTDCXX_VERSION < 50000
510
511
template<class T> struct is_trivially_copy_constructible: mp11::mp_bool<std::is_copy_constructible<T>::value && std::has_trivial_copy_constructor<T>::value>
512
{
513
};
514
515
template<class T> struct is_trivially_copy_assignable: mp11::mp_bool<std::is_copy_assignable<T>::value && std::has_trivial_copy_assign<T>::value>
516
{
517
};
518
519
template<class T> struct is_trivially_move_constructible: mp11::mp_bool<std::is_move_constructible<T>::value && std::is_trivial<T>::value>
520
{
521
};
522
523
template<class T> struct is_trivially_move_assignable: mp11::mp_bool<std::is_move_assignable<T>::value && std::is_trivial<T>::value>
524
{
525
};
526
527
#else
528
529
using std::is_trivially_copy_constructible;
530
using std::is_trivially_copy_assignable;
531
using std::is_trivially_move_constructible;
532
using std::is_trivially_move_assignable;
533
534
#endif
535
536
// variant_storage
537
538
template<class D, class... T> union variant_storage_impl;
539
540
template<class... T> using variant_storage = variant_storage_impl<mp11::mp_all<std::is_trivially_destructible<T>...>, T...>;
541
542
template<class D> union variant_storage_impl<D>
543
{
544
};
545
546
// not all trivially destructible
547
template<class T1, class... T> union variant_storage_impl<mp11::mp_false, T1, T...>
548
{
549
    T1 first_;
550
    variant_storage<T...> rest_;
551
552
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<0>, A&&... a ): first_( std::forward<A>(a)... )
553
    {
554
    }
555
556
    template<std::size_t I, class... A> constexpr variant_storage_impl( mp11::mp_size_t<I>, A&&... a ): rest_( mp11::mp_size_t<I-1>(), std::forward<A>(a)... )
557
    {
558
    }
559
560
    ~variant_storage_impl()
561
    {
562
    }
563
564
    template<class... A> void emplace( mp11::mp_size_t<0>, A&&... a )
565
    {
566
        ::new( &first_ ) T1( std::forward<A>(a)... );
567
    }
568
569
    template<std::size_t I, class... A> void emplace( mp11::mp_size_t<I>, A&&... a )
570
    {
571
        rest_.emplace( mp11::mp_size_t<I-1>(), std::forward<A>(a)... );
572
    }
573
574
    BOOST_CXX14_CONSTEXPR T1& get( mp11::mp_size_t<0> ) noexcept { return first_; }
575
    constexpr T1 const& get( mp11::mp_size_t<0> ) const noexcept { return first_; }
576
577
    template<std::size_t I> BOOST_CXX14_CONSTEXPR mp11::mp_at_c<mp11::mp_list<T...>, I-1>& get( mp11::mp_size_t<I> ) noexcept { return rest_.get( mp11::mp_size_t<I-1>() ); }
578
    template<std::size_t I> constexpr mp11::mp_at_c<mp11::mp_list<T...>, I-1> const& get( mp11::mp_size_t<I> ) const noexcept { return rest_.get( mp11::mp_size_t<I-1>() ); }
579
};
580
581
template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class... T> union variant_storage_impl<mp11::mp_false, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T...>
582
{
583
    T0 t0_;
584
    T1 t1_;
585
    T2 t2_;
586
    T3 t3_;
587
    T4 t4_;
588
    T5 t5_;
589
    T6 t6_;
590
    T7 t7_;
591
    T8 t8_;
592
    T9 t9_;
593
594
    variant_storage<T...> rest_;
595
596
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<0>, A&&... a ): t0_( std::forward<A>(a)... ) {}
597
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<1>, A&&... a ): t1_( std::forward<A>(a)... ) {}
598
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<2>, A&&... a ): t2_( std::forward<A>(a)... ) {}
599
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<3>, A&&... a ): t3_( std::forward<A>(a)... ) {}
600
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<4>, A&&... a ): t4_( std::forward<A>(a)... ) {}
601
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<5>, A&&... a ): t5_( std::forward<A>(a)... ) {}
602
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<6>, A&&... a ): t6_( std::forward<A>(a)... ) {}
603
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<7>, A&&... a ): t7_( std::forward<A>(a)... ) {}
604
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<8>, A&&... a ): t8_( std::forward<A>(a)... ) {}
605
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<9>, A&&... a ): t9_( std::forward<A>(a)... ) {}
606
607
    template<std::size_t I, class... A> constexpr variant_storage_impl( mp11::mp_size_t<I>, A&&... a ): rest_( mp11::mp_size_t<I-10>(), std::forward<A>(a)... ) {}
608
609
    ~variant_storage_impl()
610
    {
611
    }
612
613
    template<class... A> void emplace( mp11::mp_size_t<0>, A&&... a ) { ::new( &t0_ ) T0( std::forward<A>(a)... ); }
614
    template<class... A> void emplace( mp11::mp_size_t<1>, A&&... a ) { ::new( &t1_ ) T1( std::forward<A>(a)... ); }
615
    template<class... A> void emplace( mp11::mp_size_t<2>, A&&... a ) { ::new( &t2_ ) T2( std::forward<A>(a)... ); }
616
    template<class... A> void emplace( mp11::mp_size_t<3>, A&&... a ) { ::new( &t3_ ) T3( std::forward<A>(a)... ); }
617
    template<class... A> void emplace( mp11::mp_size_t<4>, A&&... a ) { ::new( &t4_ ) T4( std::forward<A>(a)... ); }
618
    template<class... A> void emplace( mp11::mp_size_t<5>, A&&... a ) { ::new( &t5_ ) T5( std::forward<A>(a)... ); }
619
    template<class... A> void emplace( mp11::mp_size_t<6>, A&&... a ) { ::new( &t6_ ) T6( std::forward<A>(a)... ); }
620
    template<class... A> void emplace( mp11::mp_size_t<7>, A&&... a ) { ::new( &t7_ ) T7( std::forward<A>(a)... ); }
621
    template<class... A> void emplace( mp11::mp_size_t<8>, A&&... a ) { ::new( &t8_ ) T8( std::forward<A>(a)... ); }
622
    template<class... A> void emplace( mp11::mp_size_t<9>, A&&... a ) { ::new( &t9_ ) T9( std::forward<A>(a)... ); }
623
624
    template<std::size_t I, class... A> void emplace( mp11::mp_size_t<I>, A&&... a )
625
    {
626
        rest_.emplace( mp11::mp_size_t<I-10>(), std::forward<A>(a)... );
627
    }
628
629
    BOOST_CXX14_CONSTEXPR T0& get( mp11::mp_size_t<0> ) noexcept { return t0_; }
630
    constexpr T0 const& get( mp11::mp_size_t<0> ) const noexcept { return t0_; }
631
632
    BOOST_CXX14_CONSTEXPR T1& get( mp11::mp_size_t<1> ) noexcept { return t1_; }
633
    constexpr T1 const& get( mp11::mp_size_t<1> ) const noexcept { return t1_; }
634
635
    BOOST_CXX14_CONSTEXPR T2& get( mp11::mp_size_t<2> ) noexcept { return t2_; }
636
    constexpr T2 const& get( mp11::mp_size_t<2> ) const noexcept { return t2_; }
637
638
    BOOST_CXX14_CONSTEXPR T3& get( mp11::mp_size_t<3> ) noexcept { return t3_; }
639
    constexpr T3 const& get( mp11::mp_size_t<3> ) const noexcept { return t3_; }
640
641
    BOOST_CXX14_CONSTEXPR T4& get( mp11::mp_size_t<4> ) noexcept { return t4_; }
642
    constexpr T4 const& get( mp11::mp_size_t<4> ) const noexcept { return t4_; }
643
644
    BOOST_CXX14_CONSTEXPR T5& get( mp11::mp_size_t<5> ) noexcept { return t5_; }
645
    constexpr T5 const& get( mp11::mp_size_t<5> ) const noexcept { return t5_; }
646
647
    BOOST_CXX14_CONSTEXPR T6& get( mp11::mp_size_t<6> ) noexcept { return t6_; }
648
    constexpr T6 const& get( mp11::mp_size_t<6> ) const noexcept { return t6_; }
649
650
    BOOST_CXX14_CONSTEXPR T7& get( mp11::mp_size_t<7> ) noexcept { return t7_; }
651
    constexpr T7 const& get( mp11::mp_size_t<7> ) const noexcept { return t7_; }
652
653
    BOOST_CXX14_CONSTEXPR T8& get( mp11::mp_size_t<8> ) noexcept { return t8_; }
654
    constexpr T8 const& get( mp11::mp_size_t<8> ) const noexcept { return t8_; }
655
656
    BOOST_CXX14_CONSTEXPR T9& get( mp11::mp_size_t<9> ) noexcept { return t9_; }
657
    constexpr T9 const& get( mp11::mp_size_t<9> ) const noexcept { return t9_; }
658
659
    template<std::size_t I> BOOST_CXX14_CONSTEXPR mp11::mp_at_c<mp11::mp_list<T...>, I-10>& get( mp11::mp_size_t<I> ) noexcept { return rest_.get( mp11::mp_size_t<I-10>() ); }
660
    template<std::size_t I> constexpr mp11::mp_at_c<mp11::mp_list<T...>, I-10> const& get( mp11::mp_size_t<I> ) const noexcept { return rest_.get( mp11::mp_size_t<I-10>() ); }
661
};
662
663
// all trivially destructible
664
template<class T1, class... T> union variant_storage_impl<mp11::mp_true, T1, T...>
665
{
666
    T1 first_;
667
    variant_storage<T...> rest_;
668
669
0
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<0>, A&&... a ): first_( std::forward<A>(a)... )
670
0
    {
671
0
    }
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::value*, boost::system::error_code>::variant_storage_impl<boost::json::value*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::value*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::value const*, boost::system::error_code>::variant_storage_impl<boost::json::value const*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::value const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, char*, boost::system::error_code>::variant_storage_impl<char*>(std::__1::integral_constant<unsigned long, 0ul>, char*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, char const*, boost::system::error_code>::variant_storage_impl<char const*>(std::__1::integral_constant<unsigned long, 0ul>, char const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::array*, boost::system::error_code>::variant_storage_impl<boost::json::array*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::array*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::array const*, boost::system::error_code>::variant_storage_impl<boost::json::array const*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::array const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::object*, boost::system::error_code>::variant_storage_impl<boost::json::object*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::object*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::object const*, boost::system::error_code>::variant_storage_impl<boost::json::object const*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::object const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::string*, boost::system::error_code>::variant_storage_impl<boost::json::string*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::string*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::string const*, boost::system::error_code>::variant_storage_impl<boost::json::string const*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::string const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, long*, boost::system::error_code>::variant_storage_impl<long*>(std::__1::integral_constant<unsigned long, 0ul>, long*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, long, boost::system::error_code>::variant_storage_impl<long const&>(std::__1::integral_constant<unsigned long, 0ul>, long const&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, unsigned long*, boost::system::error_code>::variant_storage_impl<unsigned long*>(std::__1::integral_constant<unsigned long, 0ul>, unsigned long*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, unsigned long, boost::system::error_code>::variant_storage_impl<unsigned long const&>(std::__1::integral_constant<unsigned long, 0ul>, unsigned long const&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, double*, boost::system::error_code>::variant_storage_impl<double*>(std::__1::integral_constant<unsigned long, 0ul>, double*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, double, boost::system::error_code>::variant_storage_impl<double const&>(std::__1::integral_constant<unsigned long, 0ul>, double const&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, bool*, boost::system::error_code>::variant_storage_impl<bool*>(std::__1::integral_constant<unsigned long, 0ul>, bool*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, bool, boost::system::error_code>::variant_storage_impl<bool const&>(std::__1::integral_constant<unsigned long, 0ul>, bool const&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, decltype(nullptr), boost::system::error_code>::variant_storage_impl<decltype(nullptr)>(std::__1::integral_constant<unsigned long, 0ul>, decltype(nullptr)&&)
672
673
0
    template<std::size_t I, class... A> constexpr variant_storage_impl( mp11::mp_size_t<I>, A&&... a ): rest_( mp11::mp_size_t<I-1>(), std::forward<A>(a)... )
674
0
    {
675
0
    }
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::value*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::value*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::value*, boost::system::error_code>::variant_storage_impl<1ul, boost::json::value*>(std::__1::integral_constant<unsigned long, 1ul>, boost::json::value*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::value const*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::value const*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::value const*, boost::system::error_code>::variant_storage_impl<1ul, boost::json::value const*>(std::__1::integral_constant<unsigned long, 1ul>, boost::json::value const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, char*, boost::system::error_code>::variant_storage_impl<1ul, char*>(std::__1::integral_constant<unsigned long, 1ul>, char*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, char*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, char*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, char const*, boost::system::error_code>::variant_storage_impl<1ul, char const*>(std::__1::integral_constant<unsigned long, 1ul>, char const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, char const*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, char const*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::array*, boost::system::error_code>::variant_storage_impl<1ul, boost::json::array*>(std::__1::integral_constant<unsigned long, 1ul>, boost::json::array*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::array*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::array*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::array const*, boost::system::error_code>::variant_storage_impl<1ul, boost::json::array const*>(std::__1::integral_constant<unsigned long, 1ul>, boost::json::array const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::array const*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::array const*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::object*, boost::system::error_code>::variant_storage_impl<1ul, boost::json::object*>(std::__1::integral_constant<unsigned long, 1ul>, boost::json::object*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::object*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::object*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::object const*, boost::system::error_code>::variant_storage_impl<1ul, boost::json::object const*>(std::__1::integral_constant<unsigned long, 1ul>, boost::json::object const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::object const*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::object const*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::string*, boost::system::error_code>::variant_storage_impl<1ul, boost::json::string*>(std::__1::integral_constant<unsigned long, 1ul>, boost::json::string*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::string*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::string*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::string const*, boost::system::error_code>::variant_storage_impl<1ul, boost::json::string const*>(std::__1::integral_constant<unsigned long, 1ul>, boost::json::string const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::string const*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::string const*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, long*, boost::system::error_code>::variant_storage_impl<1ul, long*>(std::__1::integral_constant<unsigned long, 1ul>, long*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, long*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, long*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, long, boost::system::error_code>::variant_storage_impl<1ul, long const&>(std::__1::integral_constant<unsigned long, 1ul>, long const&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, long, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, long, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, unsigned long*, boost::system::error_code>::variant_storage_impl<1ul, unsigned long*>(std::__1::integral_constant<unsigned long, 1ul>, unsigned long*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, unsigned long*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, unsigned long*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, unsigned long, boost::system::error_code>::variant_storage_impl<1ul, unsigned long const&>(std::__1::integral_constant<unsigned long, 1ul>, unsigned long const&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, unsigned long, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, unsigned long, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, double*, boost::system::error_code>::variant_storage_impl<1ul, double*>(std::__1::integral_constant<unsigned long, 1ul>, double*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, double*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, double*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, double, boost::system::error_code>::variant_storage_impl<1ul, double const&>(std::__1::integral_constant<unsigned long, 1ul>, double const&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, double, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, double, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, bool*, boost::system::error_code>::variant_storage_impl<1ul, bool*>(std::__1::integral_constant<unsigned long, 1ul>, bool*&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, bool*, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, bool*, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, bool, boost::system::error_code>::variant_storage_impl<1ul, bool const&>(std::__1::integral_constant<unsigned long, 1ul>, bool const&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, bool, boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, bool, boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, decltype(nullptr), boost::system::error_code>::variant_storage_impl<1ul, decltype(nullptr)>(std::__1::integral_constant<unsigned long, 1ul>, decltype(nullptr)&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, decltype(nullptr), boost::system::error_code>::variant_storage_impl<2ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 2ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, decltype(nullptr), boost::system::error_code>::variant_storage_impl<1ul, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
676
677
    template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<0>, A&&... a )
678
    {
679
        ::new( &first_ ) T1( std::forward<A>(a)... );
680
    }
681
682
    template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<I>, A&&... a )
683
    {
684
        rest_.emplace( mp11::mp_size_t<I-1>(), std::forward<A>(a)... );
685
    }
686
687
    template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_true, mp11::mp_size_t<I>, A&&... a )
688
    {
689
#if defined(BOOST_GCC) && (__GNUC__ >= 7)
690
# pragma GCC diagnostic push
691
// False positive in at least GCC 7 and GCC 10 ASAN triggered by monostate (via result<void>)
692
# pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
693
#if __GNUC__ >= 12
694
// False positive in at least GCC 12 and GCC 13 ASAN and -Og triggered by monostate (via result<void>)
695
# pragma GCC diagnostic ignored "-Wuninitialized"
696
#endif
697
#endif
698
        *this = variant_storage_impl( mp11::mp_size_t<I>(), std::forward<A>(a)... );
699
700
#if defined(BOOST_GCC) && (__GNUC__ >= 7)
701
# pragma GCC diagnostic pop
702
#endif
703
    }
704
705
    template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<I>, A&&... a )
706
    {
707
        this->emplace_impl( mp11::mp_all<detail::is_trivially_move_assignable<T1>, detail::is_trivially_move_assignable<T>...>(), mp11::mp_size_t<I>(), std::forward<A>(a)... );
708
    }
709
710
0
    BOOST_CXX14_CONSTEXPR T1& get( mp11::mp_size_t<0> ) noexcept { return first_; }
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, long, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, unsigned long, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, double, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>)
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, bool, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>)
711
0
    constexpr T1 const& get( mp11::mp_size_t<0> ) const noexcept { return first_; }
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::value const*, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::value*, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, char const*, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::object*, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::object const*, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::array*, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::array const*, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::string const*, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, long*, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, unsigned long*, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, double*, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, bool*, boost::system::error_code>::get(std::__1::integral_constant<unsigned long, 0ul>) const
712
713
0
    template<std::size_t I> BOOST_CXX14_CONSTEXPR mp11::mp_at_c<mp11::mp_list<T...>, I-1>& get( mp11::mp_size_t<I> ) noexcept { return rest_.get( mp11::mp_size_t<I-1>() ); }
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<long, boost::system::error_code>, (1ul)-(1)>, void>::type::type& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, long, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<long, boost::system::error_code>, (2ul)-(1)>, void>::type::type& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, long, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, long, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<unsigned long, boost::system::error_code>, (1ul)-(1)>, void>::type::type& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, unsigned long, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<unsigned long, boost::system::error_code>, (2ul)-(1)>, void>::type::type& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, unsigned long, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, unsigned long, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<double, boost::system::error_code>, (1ul)-(1)>, void>::type::type& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, double, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<double, boost::system::error_code>, (2ul)-(1)>, void>::type::type& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, double, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, double, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<bool, boost::system::error_code>, (1ul)-(1)>, void>::type::type& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, bool, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<bool, boost::system::error_code>, (2ul)-(1)>, void>::type::type& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, bool, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, bool, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>)
714
0
    template<std::size_t I> constexpr mp11::mp_at_c<mp11::mp_list<T...>, I-1> const& get( mp11::mp_size_t<I> ) const noexcept { return rest_.get( mp11::mp_size_t<I-1>() ); }
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::value const*, boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::value const*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::value const*, boost::system::error_code>, (2ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::value const*, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::value const*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::value*, boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::value*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::value*, boost::system::error_code>, (2ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::value*, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::value*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<char const*, boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, char const*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<char const*, boost::system::error_code>, (2ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, char const*, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, char const*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::object*, boost::system::error_code>, (2ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::object*, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::object*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::object*, boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::object*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::object const*, boost::system::error_code>, (2ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::object const*, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::object const*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::object const*, boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::object const*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::array*, boost::system::error_code>, (2ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::array*, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::array*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::array*, boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::array*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::array const*, boost::system::error_code>, (2ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::array const*, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::array const*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::array const*, boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::array const*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::string const*, boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::string const*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::json::string const*, boost::system::error_code>, (2ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, boost::json::string const*, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::json::string const*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<long*, boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, long*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<long*, boost::system::error_code>, (2ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, long*, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, long*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<unsigned long*, boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, unsigned long*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<unsigned long*, boost::system::error_code>, (2ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, unsigned long*, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, unsigned long*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<double*, boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, double*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<double*, boost::system::error_code>, (2ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, double*, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, double*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<bool*, boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, bool*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((2ul)-(1))<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<bool*, boost::system::error_code>, (2ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, boost::variant2::detail::none, bool*, boost::system::error_code>::get<2ul>(std::__1::integral_constant<unsigned long, 2ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<((1ul)-(1))<std::__1::integral_constant<unsigned long, 1ul>::value, boost::mp11::detail::mp_at_c_impl<boost::mp11::mp_list<boost::system::error_code>, (1ul)-(1)>, void>::type::type const& boost::variant2::detail::variant_storage_impl<std::__1::integral_constant<bool, true>, bool*, boost::system::error_code>::get<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
715
};
716
717
template<class T0, class T1, class T2, class T3, class T4, class T5, class T6, class T7, class T8, class T9, class... T> union variant_storage_impl<mp11::mp_true, T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T...>
718
{
719
    T0 t0_;
720
    T1 t1_;
721
    T2 t2_;
722
    T3 t3_;
723
    T4 t4_;
724
    T5 t5_;
725
    T6 t6_;
726
    T7 t7_;
727
    T8 t8_;
728
    T9 t9_;
729
730
    variant_storage<T...> rest_;
731
732
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<0>, A&&... a ): t0_( std::forward<A>(a)... ) {}
733
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<1>, A&&... a ): t1_( std::forward<A>(a)... ) {}
734
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<2>, A&&... a ): t2_( std::forward<A>(a)... ) {}
735
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<3>, A&&... a ): t3_( std::forward<A>(a)... ) {}
736
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<4>, A&&... a ): t4_( std::forward<A>(a)... ) {}
737
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<5>, A&&... a ): t5_( std::forward<A>(a)... ) {}
738
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<6>, A&&... a ): t6_( std::forward<A>(a)... ) {}
739
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<7>, A&&... a ): t7_( std::forward<A>(a)... ) {}
740
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<8>, A&&... a ): t8_( std::forward<A>(a)... ) {}
741
    template<class... A> constexpr variant_storage_impl( mp11::mp_size_t<9>, A&&... a ): t9_( std::forward<A>(a)... ) {}
742
743
    template<std::size_t I, class... A> constexpr variant_storage_impl( mp11::mp_size_t<I>, A&&... a ): rest_( mp11::mp_size_t<I-10>(), std::forward<A>(a)... ) {}
744
745
    template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<0>, A&&... a ) { ::new( &t0_ ) T0( std::forward<A>(a)... ); }
746
    template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<1>, A&&... a ) { ::new( &t1_ ) T1( std::forward<A>(a)... ); }
747
    template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<2>, A&&... a ) { ::new( &t2_ ) T2( std::forward<A>(a)... ); }
748
    template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<3>, A&&... a ) { ::new( &t3_ ) T3( std::forward<A>(a)... ); }
749
    template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<4>, A&&... a ) { ::new( &t4_ ) T4( std::forward<A>(a)... ); }
750
    template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<5>, A&&... a ) { ::new( &t5_ ) T5( std::forward<A>(a)... ); }
751
    template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<6>, A&&... a ) { ::new( &t6_ ) T6( std::forward<A>(a)... ); }
752
    template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<7>, A&&... a ) { ::new( &t7_ ) T7( std::forward<A>(a)... ); }
753
    template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<8>, A&&... a ) { ::new( &t8_ ) T8( std::forward<A>(a)... ); }
754
    template<class... A> void emplace_impl( mp11::mp_false, mp11::mp_size_t<9>, A&&... a ) { ::new( &t9_ ) T9( std::forward<A>(a)... ); }
755
756
    template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, mp11::mp_size_t<I>, A&&... a )
757
    {
758
        rest_.emplace( mp11::mp_size_t<I-10>(), std::forward<A>(a)... );
759
    }
760
761
    template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_true, mp11::mp_size_t<I>, A&&... a )
762
    {
763
        *this = variant_storage_impl( mp11::mp_size_t<I>(), std::forward<A>(a)... );
764
    }
765
766
    template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace( mp11::mp_size_t<I>, A&&... a )
767
    {
768
        this->emplace_impl( mp11::mp_all<
769
            detail::is_trivially_move_assignable<T0>,
770
            detail::is_trivially_move_assignable<T1>,
771
            detail::is_trivially_move_assignable<T2>,
772
            detail::is_trivially_move_assignable<T3>,
773
            detail::is_trivially_move_assignable<T4>,
774
            detail::is_trivially_move_assignable<T5>,
775
            detail::is_trivially_move_assignable<T6>,
776
            detail::is_trivially_move_assignable<T7>,
777
            detail::is_trivially_move_assignable<T8>,
778
            detail::is_trivially_move_assignable<T9>,
779
            detail::is_trivially_move_assignable<T>...>(), mp11::mp_size_t<I>(), std::forward<A>(a)... );
780
    }
781
782
    BOOST_CXX14_CONSTEXPR T0& get( mp11::mp_size_t<0> ) noexcept { return t0_; }
783
    constexpr T0 const& get( mp11::mp_size_t<0> ) const noexcept { return t0_; }
784
785
    BOOST_CXX14_CONSTEXPR T1& get( mp11::mp_size_t<1> ) noexcept { return t1_; }
786
    constexpr T1 const& get( mp11::mp_size_t<1> ) const noexcept { return t1_; }
787
788
    BOOST_CXX14_CONSTEXPR T2& get( mp11::mp_size_t<2> ) noexcept { return t2_; }
789
    constexpr T2 const& get( mp11::mp_size_t<2> ) const noexcept { return t2_; }
790
791
    BOOST_CXX14_CONSTEXPR T3& get( mp11::mp_size_t<3> ) noexcept { return t3_; }
792
    constexpr T3 const& get( mp11::mp_size_t<3> ) const noexcept { return t3_; }
793
794
    BOOST_CXX14_CONSTEXPR T4& get( mp11::mp_size_t<4> ) noexcept { return t4_; }
795
    constexpr T4 const& get( mp11::mp_size_t<4> ) const noexcept { return t4_; }
796
797
    BOOST_CXX14_CONSTEXPR T5& get( mp11::mp_size_t<5> ) noexcept { return t5_; }
798
    constexpr T5 const& get( mp11::mp_size_t<5> ) const noexcept { return t5_; }
799
800
    BOOST_CXX14_CONSTEXPR T6& get( mp11::mp_size_t<6> ) noexcept { return t6_; }
801
    constexpr T6 const& get( mp11::mp_size_t<6> ) const noexcept { return t6_; }
802
803
    BOOST_CXX14_CONSTEXPR T7& get( mp11::mp_size_t<7> ) noexcept { return t7_; }
804
    constexpr T7 const& get( mp11::mp_size_t<7> ) const noexcept { return t7_; }
805
806
    BOOST_CXX14_CONSTEXPR T8& get( mp11::mp_size_t<8> ) noexcept { return t8_; }
807
    constexpr T8 const& get( mp11::mp_size_t<8> ) const noexcept { return t8_; }
808
809
    BOOST_CXX14_CONSTEXPR T9& get( mp11::mp_size_t<9> ) noexcept { return t9_; }
810
    constexpr T9 const& get( mp11::mp_size_t<9> ) const noexcept { return t9_; }
811
812
    template<std::size_t I> BOOST_CXX14_CONSTEXPR mp11::mp_at_c<mp11::mp_list<T...>, I-10>& get( mp11::mp_size_t<I> ) noexcept { return rest_.get( mp11::mp_size_t<I-10>() ); }
813
    template<std::size_t I> constexpr mp11::mp_at_c<mp11::mp_list<T...>, I-10> const& get( mp11::mp_size_t<I> ) const noexcept { return rest_.get( mp11::mp_size_t<I-10>() ); }
814
};
815
816
// resolve_overload_*
817
818
template<class... T> struct overload;
819
820
template<> struct overload<>
821
{
822
    void operator()() const;
823
};
824
825
template<class T1, class... T> struct overload<T1, T...>: overload<T...>
826
{
827
    using overload<T...>::operator();
828
    mp11::mp_identity<T1> operator()(T1) const;
829
};
830
831
#if BOOST_WORKAROUND( BOOST_MSVC, < 1930 )
832
833
template<class U, class... T> using resolve_overload_type_ = decltype( overload<T...>()(std::declval<U>()) );
834
835
template<class U, class... T> struct resolve_overload_type_impl: mp11::mp_defer< resolve_overload_type_, U, T... >
836
{
837
};
838
839
template<class U, class... T> using resolve_overload_type = typename resolve_overload_type_impl<U, T...>::type::type;
840
841
#else
842
843
template<class U, class... T> using resolve_overload_type = typename decltype( overload<T...>()(std::declval<U>()) )::type;
844
845
#endif
846
847
template<class U, class... T> using resolve_overload_index = mp11::mp_find<mp11::mp_list<T...>, resolve_overload_type<U, T...>>;
848
849
// index_type
850
851
template<std::size_t N> using get_smallest_unsigned_type = mp11::mp_cond<
852
853
    mp11::mp_bool< N <= (std::numeric_limits<unsigned char>::max)() >, unsigned char,
854
    mp11::mp_bool< N <= (std::numeric_limits<unsigned short>::max)() >, unsigned short,
855
    mp11::mp_true, unsigned
856
857
>;
858
859
#if BOOST_WORKAROUND( BOOST_CLANG_VERSION, < 30800 )
860
861
template<bool Double, class... T> using get_index_type = unsigned short;
862
863
#else
864
865
template<bool Double, class... T> using get_index_type = get_smallest_unsigned_type< (Double + 1) * sizeof...(T) >;
866
867
#endif
868
869
// variant_base
870
871
template<bool is_trivially_destructible, bool is_single_buffered, class... T> struct variant_base_impl;
872
template<class... T> using variant_base = variant_base_impl<mp11::mp_all<std::is_trivially_destructible<T>...>::value, mp11::mp_all<std::is_nothrow_move_constructible<T>...>::value, T...>;
873
874
struct none {};
875
876
// trivially destructible, single buffered
877
template<class... T> struct variant_base_impl<true, true, T...>
878
{
879
    using index_type = get_index_type<false, T...>;
880
881
    variant_storage<none, T...> st_;
882
    index_type ix_;
883
884
    constexpr variant_base_impl(): st_( mp11::mp_size_t<0>() ), ix_( 0 )
885
    {
886
    }
887
888
0
    template<class I, class... A> constexpr explicit variant_base_impl( I, A&&... a ): st_( mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... ), ix_( I::value + 1 )
889
0
    {
890
0
    }
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::value*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::value*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, boost::json::value*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::value*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::value const*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::value const*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, boost::json::value const*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::value const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, char*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, char*>(std::__1::integral_constant<unsigned long, 0ul>, char*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, char*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, char const*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, char const*>(std::__1::integral_constant<unsigned long, 0ul>, char const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, char const*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::array*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, boost::json::array*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::array*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::array*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::array const*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, boost::json::array const*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::array const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::array const*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::object*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, boost::json::object*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::object*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::object*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::object const*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, boost::json::object const*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::object const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::object const*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::string*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, boost::json::string*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::string*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::string*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::string const*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, boost::json::string const*>(std::__1::integral_constant<unsigned long, 0ul>, boost::json::string const*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::string const*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, long*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, long*>(std::__1::integral_constant<unsigned long, 0ul>, long*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, long*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, long, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, long const&>(std::__1::integral_constant<unsigned long, 0ul>, long const&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, long, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, unsigned long*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, unsigned long*>(std::__1::integral_constant<unsigned long, 0ul>, unsigned long*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, unsigned long*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, unsigned long, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, unsigned long const&>(std::__1::integral_constant<unsigned long, 0ul>, unsigned long const&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, unsigned long, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, double*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, double*>(std::__1::integral_constant<unsigned long, 0ul>, double*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, double*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, double, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, double const&>(std::__1::integral_constant<unsigned long, 0ul>, double const&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, double, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, bool*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, bool*>(std::__1::integral_constant<unsigned long, 0ul>, bool*&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, bool*, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, bool, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, bool const&>(std::__1::integral_constant<unsigned long, 0ul>, bool const&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, bool, boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, decltype(nullptr), boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 0ul>, decltype(nullptr)>(std::__1::integral_constant<unsigned long, 0ul>, decltype(nullptr)&&)
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, decltype(nullptr), boost::system::error_code>::variant_base_impl<std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code>(std::__1::integral_constant<unsigned long, 1ul>, boost::system::error_code&&)
891
892
    // requires: ix_ == 0
893
    template<class I, class... A> void _replace( I, A&&... a )
894
    {
895
        ::new( &st_ ) variant_storage<none, T...>( mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... );
896
897
        static_assert( I::value + 1 <= (std::numeric_limits<index_type>::max)(), "" );
898
        ix_ = I::value + 1;
899
    }
900
901
    constexpr std::size_t index() const noexcept
902
0
    {
903
0
        return ix_ - 1;
904
0
    }
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::value const*, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::value*, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, char const*, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::object*, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::object const*, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::array*, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::array const*, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, boost::json::string const*, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, long*, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, long, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, unsigned long*, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, unsigned long, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, double*, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, double, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, bool*, boost::system::error_code>::index() const
Unexecuted instantiation: boost::variant2::detail::variant_base_impl<true, true, bool, boost::system::error_code>::index() const
905
906
    template<std::size_t I> BOOST_CXX14_CONSTEXPR mp11::mp_at_c<variant<T...>, I>& _get_impl( mp11::mp_size_t<I> ) noexcept
907
0
    {
908
0
        std::size_t const J = I+1;
909
910
0
        BOOST_ASSERT( ix_ == J );
911
912
0
        return st_.get( mp11::mp_size_t<J>() );
913
0
    }
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<long, boost::system::error_code>, 0ul>, void>::type::type& boost::variant2::detail::variant_base_impl<true, true, long, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<long, boost::system::error_code>, 1ul>, void>::type::type& boost::variant2::detail::variant_base_impl<true, true, long, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<unsigned long, boost::system::error_code>, 0ul>, void>::type::type& boost::variant2::detail::variant_base_impl<true, true, unsigned long, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<unsigned long, boost::system::error_code>, 1ul>, void>::type::type& boost::variant2::detail::variant_base_impl<true, true, unsigned long, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<double, boost::system::error_code>, 0ul>, void>::type::type& boost::variant2::detail::variant_base_impl<true, true, double, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<double, boost::system::error_code>, 1ul>, void>::type::type& boost::variant2::detail::variant_base_impl<true, true, double, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<bool, boost::system::error_code>, 0ul>, void>::type::type& boost::variant2::detail::variant_base_impl<true, true, bool, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>)
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<bool, boost::system::error_code>, 1ul>, void>::type::type& boost::variant2::detail::variant_base_impl<true, true, bool, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>)
914
915
    template<std::size_t I> constexpr mp11::mp_at_c<variant<T...>, I> const& _get_impl( mp11::mp_size_t<I> ) const noexcept
916
0
    {
917
        // std::size_t const J = I+1;
918
919
0
        BOOST_VARIANT2_CX14_ASSERT( ix_ == I+1 )
920
921
0
        return st_.get( mp11::mp_size_t<I+1>() );
922
0
    }
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::value const*, boost::system::error_code>, 0ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::value const*, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::value const*, boost::system::error_code>, 1ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::value const*, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::value*, boost::system::error_code>, 0ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::value*, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::value*, boost::system::error_code>, 1ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::value*, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<char const*, boost::system::error_code>, 0ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, char const*, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<char const*, boost::system::error_code>, 1ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, char const*, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::object*, boost::system::error_code>, 1ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::object*, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::object*, boost::system::error_code>, 0ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::object*, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::object const*, boost::system::error_code>, 1ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::object const*, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::object const*, boost::system::error_code>, 0ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::object const*, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::array*, boost::system::error_code>, 1ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::array*, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::array*, boost::system::error_code>, 0ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::array*, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::array const*, boost::system::error_code>, 1ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::array const*, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::array const*, boost::system::error_code>, 0ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::array const*, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::string const*, boost::system::error_code>, 0ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::string const*, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<boost::json::string const*, boost::system::error_code>, 1ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, boost::json::string const*, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<long*, boost::system::error_code>, 0ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, long*, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<long*, boost::system::error_code>, 1ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, long*, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<unsigned long*, boost::system::error_code>, 0ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, unsigned long*, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<unsigned long*, boost::system::error_code>, 1ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, unsigned long*, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<double*, boost::system::error_code>, 0ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, double*, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<double*, boost::system::error_code>, 1ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, double*, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(0ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<bool*, boost::system::error_code>, 0ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, bool*, boost::system::error_code>::_get_impl<0ul>(std::__1::integral_constant<unsigned long, 0ul>) const
Unexecuted instantiation: boost::mp11::detail::mp_if_c_impl<(1ul)<std::__1::integral_constant<unsigned long, 2ul>::value, boost::mp11::detail::mp_at_c_impl<boost::variant2::variant<bool*, boost::system::error_code>, 1ul>, void>::type::type const& boost::variant2::detail::variant_base_impl<true, true, bool*, boost::system::error_code>::_get_impl<1ul>(std::__1::integral_constant<unsigned long, 1ul>) const
923
924
    template<std::size_t J, class U, class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_true, A&&... a )
925
    {
926
        static_assert( std::is_nothrow_constructible<U, A&&...>::value, "Logic error: U must be nothrow constructible from A&&..." );
927
928
        st_.emplace( mp11::mp_size_t<J>(), std::forward<A>(a)... );
929
930
        static_assert( J <= (std::numeric_limits<index_type>::max)(), "" );
931
        ix_ = J;
932
    }
933
934
    template<std::size_t J, class U, class... A> BOOST_CXX14_CONSTEXPR void emplace_impl( mp11::mp_false, A&&... a )
935
    {
936
        static_assert( std::is_nothrow_move_constructible<U>::value, "Logic error: U must be nothrow move constructible" );
937
938
        U tmp( std::forward<A>(a)... );
939
940
        st_.emplace( mp11::mp_size_t<J>(), std::move(tmp) );
941
942
        static_assert( J <= (std::numeric_limits<index_type>::max)(), "" );
943
        ix_ = J;
944
    }
945
946
    template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace( A&&... a )
947
    {
948
        std::size_t const J = I+1;
949
        using U = mp11::mp_at_c<variant<T...>, I>;
950
951
        this->emplace_impl<J, U>( std::is_nothrow_constructible<U, A&&...>(), std::forward<A>(a)... );
952
    }
953
954
    static constexpr bool uses_double_storage() noexcept
955
    {
956
        return false;
957
    }
958
};
959
960
// trivially destructible, double buffered
961
template<class... T> struct variant_base_impl<true, false, T...>
962
{
963
    using index_type = get_index_type<true, T...>;
964
965
    variant_storage<none, T...> st_[ 2 ];
966
    index_type ix_;
967
968
    constexpr variant_base_impl(): st_{ { mp11::mp_size_t<0>() }, { mp11::mp_size_t<0>() } }, ix_( 0 )
969
    {
970
    }
971
972
    template<class I, class... A> constexpr explicit variant_base_impl( I, A&&... a ): st_{ { mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... }, { mp11::mp_size_t<0>() } }, ix_( ( I::value + 1 ) * 2 )
973
    {
974
    }
975
976
    // requires: ix_ == 0
977
    template<class I, class... A> void _replace( I, A&&... a )
978
    {
979
        ::new( &st_[ 0 ] ) variant_storage<none, T...>( mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... );
980
981
        static_assert( ( I::value + 1 ) * 2 <= (std::numeric_limits<index_type>::max)(), "" );
982
        ix_ = ( I::value + 1 ) * 2;
983
    }
984
985
    constexpr std::size_t index() const noexcept
986
    {
987
        return ix_ / 2 - 1;
988
    }
989
990
    template<std::size_t I> BOOST_CXX14_CONSTEXPR mp11::mp_at_c<variant<T...>, I>& _get_impl( mp11::mp_size_t<I> ) noexcept
991
    {
992
        BOOST_ASSERT( index() == I );
993
994
        std::size_t const J = I+1;
995
996
        constexpr mp11::mp_size_t<J> j{};
997
        return st_[ ix_ & 1 ].get( j );
998
    }
999
1000
    template<std::size_t I> constexpr mp11::mp_at_c<variant<T...>, I> const& _get_impl( mp11::mp_size_t<I> ) const noexcept
1001
    {
1002
        BOOST_VARIANT2_CX14_ASSERT( index() == I )
1003
1004
        // std::size_t const J = I+1;
1005
        // constexpr mp_size_t<J> j{};
1006
1007
        return st_[ ix_ & 1 ].get( mp11::mp_size_t<I+1>() );
1008
    }
1009
1010
    template<std::size_t I, class... A> BOOST_CXX14_CONSTEXPR void emplace( A&&... a )
1011
    {
1012
        std::size_t const J = I+1;
1013
1014
        unsigned i2 = 1 - ( ix_ & 1 );
1015
1016
        st_[ i2 ].emplace( mp11::mp_size_t<J>(), std::forward<A>(a)... );
1017
1018
        static_assert( J * 2 + 1 <= (std::numeric_limits<index_type>::max)(), "" );
1019
        ix_ = static_cast<index_type>( J * 2 + i2 );
1020
    }
1021
1022
    static constexpr bool uses_double_storage() noexcept
1023
    {
1024
        return true;
1025
    }
1026
};
1027
1028
// not trivially destructible, single buffered
1029
template<class... T> struct variant_base_impl<false, true, T...>
1030
{
1031
    using index_type = get_index_type<false, T...>;
1032
1033
    variant_storage<none, T...> st_;
1034
    index_type ix_;
1035
1036
    constexpr variant_base_impl(): st_( mp11::mp_size_t<0>() ), ix_( 0 )
1037
    {
1038
    }
1039
1040
    template<class I, class... A> constexpr explicit variant_base_impl( I, A&&... a ): st_( mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... ), ix_( I::value + 1 )
1041
    {
1042
    }
1043
1044
    // requires: ix_ == 0
1045
    template<class I, class... A> void _replace( I, A&&... a )
1046
    {
1047
        ::new( &st_ ) variant_storage<none, T...>( mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... );
1048
1049
        static_assert( I::value + 1 <= (std::numeric_limits<index_type>::max)(), "" );
1050
        ix_ = I::value + 1;
1051
    }
1052
1053
    //[&]( auto I ){
1054
    //    using U = mp_at_c<mp_list<none, T...>, I>;
1055
    //    st1_.get( I ).~U();
1056
    //}
1057
1058
    struct _destroy_L1
1059
    {
1060
        variant_base_impl * this_;
1061
1062
        template<class I> void operator()( I ) const noexcept
1063
        {
1064
            using U = mp11::mp_at<mp11::mp_list<none, T...>, I>;
1065
            this_->st_.get( I() ).~U();
1066
        }
1067
    };
1068
1069
    void _destroy() noexcept
1070
    {
1071
        if( ix_ > 0 )
1072
        {
1073
            mp11::mp_with_index<1 + sizeof...(T)>( ix_, _destroy_L1{ this } );
1074
        }
1075
    }
1076
1077
    ~variant_base_impl() noexcept
1078
    {
1079
        _destroy();
1080
    }
1081
1082
    constexpr std::size_t index() const noexcept
1083
    {
1084
        return ix_ - 1;
1085
    }
1086
1087
    template<std::size_t I> BOOST_CXX14_CONSTEXPR mp11::mp_at_c<variant<T...>, I>& _get_impl( mp11::mp_size_t<I> ) noexcept
1088
    {
1089
        std::size_t const J = I+1;
1090
1091
        BOOST_ASSERT( ix_ == J );
1092
1093
        return st_.get( mp11::mp_size_t<J>() );
1094
    }
1095
1096
    template<std::size_t I> constexpr mp11::mp_at_c<variant<T...>, I> const& _get_impl( mp11::mp_size_t<I> ) const noexcept
1097
    {
1098
        // std::size_t const J = I+1;
1099
1100
        BOOST_VARIANT2_CX14_ASSERT( ix_ == I+1 )
1101
1102
        return st_.get( mp11::mp_size_t<I+1>() );
1103
    }
1104
1105
    template<std::size_t I, class... A> void emplace( A&&... a )
1106
    {
1107
        std::size_t const J = I+1;
1108
1109
        using U = mp11::mp_at_c<variant<T...>, I>;
1110
1111
        static_assert( std::is_nothrow_move_constructible<U>::value, "Logic error: U must be nothrow move constructible" );
1112
1113
        U tmp( std::forward<A>(a)... );
1114
1115
        _destroy();
1116
1117
        st_.emplace( mp11::mp_size_t<J>(), std::move(tmp) );
1118
1119
        static_assert( J <= (std::numeric_limits<index_type>::max)(), "" );
1120
        ix_ = J;
1121
    }
1122
1123
    static constexpr bool uses_double_storage() noexcept
1124
    {
1125
        return false;
1126
    }
1127
};
1128
1129
// not trivially destructible, double buffered
1130
template<class... T> struct variant_base_impl<false, false, T...>
1131
{
1132
    using index_type = get_index_type<true, T...>;
1133
1134
#if defined(__GNUC__) && __GNUC__ < 11 && !defined(__clang__) && !defined(__INTEL_COMPILER)
1135
1136
    // https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63707 :-(
1137
1138
    variant_storage<none, T...> st1_, st2_;
1139
    index_type ix_;
1140
1141
    constexpr variant_base_impl(): st1_( mp11::mp_size_t<0>() ), st2_( mp11::mp_size_t<0>() ), ix_( 0 )
1142
    {
1143
    }
1144
1145
    template<class I, class... A> constexpr explicit variant_base_impl( I, A&&... a ): st1_( mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... ), st2_( mp11::mp_size_t<0>() ), ix_( ( I::value + 1 ) * 2 )
1146
    {
1147
    }
1148
1149
    BOOST_CXX14_CONSTEXPR variant_storage<none, T...>& storage( unsigned i2 ) noexcept
1150
    {
1151
        return i2 == 0? st1_: st2_;
1152
    }
1153
1154
    constexpr variant_storage<none, T...> const& storage( unsigned i2 ) const noexcept
1155
    {
1156
        return i2 == 0? st1_: st2_;
1157
    }
1158
1159
#else
1160
1161
    variant_storage<none, T...> st_[ 2 ];
1162
    index_type ix_;
1163
1164
    constexpr variant_base_impl(): st_{ { mp11::mp_size_t<0>() }, { mp11::mp_size_t<0>() } }, ix_( 0 )
1165
    {
1166
    }
1167
1168
    template<class I, class... A> constexpr explicit variant_base_impl( I, A&&... a ): st_{ { mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... }, { mp11::mp_size_t<0>() } }, ix_( ( I::value + 1 ) * 2 )
1169
    {
1170
    }
1171
1172
    BOOST_CXX14_CONSTEXPR variant_storage<none, T...>& storage( unsigned i2 ) noexcept
1173
    {
1174
        return st_[ i2 ];
1175
    }
1176
1177
    constexpr variant_storage<none, T...> const& storage( unsigned i2 ) const noexcept
1178
    {
1179
        return st_[ i2 ];
1180
    }
1181
1182
#endif
1183
1184
    // requires: ix_ == 0
1185
    template<class I, class... A> void _replace( I, A&&... a )
1186
    {
1187
        ::new( &storage( 0 ) ) variant_storage<none, T...>( mp11::mp_size_t<I::value + 1>(), std::forward<A>(a)... );
1188
1189
        static_assert( ( I::value + 1 ) * 2 <= (std::numeric_limits<index_type>::max)(), "" );
1190
        ix_ = ( I::value + 1 ) * 2;
1191
    }
1192
1193
    //[&]( auto I ){
1194
    //    using U = mp_at_c<mp_list<none, T...>, I>;
1195
    //    st1_.get( I ).~U();
1196
    //}
1197
1198
    struct _destroy_L1
1199
    {
1200
        variant_base_impl * this_;
1201
        unsigned i2_;
1202
1203
        template<class I> void operator()( I ) const noexcept
1204
        {
1205
            using U = mp11::mp_at<mp11::mp_list<none, T...>, I>;
1206
            this_->storage( i2_ ).get( I() ).~U();
1207
        }
1208
    };
1209
1210
    void _destroy() noexcept
1211
    {
1212
        mp11::mp_with_index<1 + sizeof...(T)>( ix_ / 2, _destroy_L1{ this, static_cast<unsigned>( ix_ & 1 ) } );
1213
    }
1214
1215
    ~variant_base_impl() noexcept
1216
    {
1217
        _destroy();
1218
    }
1219
1220
    constexpr std::size_t index() const noexcept
1221
    {
1222
        return ix_ / 2 - 1;
1223
    }
1224
1225
    template<std::size_t I> BOOST_CXX14_CONSTEXPR mp11::mp_at_c<variant<T...>, I>& _get_impl( mp11::mp_size_t<I> ) noexcept
1226
    {
1227
        BOOST_ASSERT( index() == I );
1228
1229
        std::size_t const J = I+1;
1230
1231
        constexpr mp11::mp_size_t<J> j{};
1232
        return storage( ix_ & 1 ).get( j );
1233
    }
1234
1235
    template<std::size_t I> constexpr mp11::mp_at_c<variant<T...>, I> const& _get_impl( mp11::mp_size_t<I> ) const noexcept
1236
    {
1237
        BOOST_VARIANT2_CX14_ASSERT( index() == I )
1238
1239
        // std::size_t const J = I+1;
1240
        // constexpr mp_size_t<J> j{};
1241
1242
        return storage( ix_ & 1 ).get( mp11::mp_size_t<I+1>() );
1243
    }
1244
1245
    template<std::size_t I, class... A> void emplace( A&&... a )
1246
    {
1247
        std::size_t const J = I+1;
1248
1249
        unsigned i2 = 1 - ( ix_ & 1 );
1250
1251
        storage( i2 ).emplace( mp11::mp_size_t<J>(), std::forward<A>(a)... );
1252
        _destroy();
1253
1254
        static_assert( J * 2 + 1 <= (std::numeric_limits<index_type>::max)(), "" );
1255
        ix_ = static_cast<index_type>( J * 2 + i2 );
1256
    }
1257
1258
    static constexpr bool uses_double_storage() noexcept
1259
    {
1260
        return true;
1261
    }
1262
};
1263
1264
} // namespace detail
1265
1266
// in_place_type_t
1267
1268
template<class T> struct in_place_type_t
1269
{
1270
};
1271
1272
#if !defined(BOOST_NO_CXX14_VARIABLE_TEMPLATES)
1273
1274
template<class T> constexpr in_place_type_t<T> in_place_type{};
1275
1276
#endif
1277
1278
namespace detail
1279
{
1280
1281
template<class T> struct is_in_place_type: std::false_type {};
1282
template<class T> struct is_in_place_type<in_place_type_t<T>>: std::true_type {};
1283
1284
} // namespace detail
1285
1286
// in_place_index_t
1287
1288
template<std::size_t I> struct in_place_index_t
1289
{
1290
};
1291
1292
#if !defined(BOOST_NO_CXX14_VARIABLE_TEMPLATES)
1293
1294
template<std::size_t I> constexpr in_place_index_t<I> in_place_index{};
1295
1296
#endif
1297
1298
namespace detail
1299
{
1300
1301
template<class T> struct is_in_place_index: std::false_type {};
1302
template<std::size_t I> struct is_in_place_index<in_place_index_t<I>>: std::true_type {};
1303
1304
} // namespace detail
1305
1306
// is_nothrow_swappable
1307
1308
namespace detail
1309
{
1310
1311
namespace det2
1312
{
1313
1314
using std::swap;
1315
1316
template<class T> using is_swappable_impl = decltype(swap(std::declval<T&>(), std::declval<T&>()));
1317
1318
#if BOOST_WORKAROUND( BOOST_MSVC, < 1920 )
1319
1320
template<class T> struct is_nothrow_swappable_impl_
1321
{
1322
    static constexpr bool value = noexcept(swap(std::declval<T&>(), std::declval<T&>()));
1323
};
1324
1325
template<class T> using is_nothrow_swappable_impl = mp11::mp_bool< is_nothrow_swappable_impl_<T>::value >;
1326
1327
#else
1328
1329
template<class T> using is_nothrow_swappable_impl = typename std::enable_if<noexcept(swap(std::declval<T&>(), std::declval<T&>()))>::type;
1330
1331
#endif
1332
1333
} // namespace det2
1334
1335
template<class T> struct is_swappable: mp11::mp_valid<det2::is_swappable_impl, T>
1336
{
1337
};
1338
1339
#if BOOST_WORKAROUND( BOOST_MSVC, < 1920 )
1340
1341
template<class T> struct is_nothrow_swappable: mp11::mp_eval_if<mp11::mp_not<is_swappable<T>>, mp11::mp_false, det2::is_nothrow_swappable_impl, T>
1342
{
1343
};
1344
1345
#else
1346
1347
template<class T> struct is_nothrow_swappable: mp11::mp_valid<det2::is_nothrow_swappable_impl, T>
1348
{
1349
};
1350
1351
#endif
1352
1353
// variant_cc_base
1354
1355
template<bool CopyConstructible, bool TriviallyCopyConstructible, class... T> struct variant_cc_base_impl;
1356
1357
template<class... T> using variant_cc_base = variant_cc_base_impl<
1358
    mp11::mp_all<std::is_copy_constructible<T>...>::value,
1359
    mp11::mp_all<detail::is_trivially_copy_constructible<T>...>::value,
1360
    T...>;
1361
1362
template<class... T> struct variant_cc_base_impl<true, true, T...>: public variant_base<T...>
1363
{
1364
    using variant_base = detail::variant_base<T...>;
1365
    using variant_base::variant_base;
1366
1367
    variant_cc_base_impl() = default;
1368
    variant_cc_base_impl( variant_cc_base_impl const& ) = default;
1369
    variant_cc_base_impl( variant_cc_base_impl && ) = default;
1370
    variant_cc_base_impl& operator=( variant_cc_base_impl const& ) = default;
1371
    variant_cc_base_impl& operator=( variant_cc_base_impl && ) = default;
1372
};
1373
1374
template<bool B, class... T> struct variant_cc_base_impl<false, B, T...>: public variant_base<T...>
1375
{
1376
    using variant_base = detail::variant_base<T...>;
1377
    using variant_base::variant_base;
1378
1379
    variant_cc_base_impl() = default;
1380
    variant_cc_base_impl( variant_cc_base_impl const& ) = delete;
1381
    variant_cc_base_impl( variant_cc_base_impl && ) = default;
1382
    variant_cc_base_impl& operator=( variant_cc_base_impl const& ) = default;
1383
    variant_cc_base_impl& operator=( variant_cc_base_impl && ) = default;
1384
};
1385
1386
template<class... T> struct variant_cc_base_impl<true, false, T...>: public variant_base<T...>
1387
{
1388
    using variant_base = detail::variant_base<T...>;
1389
    using variant_base::variant_base;
1390
1391
public:
1392
1393
    // constructors
1394
1395
    variant_cc_base_impl() = default;
1396
1397
    // copy constructor
1398
1399
private:
1400
1401
    struct L1
1402
    {
1403
        variant_base * this_;
1404
        variant_base const & r;
1405
1406
        template<class I> void operator()( I i ) const
1407
        {
1408
            this_->_replace( i, r._get_impl( i ) );
1409
        }
1410
    };
1411
1412
public:
1413
1414
    variant_cc_base_impl( variant_cc_base_impl const& r )
1415
        noexcept( mp11::mp_all<std::is_nothrow_copy_constructible<T>...>::value )
1416
        : variant_base()
1417
    {
1418
        mp11::mp_with_index<sizeof...(T)>( r.index(), L1{ this, r } );
1419
    }
1420
1421
    // move constructor
1422
1423
    variant_cc_base_impl( variant_cc_base_impl && ) = default;
1424
1425
    // assignment
1426
1427
    variant_cc_base_impl& operator=( variant_cc_base_impl const & ) = default;
1428
    variant_cc_base_impl& operator=( variant_cc_base_impl && ) = default;
1429
};
1430
1431
// variant_ca_base
1432
1433
template<bool CopyAssignable, bool TriviallyCopyAssignable, class... T> struct variant_ca_base_impl;
1434
1435
template<class... T> using variant_ca_base = variant_ca_base_impl<
1436
    mp11::mp_all<std::is_copy_constructible<T>..., std::is_copy_assignable<T>...>::value,
1437
    mp11::mp_all<std::is_trivially_destructible<T>..., detail::is_trivially_copy_constructible<T>..., detail::is_trivially_copy_assignable<T>...>::value,
1438
    T...>;
1439
1440
template<class... T> struct variant_ca_base_impl<true, true, T...>: public variant_cc_base<T...>
1441
{
1442
    using variant_base = detail::variant_cc_base<T...>;
1443
    using variant_base::variant_base;
1444
1445
    variant_ca_base_impl() = default;
1446
    variant_ca_base_impl( variant_ca_base_impl const& ) = default;
1447
    variant_ca_base_impl( variant_ca_base_impl && ) = default;
1448
    variant_ca_base_impl& operator=( variant_ca_base_impl const& ) = default;
1449
    variant_ca_base_impl& operator=( variant_ca_base_impl && ) = default;
1450
};
1451
1452
template<bool B, class... T> struct variant_ca_base_impl<false, B, T...>: public variant_cc_base<T...>
1453
{
1454
    using variant_base = detail::variant_cc_base<T...>;
1455
    using variant_base::variant_base;
1456
1457
    variant_ca_base_impl() = default;
1458
    variant_ca_base_impl( variant_ca_base_impl const& ) = default;
1459
    variant_ca_base_impl( variant_ca_base_impl && ) = default;
1460
    variant_ca_base_impl& operator=( variant_ca_base_impl const& ) = delete;
1461
    variant_ca_base_impl& operator=( variant_ca_base_impl && ) = default;
1462
};
1463
1464
template<class... T> struct variant_ca_base_impl<true, false, T...>: public variant_cc_base<T...>
1465
{
1466
    using variant_base = detail::variant_cc_base<T...>;
1467
    using variant_base::variant_base;
1468
1469
public:
1470
1471
    // constructors
1472
1473
    variant_ca_base_impl() = default;
1474
    variant_ca_base_impl( variant_ca_base_impl const& ) = default;
1475
    variant_ca_base_impl( variant_ca_base_impl && ) = default;
1476
1477
    // copy assignment
1478
1479
private:
1480
1481
    struct L3
1482
    {
1483
        variant_base * this_;
1484
        variant_base const & r;
1485
1486
        template<class I> void operator()( I i ) const
1487
        {
1488
            this_->template emplace<I::value>( r._get_impl( i ) );
1489
        }
1490
    };
1491
1492
public:
1493
1494
    BOOST_CXX14_CONSTEXPR variant_ca_base_impl& operator=( variant_ca_base_impl const & r )
1495
        noexcept( mp11::mp_all<std::is_nothrow_copy_constructible<T>...>::value )
1496
    {
1497
        mp11::mp_with_index<sizeof...(T)>( r.index(), L3{ this, r } );
1498
        return *this;
1499
    }
1500
1501
    // move assignment
1502
1503
    variant_ca_base_impl& operator=( variant_ca_base_impl && ) = default;
1504
};
1505
1506
// variant_mc_base
1507
1508
template<bool MoveConstructible, bool TriviallyMoveConstructible, class... T> struct variant_mc_base_impl;
1509
1510
template<class... T> using variant_mc_base = variant_mc_base_impl<
1511
    mp11::mp_all<std::is_move_constructible<T>...>::value,
1512
    mp11::mp_all<detail::is_trivially_move_constructible<T>...>::value,
1513
    T...>;
1514
1515
template<class... T> struct variant_mc_base_impl<true, true, T...>: public variant_ca_base<T...>
1516
{
1517
    using variant_base = detail::variant_ca_base<T...>;
1518
    using variant_base::variant_base;
1519
1520
    variant_mc_base_impl() = default;
1521
    variant_mc_base_impl( variant_mc_base_impl const& ) = default;
1522
    variant_mc_base_impl( variant_mc_base_impl && ) = default;
1523
    variant_mc_base_impl& operator=( variant_mc_base_impl const& ) = default;
1524
    variant_mc_base_impl& operator=( variant_mc_base_impl && ) = default;
1525
};
1526
1527
template<bool B, class... T> struct variant_mc_base_impl<false, B, T...>: public variant_ca_base<T...>
1528
{
1529
    using variant_base = detail::variant_ca_base<T...>;
1530
    using variant_base::variant_base;
1531
1532
    variant_mc_base_impl() = default;
1533
    variant_mc_base_impl( variant_mc_base_impl const& ) = default;
1534
    variant_mc_base_impl( variant_mc_base_impl && ) = delete;
1535
    variant_mc_base_impl& operator=( variant_mc_base_impl const& ) = default;
1536
    variant_mc_base_impl& operator=( variant_mc_base_impl && ) = default;
1537
};
1538
1539
template<class... T> struct variant_mc_base_impl<true, false, T...>: public variant_ca_base<T...>
1540
{
1541
    using variant_base = detail::variant_ca_base<T...>;
1542
    using variant_base::variant_base;
1543
1544
public:
1545
1546
    // constructors
1547
1548
    variant_mc_base_impl() = default;
1549
    variant_mc_base_impl( variant_mc_base_impl const& ) = default;
1550
1551
    // move constructor
1552
1553
private:
1554
1555
    struct L2
1556
    {
1557
        variant_base * this_;
1558
        variant_base & r;
1559
1560
        template<class I> void operator()( I i ) const
1561
        {
1562
            this_->_replace( i, std::move( r._get_impl( i ) ) );
1563
        }
1564
    };
1565
1566
public:
1567
1568
    variant_mc_base_impl( variant_mc_base_impl && r )
1569
        noexcept( mp11::mp_all<std::is_nothrow_move_constructible<T>...>::value )
1570
    {
1571
        mp11::mp_with_index<sizeof...(T)>( r.index(), L2{ this, r } );
1572
    }
1573
1574
    // assignment
1575
1576
    variant_mc_base_impl& operator=( variant_mc_base_impl const & ) = default;
1577
    variant_mc_base_impl& operator=( variant_mc_base_impl && ) = default;
1578
};
1579
1580
// variant_ma_base
1581
1582
template<bool MoveAssignable, bool TriviallyMoveAssignable, class... T> struct variant_ma_base_impl;
1583
1584
template<class... T> using variant_ma_base = variant_ma_base_impl<
1585
    mp11::mp_all<std::is_move_constructible<T>..., std::is_move_assignable<T>...>::value,
1586
    mp11::mp_all<std::is_trivially_destructible<T>..., detail::is_trivially_move_constructible<T>..., detail::is_trivially_move_assignable<T>...>::value,
1587
    T...>;
1588
1589
template<class... T> struct variant_ma_base_impl<true, true, T...>: public variant_mc_base<T...>
1590
{
1591
    using variant_base = detail::variant_mc_base<T...>;
1592
    using variant_base::variant_base;
1593
1594
    variant_ma_base_impl() = default;
1595
    variant_ma_base_impl( variant_ma_base_impl const& ) = default;
1596
    variant_ma_base_impl( variant_ma_base_impl && ) = default;
1597
    variant_ma_base_impl& operator=( variant_ma_base_impl const& ) = default;
1598
    variant_ma_base_impl& operator=( variant_ma_base_impl && ) = default;
1599
};
1600
1601
template<bool B, class... T> struct variant_ma_base_impl<false, B, T...>: public variant_mc_base<T...>
1602
{
1603
    using variant_base = detail::variant_mc_base<T...>;
1604
    using variant_base::variant_base;
1605
1606
    variant_ma_base_impl() = default;
1607
    variant_ma_base_impl( variant_ma_base_impl const& ) = default;
1608
    variant_ma_base_impl( variant_ma_base_impl && ) = default;
1609
    variant_ma_base_impl& operator=( variant_ma_base_impl const& ) = default;
1610
    variant_ma_base_impl& operator=( variant_ma_base_impl && ) = delete;
1611
};
1612
1613
template<class... T> struct variant_ma_base_impl<true, false, T...>: public variant_mc_base<T...>
1614
{
1615
    using variant_base = detail::variant_mc_base<T...>;
1616
    using variant_base::variant_base;
1617
1618
public:
1619
1620
    // constructors
1621
1622
    variant_ma_base_impl() = default;
1623
    variant_ma_base_impl( variant_ma_base_impl const& ) = default;
1624
    variant_ma_base_impl( variant_ma_base_impl && ) = default;
1625
1626
    // copy assignment
1627
1628
    variant_ma_base_impl& operator=( variant_ma_base_impl const & ) = default;
1629
1630
    // move assignment
1631
1632
private:
1633
1634
    struct L4
1635
    {
1636
        variant_base * this_;
1637
        variant_base & r;
1638
1639
        template<class I> void operator()( I i ) const
1640
        {
1641
            this_->template emplace<I::value>( std::move( r._get_impl( i ) ) );
1642
        }
1643
    };
1644
1645
public:
1646
1647
    variant_ma_base_impl& operator=( variant_ma_base_impl && r )
1648
        noexcept( mp11::mp_all<std::is_nothrow_move_constructible<T>...>::value )
1649
    {
1650
        mp11::mp_with_index<sizeof...(T)>( r.index(), L4{ this, r } );
1651
        return *this;
1652
    }
1653
};
1654
1655
} // namespace detail
1656
1657
// variant
1658
1659
template<class... T> class variant: private detail::variant_ma_base<T...>
1660
{
1661
private:
1662
1663
    using variant_base = detail::variant_ma_base<T...>;
1664
1665
public:
1666
1667
    // constructors
1668
1669
    template<class E1 = void, class E2 = mp11::mp_if<std::is_default_constructible< mp11::mp_first<variant<T...>> >, E1>>
1670
    constexpr variant()
1671
        noexcept( std::is_nothrow_default_constructible< mp11::mp_first<variant<T...>> >::value )
1672
        : variant_base( mp11::mp_size_t<0>() )
1673
    {
1674
    }
1675
1676
    // variant( variant const& ) = default;
1677
    // variant( variant && ) = default;
1678
1679
    template<class U,
1680
        class Ud = typename std::decay<U>::type,
1681
        class E1 = typename std::enable_if< !std::is_same<Ud, variant>::value && !std::is_base_of<variant, Ud>::value && !detail::is_in_place_index<Ud>::value && !detail::is_in_place_type<Ud>::value >::type,
1682
1683
#if BOOST_WORKAROUND(BOOST_MSVC, < 1950)
1684
1685
        class V = mp11::mp_apply_q< mp11::mp_bind_front<detail::resolve_overload_type, U&&>, variant >,
1686
1687
#else
1688
1689
        class V = detail::resolve_overload_type<U&&, T...>,
1690
1691
#endif
1692
1693
        class E2 = typename std::enable_if<std::is_constructible<V, U&&>::value>::type
1694
        >
1695
    constexpr variant( U&& u )
1696
        noexcept( std::is_nothrow_constructible<V, U&&>::value )
1697
        : variant_base( detail::resolve_overload_index<U&&, T...>(), std::forward<U>(u) )
1698
    {
1699
    }
1700
1701
    template<class U, class... A, class I = mp11::mp_find<variant<T...>, U>, class E = typename std::enable_if<std::is_constructible<U, A&&...>::value>::type>
1702
    constexpr explicit variant( in_place_type_t<U>, A&&... a ): variant_base( I(), std::forward<A>(a)... )
1703
    {
1704
    }
1705
1706
    template<class U, class V, class... A, class I = mp11::mp_find<variant<T...>, U>, class E = typename std::enable_if<std::is_constructible<U, std::initializer_list<V>&, A&&...>::value>::type>
1707
    constexpr explicit variant( in_place_type_t<U>, std::initializer_list<V> il, A&&... a ): variant_base( I(), il, std::forward<A>(a)... )
1708
    {
1709
    }
1710
1711
    template<std::size_t I, class... A, class E = typename std::enable_if<std::is_constructible<mp11::mp_at_c<variant<T...>, I>, A&&...>::value>::type>
1712
0
    constexpr explicit variant( in_place_index_t<I>, A&&... a ): variant_base( mp11::mp_size_t<I>(), std::forward<A>(a)... )
1713
0
    {
1714
0
    }
Unexecuted instantiation: boost::variant2::variant<boost::json::value*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::value*, boost::system::error_code>::variant<0ul, boost::json::value*, void>(boost::variant2::in_place_index_t<0ul>, boost::json::value*&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::value const*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::value const*, boost::system::error_code>::variant<0ul, boost::json::value const*, void>(boost::variant2::in_place_index_t<0ul>, boost::json::value const*&&)
Unexecuted instantiation: boost::variant2::variant<char*, boost::system::error_code>::variant<0ul, char*, void>(boost::variant2::in_place_index_t<0ul>, char*&&)
Unexecuted instantiation: boost::variant2::variant<char*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<char const*, boost::system::error_code>::variant<0ul, char const*, void>(boost::variant2::in_place_index_t<0ul>, char const*&&)
Unexecuted instantiation: boost::variant2::variant<char const*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::array*, boost::system::error_code>::variant<0ul, boost::json::array*, void>(boost::variant2::in_place_index_t<0ul>, boost::json::array*&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::array*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::array const*, boost::system::error_code>::variant<0ul, boost::json::array const*, void>(boost::variant2::in_place_index_t<0ul>, boost::json::array const*&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::array const*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::object*, boost::system::error_code>::variant<0ul, boost::json::object*, void>(boost::variant2::in_place_index_t<0ul>, boost::json::object*&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::object*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::object const*, boost::system::error_code>::variant<0ul, boost::json::object const*, void>(boost::variant2::in_place_index_t<0ul>, boost::json::object const*&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::object const*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::string*, boost::system::error_code>::variant<0ul, boost::json::string*, void>(boost::variant2::in_place_index_t<0ul>, boost::json::string*&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::string*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::string const*, boost::system::error_code>::variant<0ul, boost::json::string const*, void>(boost::variant2::in_place_index_t<0ul>, boost::json::string const*&&)
Unexecuted instantiation: boost::variant2::variant<boost::json::string const*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<long*, boost::system::error_code>::variant<0ul, long*, void>(boost::variant2::in_place_index_t<0ul>, long*&&)
Unexecuted instantiation: boost::variant2::variant<long*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<long, boost::system::error_code>::variant<0ul, long const&, void>(boost::variant2::in_place_index_t<0ul>, long const&)
Unexecuted instantiation: boost::variant2::variant<long, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<unsigned long*, boost::system::error_code>::variant<0ul, unsigned long*, void>(boost::variant2::in_place_index_t<0ul>, unsigned long*&&)
Unexecuted instantiation: boost::variant2::variant<unsigned long*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<unsigned long, boost::system::error_code>::variant<0ul, unsigned long const&, void>(boost::variant2::in_place_index_t<0ul>, unsigned long const&)
Unexecuted instantiation: boost::variant2::variant<unsigned long, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<double*, boost::system::error_code>::variant<0ul, double*, void>(boost::variant2::in_place_index_t<0ul>, double*&&)
Unexecuted instantiation: boost::variant2::variant<double*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<double, boost::system::error_code>::variant<0ul, double const&, void>(boost::variant2::in_place_index_t<0ul>, double const&)
Unexecuted instantiation: boost::variant2::variant<double, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<bool*, boost::system::error_code>::variant<0ul, bool*, void>(boost::variant2::in_place_index_t<0ul>, bool*&&)
Unexecuted instantiation: boost::variant2::variant<bool*, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<bool, boost::system::error_code>::variant<0ul, bool const&, void>(boost::variant2::in_place_index_t<0ul>, bool const&)
Unexecuted instantiation: boost::variant2::variant<bool, boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
Unexecuted instantiation: boost::variant2::variant<decltype(nullptr), boost::system::error_code>::variant<0ul, decltype(nullptr), void>(boost::variant2::in_place_index_t<0ul>, decltype(nullptr)&&)
Unexecuted instantiation: boost::variant2::variant<decltype(nullptr), boost::system::error_code>::variant<1ul, boost::system::error_code, void>(boost::variant2::in_place_index_t<1ul>, boost::system::error_code&&)
1715
1716
    template<std::size_t I, class V, class... A, class E = typename std::enable_if<std::is_constructible<mp11::mp_at_c<variant<T...>, I>, std::initializer_list<V>&, A&&...>::value>::type>
1717
    constexpr explicit variant( in_place_index_t<I>, std::initializer_list<V> il, A&&... a ): variant_base( mp11::mp_size_t<I>(), il, std::forward<A>(a)... )
1718
    {
1719
    }
1720
1721
    // assignment
1722
1723
    // variant& operator=( variant const& ) = default;
1724
    // variant& operator=( variant && ) = default;
1725
1726
    template<class U,
1727
        class E1 = typename std::enable_if<!std::is_same<typename std::decay<U>::type, variant>::value>::type,
1728
        class V = detail::resolve_overload_type<U, T...>,
1729
        class E2 = typename std::enable_if<std::is_assignable<V&, U&&>::value && std::is_constructible<V, U&&>::value>::type
1730
    >
1731
    BOOST_CXX14_CONSTEXPR variant& operator=( U&& u )
1732
        noexcept( std::is_nothrow_constructible<V, U&&>::value )
1733
    {
1734
        std::size_t const I = detail::resolve_overload_index<U, T...>::value;
1735
        this->template emplace<I>( std::forward<U>(u) );
1736
        return *this;
1737
    }
1738
1739
    // modifiers
1740
1741
    template<class U, class... A,
1742
        class E = typename std::enable_if< mp11::mp_count<variant<T...>, U>::value == 1 && std::is_constructible<U, A&&...>::value >::type>
1743
    BOOST_CXX14_CONSTEXPR U& emplace( A&&... a )
1744
    {
1745
        using I = mp11::mp_find<variant<T...>, U>;
1746
        variant_base::template emplace<I::value>( std::forward<A>(a)... );
1747
        return _get_impl( I() );
1748
    }
1749
1750
    template<class U, class V, class... A,
1751
        class E = typename std::enable_if< mp11::mp_count<variant<T...>, U>::value == 1 && std::is_constructible<U, std::initializer_list<V>&, A&&...>::value >::type>
1752
    BOOST_CXX14_CONSTEXPR U& emplace( std::initializer_list<V> il, A&&... a )
1753
    {
1754
        using I = mp11::mp_find<variant<T...>, U>;
1755
        variant_base::template emplace<I::value>( il, std::forward<A>(a)... );
1756
        return _get_impl( I() );
1757
    }
1758
1759
    template<std::size_t I, class... A, class E = typename std::enable_if<std::is_constructible<mp11::mp_at_c<variant<T...>, I>, A&&...>::value>::type>
1760
    BOOST_CXX14_CONSTEXPR variant_alternative_t<I, variant<T...>>& emplace( A&&... a )
1761
    {
1762
        variant_base::template emplace<I>( std::forward<A>(a)... );
1763
        return _get_impl( mp11::mp_size_t<I>() );
1764
    }
1765
1766
    template<std::size_t I, class V, class... A, class E = typename std::enable_if<std::is_constructible<mp11::mp_at_c<variant<T...>, I>, std::initializer_list<V>&, A&&...>::value>::type>
1767
    BOOST_CXX14_CONSTEXPR variant_alternative_t<I, variant<T...>>& emplace( std::initializer_list<V> il, A&&... a )
1768
    {
1769
        variant_base::template emplace<I>( il, std::forward<A>(a)... );
1770
        return _get_impl( mp11::mp_size_t<I>() );
1771
    }
1772
1773
    // value status
1774
1775
    constexpr bool valueless_by_exception() const noexcept
1776
    {
1777
        return false;
1778
    }
1779
1780
    using variant_base::index;
1781
1782
    using variant_base::uses_double_storage;
1783
1784
    // swap
1785
1786
private:
1787
1788
    struct L5
1789
    {
1790
        variant * this_;
1791
        variant & r;
1792
1793
        template<class I> void operator()( I i ) const
1794
        {
1795
            using std::swap;
1796
            swap( this_->_get_impl( i ), r._get_impl( i ) );
1797
        }
1798
    };
1799
1800
public:
1801
1802
    void swap( variant& r ) noexcept( mp11::mp_all<std::is_nothrow_move_constructible<T>..., detail::is_nothrow_swappable<T>...>::value )
1803
    {
1804
        if( index() == r.index() )
1805
        {
1806
            mp11::mp_with_index<sizeof...(T)>( index(), L5{ this, r } );
1807
        }
1808
        else
1809
        {
1810
            variant tmp( std::move(*this) );
1811
            *this = std::move( r );
1812
            r = std::move( tmp );
1813
        }
1814
    }
1815
1816
    // private accessors
1817
1818
    using variant_base::_get_impl;
1819
1820
    // converting constructors (extension)
1821
1822
private:
1823
1824
    template<class... U> struct L6
1825
    {
1826
        variant_base * this_;
1827
        variant<U...> const & r;
1828
1829
        template<class I> void operator()( I i ) const
1830
        {
1831
            using J = mp11::mp_find<mp11::mp_list<T...>, mp11::mp_at<mp11::mp_list<U...>, I>>;
1832
            this_->_replace( J{}, r._get_impl( i ) );
1833
        }
1834
    };
1835
1836
public:
1837
1838
    template<class... U,
1839
        class E2 = mp11::mp_if<mp11::mp_all<std::is_copy_constructible<U>..., mp11::mp_contains<mp11::mp_list<T...>, U>...>, void> >
1840
    variant( variant<U...> const& r )
1841
        noexcept( mp11::mp_all<std::is_nothrow_copy_constructible<U>...>::value )
1842
    {
1843
        mp11::mp_with_index<sizeof...(U)>( r.index(), L6<U...>{ this, r } );
1844
    }
1845
1846
private:
1847
1848
    template<class... U> struct L7
1849
    {
1850
        variant_base * this_;
1851
        variant<U...> & r;
1852
1853
        template<class I> void operator()( I i ) const
1854
        {
1855
            using J = mp11::mp_find<mp11::mp_list<T...>, mp11::mp_at<mp11::mp_list<U...>, I>>;
1856
            this_->_replace( J{}, std::move( r._get_impl( i ) ) );
1857
        }
1858
    };
1859
1860
public:
1861
1862
    template<class... U,
1863
        class E2 = mp11::mp_if<mp11::mp_all<std::is_move_constructible<U>..., mp11::mp_contains<mp11::mp_list<T...>, U>...>, void> >
1864
    variant( variant<U...> && r )
1865
        noexcept( mp11::mp_all<std::is_nothrow_move_constructible<U>...>::value )
1866
    {
1867
        mp11::mp_with_index<sizeof...(U)>( r.index(), L7<U...>{ this, r } );
1868
    }
1869
1870
    // subset (extension)
1871
1872
private:
1873
1874
    template<class... U, class V, std::size_t J, class E = typename std::enable_if<J != sizeof...(U)>::type> static constexpr variant<U...> _subset_impl( mp11::mp_size_t<J>, V && v )
1875
    {
1876
        return variant<U...>( in_place_index_t<J>(), std::forward<V>(v) );
1877
    }
1878
1879
    template<class... U, class V> static variant<U...> _subset_impl( mp11::mp_size_t<sizeof...(U)>, V && /*v*/ )
1880
    {
1881
        detail::throw_bad_variant_access();
1882
    }
1883
1884
private:
1885
1886
    template<class... U> struct L8
1887
    {
1888
        variant * this_;
1889
1890
        template<class I> variant<U...> operator()( I i ) const
1891
        {
1892
            using J = mp11::mp_find<mp11::mp_list<U...>, mp11::mp_at<mp11::mp_list<T...>, I>>;
1893
            return this_->_subset_impl<U...>( J{}, this_->_get_impl( i ) );
1894
        }
1895
    };
1896
1897
public:
1898
1899
    template<class... U,
1900
        class E2 = mp11::mp_if<mp11::mp_all<std::is_copy_constructible<U>..., mp11::mp_contains<mp11::mp_list<T...>, U>...>, void> >
1901
    BOOST_CXX14_CONSTEXPR variant<U...> subset() &
1902
    {
1903
        return mp11::mp_with_index<sizeof...(T)>( index(), L8<U...>{ this } );
1904
    }
1905
1906
private:
1907
1908
    template<class... U> struct L9
1909
    {
1910
        variant const * this_;
1911
1912
        template<class I> variant<U...> operator()( I i ) const
1913
        {
1914
            using J = mp11::mp_find<mp11::mp_list<U...>, mp11::mp_at<mp11::mp_list<T...>, I>>;
1915
            return this_->_subset_impl<U...>( J{}, this_->_get_impl( i ) );
1916
        }
1917
    };
1918
1919
public:
1920
1921
    template<class... U,
1922
        class E2 = mp11::mp_if<mp11::mp_all<std::is_copy_constructible<U>..., mp11::mp_contains<mp11::mp_list<T...>, U>...>, void> >
1923
    constexpr variant<U...> subset() const&
1924
    {
1925
        return mp11::mp_with_index<sizeof...(T)>( index(), L9<U...>{ this } );
1926
    }
1927
1928
private:
1929
1930
    template<class... U> struct L10
1931
    {
1932
        variant * this_;
1933
1934
        template<class I> variant<U...> operator()( I i ) const
1935
        {
1936
            using J = mp11::mp_find<mp11::mp_list<U...>, mp11::mp_at<mp11::mp_list<T...>, I>>;
1937
            return this_->_subset_impl<U...>( J{}, std::move( this_->_get_impl( i ) ) );
1938
        }
1939
    };
1940
1941
public:
1942
1943
    template<class... U,
1944
        class E2 = mp11::mp_if<mp11::mp_all<std::is_copy_constructible<U>..., mp11::mp_contains<mp11::mp_list<T...>, U>...>, void> >
1945
    BOOST_CXX14_CONSTEXPR variant<U...> subset() &&
1946
    {
1947
        return mp11::mp_with_index<sizeof...(T)>( index(), L10<U...>{ this } );
1948
    }
1949
1950
#if !BOOST_WORKAROUND(BOOST_GCC, < 40900)
1951
1952
    // g++ 4.8 doesn't handle const&& particularly well
1953
1954
private:
1955
1956
    template<class... U> struct L11
1957
    {
1958
        variant const * this_;
1959
1960
        template<class I> variant<U...> operator()( I i ) const
1961
        {
1962
            using J = mp11::mp_find<mp11::mp_list<U...>, mp11::mp_at<mp11::mp_list<T...>, I>>;
1963
            return this_->_subset_impl<U...>( J{}, std::move( this_->_get_impl( i ) ) );
1964
        }
1965
    };
1966
1967
public:
1968
1969
    template<class... U,
1970
        class E2 = mp11::mp_if<mp11::mp_all<std::is_copy_constructible<U>..., mp11::mp_contains<mp11::mp_list<T...>, U>...>, void> >
1971
    constexpr variant<U...> subset() const&&
1972
    {
1973
        return mp11::mp_with_index<sizeof...(T)>( index(), L11<U...>{ this } );
1974
    }
1975
1976
#endif
1977
};
1978
1979
// relational operators
1980
1981
namespace detail
1982
{
1983
1984
template<class... T> struct eq_L
1985
{
1986
    variant<T...> const & v;
1987
    variant<T...> const & w;
1988
1989
    template<class I> constexpr bool operator()( I i ) const
1990
    {
1991
        return v._get_impl( i ) == w._get_impl( i );
1992
    }
1993
};
1994
1995
} // namespace detail
1996
1997
template<class... T> constexpr bool operator==( variant<T...> const & v, variant<T...> const & w )
1998
{
1999
    return v.index() == w.index() && mp11::mp_with_index<sizeof...(T)>( v.index(), detail::eq_L<T...>{ v, w } );
2000
}
2001
2002
namespace detail
2003
{
2004
2005
template<class... T> struct ne_L
2006
{
2007
    variant<T...> const & v;
2008
    variant<T...> const & w;
2009
2010
    template<class I> constexpr bool operator()( I i ) const
2011
    {
2012
        return v._get_impl( i ) != w._get_impl( i );
2013
    }
2014
};
2015
2016
} // namespace detail
2017
2018
template<class... T> constexpr bool operator!=( variant<T...> const & v, variant<T...> const & w )
2019
{
2020
    return v.index() != w.index() || mp11::mp_with_index<sizeof...(T)>( v.index(), detail::ne_L<T...>{ v, w } );
2021
}
2022
2023
namespace detail
2024
{
2025
2026
template<class... T> struct lt_L
2027
{
2028
    variant<T...> const & v;
2029
    variant<T...> const & w;
2030
2031
    template<class I> constexpr bool operator()( I i ) const
2032
    {
2033
        return v._get_impl( i ) < w._get_impl( i );
2034
    }
2035
};
2036
2037
} // namespace detail
2038
2039
template<class... T> constexpr bool operator<( variant<T...> const & v, variant<T...> const & w )
2040
{
2041
    return v.index() < w.index() || ( v.index() == w.index() && mp11::mp_with_index<sizeof...(T)>( v.index(), detail::lt_L<T...>{ v, w } ) );
2042
}
2043
2044
template<class... T> constexpr bool operator>(  variant<T...> const & v, variant<T...> const & w )
2045
{
2046
    return w < v;
2047
}
2048
2049
namespace detail
2050
{
2051
2052
template<class... T> struct le_L
2053
{
2054
    variant<T...> const & v;
2055
    variant<T...> const & w;
2056
2057
    template<class I> constexpr bool operator()( I i ) const
2058
    {
2059
        return v._get_impl( i ) <= w._get_impl( i );
2060
    }
2061
};
2062
2063
} // namespace detail
2064
2065
template<class... T> constexpr bool operator<=( variant<T...> const & v, variant<T...> const & w )
2066
{
2067
    return v.index() < w.index() || ( v.index() == w.index() && mp11::mp_with_index<sizeof...(T)>( v.index(), detail::le_L<T...>{ v, w } ) );
2068
}
2069
2070
template<class... T> constexpr bool operator>=( variant<T...> const & v, variant<T...> const & w )
2071
{
2072
    return w <= v;
2073
}
2074
2075
// visitation
2076
namespace detail
2077
{
2078
2079
template<class T> using remove_cv_ref_t = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
2080
2081
template<class... T> variant<T...> const & extract_variant_base_( variant<T...> const & );
2082
2083
#if BOOST_WORKAROUND( BOOST_MSVC, < 1930 )
2084
2085
template<class V> struct extract_vbase_impl
2086
{
2087
    using type = decltype( extract_variant_base_( std::declval<V>() ) );
2088
};
2089
2090
template<class V> using extract_variant_base = remove_cv_ref_t< typename extract_vbase_impl<V>::type >;
2091
2092
#else
2093
2094
template<class V> using extract_variant_base = remove_cv_ref_t< decltype( extract_variant_base_( std::declval<V>() ) ) >;
2095
2096
#endif
2097
2098
template<class V> using variant_base_size = variant_size< extract_variant_base<V> >;
2099
2100
template<class T, class U> struct copy_cv_ref
2101
{
2102
    using type = T;
2103
};
2104
2105
template<class T, class U> struct copy_cv_ref<T, U const>
2106
{
2107
    using type = T const;
2108
};
2109
2110
template<class T, class U> struct copy_cv_ref<T, U volatile>
2111
{
2112
    using type = T volatile;
2113
};
2114
2115
template<class T, class U> struct copy_cv_ref<T, U const volatile>
2116
{
2117
    using type = T const volatile;
2118
};
2119
2120
template<class T, class U> struct copy_cv_ref<T, U&>
2121
{
2122
    using type = typename copy_cv_ref<T, U>::type&;
2123
};
2124
2125
template<class T, class U> struct copy_cv_ref<T, U&&>
2126
{
2127
    using type = typename copy_cv_ref<T, U>::type&&;
2128
};
2129
2130
template<class T, class U> using copy_cv_ref_t = typename copy_cv_ref<T, U>::type;
2131
2132
template<class F> struct Qret
2133
{
2134
    template<class... T> using fn = decltype( std::declval<F>()( std::declval<T>()... ) );
2135
};
2136
2137
template<class L> using front_if_same = mp11::mp_if<mp11::mp_apply<mp11::mp_same, L>, mp11::mp_front<L>>;
2138
2139
template<class V> using apply_cv_ref = mp11::mp_product<copy_cv_ref_t, extract_variant_base<V>, mp11::mp_list<V>>;
2140
2141
struct deduced {};
2142
2143
#if !BOOST_WORKAROUND( BOOST_MSVC, < 1920 )
2144
2145
template<class R, class F, class... V> using Vret = mp11::mp_eval_if_not< std::is_same<R, deduced>, R, front_if_same, mp11::mp_product_q<Qret<F>, apply_cv_ref<V>...> >;
2146
2147
#else
2148
2149
template<class R, class F, class... V> struct Vret_impl
2150
{
2151
    using type = mp11::mp_eval_if_not< std::is_same<R, deduced>, R, front_if_same, mp11::mp_product_q<Qret<F>, apply_cv_ref<V>...> >;
2152
};
2153
2154
template<class R, class F, class... V> using Vret = typename Vret_impl<R, F, V...>::type;
2155
2156
#endif
2157
2158
} // namespace detail
2159
2160
template<class R = detail::deduced, class F> constexpr auto visit( F&& f ) -> detail::Vret<R, F>
2161
{
2162
    return std::forward<F>(f)();
2163
}
2164
2165
namespace detail
2166
{
2167
2168
template<class R, class F, class V1> struct visit_L1
2169
{
2170
    F&& f;
2171
    V1&& v1;
2172
2173
    template<class I> constexpr auto operator()( I ) const -> Vret<R, F, V1>
2174
    {
2175
        return std::forward<F>(f)( unsafe_get<I::value>( std::forward<V1>(v1) ) );
2176
    }
2177
};
2178
2179
} // namespace detail
2180
2181
template<class R = detail::deduced, class F, class V1> constexpr auto visit( F&& f, V1&& v1 ) -> detail::Vret<R, F, V1>
2182
{
2183
    return mp11::mp_with_index<detail::variant_base_size<V1>>( v1.index(), detail::visit_L1<R, F, V1>{ std::forward<F>(f), std::forward<V1>(v1) } );
2184
}
2185
2186
#if defined(BOOST_NO_CXX14_GENERIC_LAMBDAS) || BOOST_WORKAROUND( BOOST_MSVC, < 1920 )
2187
2188
namespace detail
2189
{
2190
2191
template<class F, class A> struct bind_front_
2192
{
2193
    F&& f;
2194
    A&& a;
2195
2196
    template<class... T> auto operator()( T&&... t ) -> decltype( std::forward<F>(f)( std::forward<A>(a), std::forward<T>(t)... ) )
2197
    {
2198
        return std::forward<F>(f)( std::forward<A>(a), std::forward<T>(t)... );
2199
    }
2200
};
2201
2202
template<class F, class A> bind_front_<F, A> bind_front( F&& f, A&& a )
2203
{
2204
    return bind_front_<F, A>{ std::forward<F>(f), std::forward<A>(a) };
2205
}
2206
2207
template<class R, class F, class V1, class V2> struct visit_L2
2208
{
2209
    F&& f;
2210
2211
    V1&& v1;
2212
    V2&& v2;
2213
2214
    template<class I> auto operator()( I ) const -> Vret<R, F, V1, V2>
2215
    {
2216
        auto f2 = bind_front( std::forward<F>(f), unsafe_get<I::value>( std::forward<V1>(v1) ) );
2217
        return visit<R>( f2, std::forward<V2>(v2) );
2218
    }
2219
};
2220
2221
} // namespace detail
2222
2223
template<class R = detail::deduced, class F, class V1, class V2> constexpr auto visit( F&& f, V1&& v1, V2&& v2 ) -> detail::Vret<R, F, V1, V2>
2224
{
2225
    return mp11::mp_with_index<detail::variant_base_size<V1>>( v1.index(), detail::visit_L2<R, F, V1, V2>{ std::forward<F>(f), std::forward<V1>(v1), std::forward<V2>(v2) } );
2226
}
2227
2228
namespace detail
2229
{
2230
2231
template<class R, class F, class V1, class V2, class V3> struct visit_L3
2232
{
2233
    F&& f;
2234
2235
    V1&& v1;
2236
    V2&& v2;
2237
    V3&& v3;
2238
2239
    template<class I> auto operator()( I ) const -> Vret<R, F, V1, V2, V3>
2240
    {
2241
        auto f2 = bind_front( std::forward<F>(f), unsafe_get<I::value>( std::forward<V1>(v1) ) );
2242
        return visit<R>( f2, std::forward<V2>(v2), std::forward<V3>(v3) );
2243
    }
2244
};
2245
2246
} // namespace detail
2247
2248
template<class R = detail::deduced, class F, class V1, class V2, class V3> constexpr auto visit( F&& f, V1&& v1, V2&& v2, V3&& v3 ) -> detail::Vret<R, F, V1, V2, V3>
2249
{
2250
    return mp11::mp_with_index<detail::variant_base_size<V1>>( v1.index(), detail::visit_L3<R, F, V1, V2, V3>{ std::forward<F>(f), std::forward<V1>(v1), std::forward<V2>(v2), std::forward<V3>(v3) } );
2251
}
2252
2253
namespace detail
2254
{
2255
2256
template<class R, class F, class V1, class V2, class V3, class V4> struct visit_L4
2257
{
2258
    F&& f;
2259
2260
    V1&& v1;
2261
    V2&& v2;
2262
    V3&& v3;
2263
    V4&& v4;
2264
2265
    template<class I> auto operator()( I ) const -> Vret<R, F, V1, V2, V3, V4>
2266
    {
2267
        auto f2 = bind_front( std::forward<F>(f), unsafe_get<I::value>( std::forward<V1>(v1) ) );
2268
        return visit<R>( f2, std::forward<V2>(v2), std::forward<V3>(v3), std::forward<V4>(v4) );
2269
    }
2270
};
2271
2272
} // namespace detail
2273
2274
template<class R = detail::deduced, class F, class V1, class V2, class V3, class V4> constexpr auto visit( F&& f, V1&& v1, V2&& v2, V3&& v3, V4&& v4 ) -> detail::Vret<R, F, V1, V2, V3, V4>
2275
{
2276
    return mp11::mp_with_index<detail::variant_base_size<V1>>( v1.index(), detail::visit_L4<R, F, V1, V2, V3, V4>{ std::forward<F>(f), std::forward<V1>(v1), std::forward<V2>(v2), std::forward<V3>(v3), std::forward<V4>(v4) } );
2277
}
2278
2279
#else
2280
2281
template<class R = detail::deduced, class F, class V1, class V2, class... V> constexpr auto visit( F&& f, V1&& v1, V2&& v2, V&&... v ) -> detail::Vret<R, F, V1, V2, V...>
2282
{
2283
    return mp11::mp_with_index<detail::variant_base_size<V1>>( v1.index(), [&]( auto I ){
2284
2285
        auto f2 = [&]( auto&&... a ){ return std::forward<F>(f)( unsafe_get<I.value>( std::forward<V1>(v1) ), std::forward<decltype(a)>(a)... ); };
2286
        return visit<R>( f2, std::forward<V2>(v2), std::forward<V>(v)... );
2287
2288
    });
2289
}
2290
2291
#endif
2292
2293
// specialized algorithms
2294
template<class... T,
2295
    class E = typename std::enable_if<mp11::mp_all<std::is_move_constructible<T>..., detail::is_swappable<T>...>::value>::type>
2296
void swap( variant<T...> & v, variant<T...> & w )
2297
    noexcept( noexcept(v.swap(w)) )
2298
{
2299
    v.swap( w );
2300
}
2301
2302
// visit_by_index
2303
2304
namespace detail
2305
{
2306
2307
template<class R, class V, class... F> using Vret2 = mp11::mp_eval_if_not< std::is_same<R, deduced>, R, front_if_same, mp11::mp_transform<mp11::mp_invoke_q, mp11::mp_list<Qret<F>...>, apply_cv_ref<V>> >;
2308
2309
template<class R, class V, class... F> struct visit_by_index_L
2310
{
2311
    V&& v;
2312
    std::tuple<F&&...> tp;
2313
2314
    template<class I> constexpr detail::Vret2<R, V, F...> operator()( I ) const
2315
    {
2316
        return std::get<I::value>( std::move(tp) )( unsafe_get<I::value>( std::forward<V>(v) ) );
2317
    }
2318
};
2319
2320
} // namespace detail
2321
2322
template<class R = detail::deduced, class V, class... F> constexpr auto visit_by_index( V&& v, F&&... f ) -> detail::Vret2<R, V, F...>
2323
{
2324
    static_assert( variant_size<V>::value == sizeof...(F), "Incorrect number of function objects" );
2325
2326
    return mp11::mp_with_index<variant_size<V>::value>( v.index(),
2327
        detail::visit_by_index_L<R, V, F...>{ std::forward<V>(v), std::tuple<F&&...>( std::forward<F>(f)... ) } );
2328
}
2329
2330
// output streaming
2331
2332
namespace detail
2333
{
2334
2335
template<class Ch, class Tr, class... T> struct ostream_insert_L
2336
{
2337
    std::basic_ostream<Ch, Tr>& os;
2338
    variant<T...> const& v;
2339
2340
    template<class I> std::basic_ostream<Ch, Tr>& operator()( I ) const
2341
    {
2342
        return os << unsafe_get<I::value>( v );
2343
    }
2344
};
2345
2346
template<class Os, class T, class E = void> struct is_output_streamable: std::false_type
2347
{
2348
};
2349
2350
template<class Os, class T> struct is_output_streamable<Os, T, decltype( std::declval<Os&>() << std::declval<T const&>(), (void)0 )>: std::true_type
2351
{
2352
};
2353
2354
} // namespace detail
2355
2356
template<class Ch, class Tr>
2357
std::basic_ostream<Ch, Tr>& operator<<( std::basic_ostream<Ch, Tr>& os, monostate const& )
2358
{
2359
    os << "monostate";
2360
    return os;
2361
}
2362
2363
template<class Ch, class Tr, class T1, class... T,
2364
    class E = typename std::enable_if< mp11::mp_all< detail::is_output_streamable<std::basic_ostream<Ch, Tr>, T>... >::value >::type >
2365
std::basic_ostream<Ch, Tr>& operator<<( std::basic_ostream<Ch, Tr>& os, variant<T1, T...> const& v )
2366
{
2367
    return mp11::mp_with_index<1 + sizeof...(T)>( v.index(),
2368
        detail::ostream_insert_L<Ch, Tr, T1, T...>{ os, v } );
2369
}
2370
2371
// hashing support
2372
2373
namespace detail
2374
{
2375
2376
inline std::size_t hash_value_impl_( mp11::mp_true, std::size_t index, std::size_t value )
2377
{
2378
    unsigned long long hv = 0xCBF29CE484222325ull;
2379
    unsigned long long const prime = 0x100000001B3ull;
2380
2381
    hv ^= index;
2382
    hv *= prime;
2383
2384
    hv ^= value;
2385
    hv *= prime;
2386
2387
    return static_cast<std::size_t>( hv );
2388
}
2389
2390
inline std::size_t hash_value_impl_( mp11::mp_false, std::size_t index, std::size_t value )
2391
{
2392
    std::size_t hv = 0x811C9DC5;
2393
    std::size_t const prime = 0x01000193;
2394
2395
    hv ^= index;
2396
    hv *= prime;
2397
2398
    hv ^= value;
2399
    hv *= prime;
2400
2401
    return hv;
2402
}
2403
2404
inline std::size_t hash_value_impl( std::size_t index, std::size_t value )
2405
{
2406
    return hash_value_impl_( mp11::mp_bool< (SIZE_MAX > UINT32_MAX) >(), index, value );
2407
}
2408
2409
template<template<class> class H, class V> struct hash_value_L
2410
{
2411
    V const & v;
2412
2413
    template<class I> std::size_t operator()( I ) const
2414
    {
2415
        auto const & t = unsafe_get<I::value>( v );
2416
2417
        std::size_t index = I::value;
2418
        std::size_t value = H<remove_cv_ref_t<decltype(t)>>()( t );
2419
2420
        return hash_value_impl( index, value );
2421
    }
2422
};
2423
2424
template<class... T> std::size_t hash_value_std( variant<T...> const & v )
2425
{
2426
    return mp11::mp_with_index<sizeof...(T)>( v.index(), detail::hash_value_L< std::hash, variant<T...> >{ v } );
2427
}
2428
2429
} // namespace detail
2430
2431
inline std::size_t hash_value( monostate const & )
2432
{
2433
    return 0xA7EE4757u;
2434
}
2435
2436
template<class... T> std::size_t hash_value( variant<T...> const & v )
2437
{
2438
    return mp11::mp_with_index<sizeof...(T)>( v.index(), detail::hash_value_L< boost::hash, variant<T...> >{ v } );
2439
}
2440
2441
namespace detail
2442
{
2443
2444
template<class T> using is_hash_enabled = std::is_default_constructible< std::hash<typename std::remove_const<T>::type> >;
2445
2446
template<class V, bool E = mp11::mp_all_of<V, is_hash_enabled>::value> struct std_hash_impl;
2447
2448
template<class V> struct std_hash_impl<V, false>
2449
{
2450
    std_hash_impl() = delete;
2451
    std_hash_impl( std_hash_impl const& ) = delete;
2452
    std_hash_impl& operator=( std_hash_impl const& ) = delete;
2453
};
2454
2455
template<class V> struct std_hash_impl<V, true>
2456
{
2457
    std::size_t operator()( V const & v ) const
2458
    {
2459
        return detail::hash_value_std( v );
2460
    }
2461
};
2462
2463
} // namespace detail
2464
2465
} // namespace variant2
2466
} // namespace boost
2467
2468
namespace std
2469
{
2470
2471
template<class... T> struct hash< ::boost::variant2::variant<T...> >: public ::boost::variant2::detail::std_hash_impl< ::boost::variant2::variant<T...> >
2472
{
2473
};
2474
2475
template<> struct hash< ::boost::variant2::monostate >
2476
{
2477
    std::size_t operator()( ::boost::variant2::monostate const & v ) const
2478
    {
2479
        return hash_value( v );
2480
    }
2481
};
2482
2483
} // namespace std
2484
2485
// JSON support
2486
2487
namespace boost
2488
{
2489
namespace json
2490
{
2491
2492
class value;
2493
2494
struct value_from_tag;
2495
2496
template<class T>
2497
void value_from( T&& t, value& jv );
2498
2499
template<class T>
2500
struct try_value_to_tag;
2501
2502
template<class T1, class T2>
2503
struct result_for;
2504
2505
template<class T>
2506
typename result_for<T, value>::type
2507
try_value_to( value const & jv );
2508
2509
template<class T>
2510
typename result_for<T, value>::type
2511
result_from_errno( int e, boost::source_location const* loc ) noexcept;
2512
2513
template<class T> struct is_null_like;
2514
2515
template<> struct is_null_like<variant2::monostate>: std::true_type {};
2516
2517
} // namespace json
2518
2519
namespace variant2
2520
{
2521
2522
namespace detail
2523
{
2524
2525
struct tag_invoke_L1
2526
{
2527
    boost::json::value& v;
2528
2529
#if defined(BOOST_MSVC) && BOOST_MSVC / 10 == 191
2530
    // msvc-14.1 with /permissive- needs this
2531
    explicit tag_invoke_L1( boost::json::value& v_ ): v( v_ ) {}
2532
#endif
2533
2534
    template<class T> void operator()( T const& t ) const
2535
    {
2536
        boost::json::value_from( t, v );
2537
    }
2538
};
2539
2540
} // namespace detail
2541
2542
template<class... T>
2543
    void tag_invoke( boost::json::value_from_tag const&, boost::json::value& v, variant<T...> const & w )
2544
{
2545
    visit( detail::tag_invoke_L1{ v }, w );
2546
}
2547
2548
namespace detail
2549
{
2550
2551
template<class V> struct tag_invoke_L2
2552
{
2553
    boost::json::value const& v;
2554
    typename boost::json::result_for<V, boost::json::value>::type& r;
2555
2556
    template<class I> void operator()( I /*i*/ ) const
2557
    {
2558
        if( !r )
2559
        {
2560
            using Ti = mp11::mp_at_c<V, I::value>;
2561
            auto r2 = boost::json::try_value_to<Ti>( v );
2562
2563
            if( r2 )
2564
            {
2565
                r.emplace( in_place_index_t<I::value>{}, std::move( *r2 ) );
2566
            }
2567
        }
2568
    }
2569
};
2570
2571
} // namespace detail
2572
2573
template<class... T>
2574
    typename boost::json::result_for<variant<T...>, boost::json::value>::type
2575
    tag_invoke( boost::json::try_value_to_tag<variant<T...>> const&, boost::json::value const& v )
2576
{
2577
    static constexpr boost::source_location loc = BOOST_CURRENT_LOCATION;
2578
    auto r = boost::json::result_from_errno< variant<T...> >( EINVAL, &loc );
2579
2580
    mp11::mp_for_each<mp11::mp_iota_c<sizeof...(T)>>( detail::tag_invoke_L2< variant<T...> >{ v, r } );
2581
2582
    return r;
2583
}
2584
2585
} // namespace variant2
2586
} // namespace boost
2587
2588
#undef BOOST_VARIANT2_CX14_ASSERT
2589
2590
#if defined(_MSC_VER) && _MSC_VER < 1910
2591
# pragma warning( pop )
2592
#endif
2593
2594
#endif // #ifndef BOOST_VARIANT2_VARIANT_HPP_INCLUDED