Cppgres
Build Postgres extensions in C++
Loading...
Searching...
No Matches
pfr.hpp
1#pragma once
2// Copyright (c) 2016-2023 Antony Polukhin
3//
4// Distributed under the Boost Software License, Version 1.0. (See accompanying
5// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
7#ifndef BOOST_PFR_HPP
8#define BOOST_PFR_HPP
9
12
13// Copyright (c) 2016-2023 Antony Polukhin
14// Copyright (c) 2022 Denis Mikhailov
15//
16// Distributed under the Boost Software License, Version 1.0. (See accompanying
17// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
18
19#ifndef BOOST_PFR_CONFIG_HPP
20#define BOOST_PFR_CONFIG_HPP
21
22#if __cplusplus >= 201402L || (defined(_MSC_VER) && defined(_MSVC_LANG) && _MSC_VER > 1900)
23#include <type_traits> // to get non standard platform macro definitions (__GLIBCXX__ for example)
24#endif
25
30
31// Reminder:
32// * MSVC++ 14.2 _MSC_VER == 1927 <- Loophole is known to work (Visual Studio ????)
33// * MSVC++ 14.1 _MSC_VER == 1916 <- Loophole is known to NOT work (Visual Studio 2017)
34// * MSVC++ 14.0 _MSC_VER == 1900 (Visual Studio 2015)
35// * MSVC++ 12.0 _MSC_VER == 1800 (Visual Studio 2013)
36
37#ifdef BOOST_PFR_NOT_SUPPORTED
38# error Please, do not set BOOST_PFR_NOT_SUPPORTED value manually, use '-DBOOST_PFR_ENABLED=0' instead of it
39#endif
40
41#if defined(_MSC_VER)
42# if !defined(_MSVC_LANG) || _MSC_VER <= 1900
43# define BOOST_PFR_NOT_SUPPORTED 1
44# endif
45#elif __cplusplus < 201402L
46# define BOOST_PFR_NOT_SUPPORTED 1
47#endif
48
49#ifndef BOOST_PFR_USE_LOOPHOLE
50# if defined(_MSC_VER)
51# if _MSC_VER >= 1927
52# define BOOST_PFR_USE_LOOPHOLE 1
53# else
54# define BOOST_PFR_USE_LOOPHOLE 0
55# endif
56# elif defined(__clang_major__) && __clang_major__ >= 8
57# define BOOST_PFR_USE_LOOPHOLE 0
58# else
59# define BOOST_PFR_USE_LOOPHOLE 1
60# endif
61#endif
62
63#ifndef BOOST_PFR_USE_CPP17
64# ifdef __cpp_structured_bindings
65# define BOOST_PFR_USE_CPP17 1
66# elif defined(_MSVC_LANG)
67# if _MSVC_LANG >= 201703L
68# define BOOST_PFR_USE_CPP17 1
69# else
70# define BOOST_PFR_USE_CPP17 0
71# endif
72# else
73# define BOOST_PFR_USE_CPP17 0
74# endif
75#endif
76
77#if (!BOOST_PFR_USE_CPP17 && !BOOST_PFR_USE_LOOPHOLE)
78# if (defined(_MSC_VER) && _MSC_VER < 1916)
79# define BOOST_PFR_NOT_SUPPORTED 1
80# endif
81#endif
82
83#ifndef BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE
84// Assume that libstdc++ since GCC-7.3 does not have linear instantiation depth in std::make_integral_sequence
85# if defined( __GLIBCXX__) && __GLIBCXX__ >= 20180101
86# define BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE 1
87# elif defined(_MSC_VER)
88# define BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE 1
89//# elif other known working lib
90# else
91# define BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE 0
92# endif
93#endif
94
95#ifndef BOOST_PFR_HAS_GUARANTEED_COPY_ELISION
96# if defined(__cpp_guaranteed_copy_elision) && (!defined(_MSC_VER) || _MSC_VER > 1928)
97# define BOOST_PFR_HAS_GUARANTEED_COPY_ELISION 1
98# else
99# define BOOST_PFR_HAS_GUARANTEED_COPY_ELISION 0
100# endif
101#endif
102
103#ifndef BOOST_PFR_ENABLE_IMPLICIT_REFLECTION
104# if defined(__cpp_lib_is_aggregate)
105# define BOOST_PFR_ENABLE_IMPLICIT_REFLECTION 1
106# else
107// There is no way to detect potential ability to be reflectable without std::is_aggregare
108# define BOOST_PFR_ENABLE_IMPLICIT_REFLECTION 0
109# endif
110#endif
111
112#ifndef BOOST_PFR_CORE_NAME_ENABLED
113# if (__cplusplus >= 202002L) || (defined(_MSVC_LANG) && (_MSVC_LANG >= 202002L))
114# if (defined(__cpp_nontype_template_args) && __cpp_nontype_template_args >= 201911) \
115 || (defined(__clang_major__) && __clang_major__ >= 12)
116# define BOOST_PFR_CORE_NAME_ENABLED 1
117# else
118# define BOOST_PFR_CORE_NAME_ENABLED 0
119# endif
120# else
121# define BOOST_PFR_CORE_NAME_ENABLED 0
122# endif
123#endif
124
125
126#ifndef BOOST_PFR_CORE_NAME_PARSING
127# if defined(_MSC_VER)
128# define BOOST_PFR_CORE_NAME_PARSING (sizeof("auto __cdecl boost::pfr::detail::name_of_field_impl<") - 1, sizeof(">(void) noexcept") - 1, backward("->"))
129# elif defined(__clang__)
130# define BOOST_PFR_CORE_NAME_PARSING (sizeof("auto boost::pfr::detail::name_of_field_impl() [MsvcWorkaround = ") - 1, sizeof("}]") - 1, backward("."))
131# elif defined(__GNUC__)
132# define BOOST_PFR_CORE_NAME_PARSING (sizeof("consteval auto boost::pfr::detail::name_of_field_impl() [with MsvcWorkaround = ") - 1, sizeof(")]") - 1, backward("::"))
133# else
134// Default parser for other platforms... Just skip nothing!
135# define BOOST_PFR_CORE_NAME_PARSING (0, 0, "")
136# endif
137#endif
138
139#if defined(__has_cpp_attribute)
140# if __has_cpp_attribute(maybe_unused)
141# define BOOST_PFR_MAYBE_UNUSED [[maybe_unused]]
142# endif
143#endif
144
145#ifndef BOOST_PFR_MAYBE_UNUSED
146# define BOOST_PFR_MAYBE_UNUSED
147#endif
148
149#ifndef BOOST_PFR_ENABLED
150# ifdef BOOST_PFR_NOT_SUPPORTED
151# define BOOST_PFR_ENABLED 0
152# else
153# define BOOST_PFR_ENABLED 1
154# endif
155#endif
156
157#undef BOOST_PFR_NOT_SUPPORTED
158
159#endif // BOOST_PFR_CONFIG_HPP
160// Copyright (c) 2016-2023 Antony Polukhin
161//
162// Distributed under the Boost Software License, Version 1.0. (See accompanying
163// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
164
165#ifndef BOOST_PFR_CORE_HPP
166#define BOOST_PFR_CORE_HPP
167
168// Copyright (c) 2016-2023 Antony Polukhin
169// Copyright (c) 2022 Denis Mikhailov
170//
171// Distributed under the Boost Software License, Version 1.0. (See accompanying
172// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
173
174#ifndef BOOST_PFR_DETAIL_CONFIG_HPP
175#define BOOST_PFR_DETAIL_CONFIG_HPP
176
177
178#if !BOOST_PFR_ENABLED
179
180#error Boost.PFR library is not supported in your environment. \
181 Try one of the possible solutions: \
182 1. try to take away an '-DBOOST_PFR_ENABLED=0', if it exists \
183 2. enable C++14; \
184 3. enable C++17; \
185 4. update your compiler; \
186 or disable this error by '-DBOOST_PFR_ENABLED=1' if you really know what are you doing.
187
188#endif // !BOOST_PFR_ENABLED
189
190#endif // BOOST_PFR_DETAIL_CONFIG_HPP
191
192
193// Copyright (c) 2016-2023 Antony Polukhin
194//
195// Distributed under the Boost Software License, Version 1.0. (See accompanying
196// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
197
198#ifndef BOOST_PFR_DETAIL_CORE_HPP
199#define BOOST_PFR_DETAIL_CORE_HPP
200
201
202// Each core provides `boost::pfr::detail::tie_as_tuple` and
203// `boost::pfr::detail::for_each_field_dispatcher` functions.
204//
205// The whole PFR library is build on top of those two functions.
206#if BOOST_PFR_USE_CPP17
207// Copyright (c) 2016-2023 Antony Polukhin
208//
209// Distributed under the Boost Software License, Version 1.0. (See accompanying
210// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
211
212
213#ifndef BOOST_PFR_DETAIL_CORE17_HPP
214#define BOOST_PFR_DETAIL_CORE17_HPP
215
216// Copyright (c) 2016-2023 Antony Polukhin
217// Copyright (c) 2023 Denis Mikhailov
218//
219// Distributed under the Boost Software License, Version 1.0. (See accompanying
220// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
221
222
227
228#ifndef BOOST_PFR_DETAIL_CORE17_GENERATED_HPP
229#define BOOST_PFR_DETAIL_CORE17_GENERATED_HPP
230
231#if !BOOST_PFR_USE_CPP17
232# error C++17 is required for this header.
233#endif
234
235// Copyright (c) 2016-2023 Antony Polukhin
236//
237// Distributed under the Boost Software License, Version 1.0. (See accompanying
238// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
239
240#ifndef BOOST_PFR_DETAIL_SEQUENCE_TUPLE_HPP
241#define BOOST_PFR_DETAIL_SEQUENCE_TUPLE_HPP
242
243// Copyright (c) 2018 Sergei Fedorov
244// Copyright (c) 2019-2023 Antony Polukhin
245//
246// Distributed under the Boost Software License, Version 1.0. (See accompanying
247// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
248
249#ifndef BOOST_PFR_DETAIL_MAKE_INTEGER_SEQUENCE_HPP
250#define BOOST_PFR_DETAIL_MAKE_INTEGER_SEQUENCE_HPP
251
252
253#include <type_traits>
254#include <utility>
255#include <cstddef>
256
257namespace boost { namespace pfr { namespace detail {
258
259#if BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE == 0
260
261#ifdef __has_builtin
262# if __has_builtin(__make_integer_seq)
263# define BOOST_PFR_USE_MAKE_INTEGER_SEQ_BUILTIN
264# endif
265#endif
266
267#ifdef BOOST_PFR_USE_MAKE_INTEGER_SEQ_BUILTIN
268
269using std::integer_sequence;
270
271// Clang unable to use namespace qualified std::integer_sequence in __make_integer_seq.
272template <typename T, T N>
273using make_integer_sequence = __make_integer_seq<integer_sequence, T, N>;
274
275#undef BOOST_PFR_USE_MAKE_INTEGER_SEQ_BUILTIN
276
277#else
278
279template <typename T, typename U>
280struct join_sequences;
281
282template <typename T, T... A, T... B>
283struct join_sequences<std::integer_sequence<T, A...>, std::integer_sequence<T, B...>> {
284 using type = std::integer_sequence<T, A..., B...>;
285};
286
287template <typename T, T Min, T Max>
288struct build_sequence_impl {
289 static_assert(Min < Max, "Start of range must be less than its end");
290 static constexpr T size = Max - Min;
291 using type = typename join_sequences<
292 typename build_sequence_impl<T, Min, Min + size / 2>::type,
293 typename build_sequence_impl<T, Min + size / 2 + 1, Max>::type
294 >::type;
295};
296
297template <typename T, T V>
298struct build_sequence_impl<T, V, V> {
299 using type = std::integer_sequence<T, V>;
300};
301
302template <typename T, std::size_t N>
303struct make_integer_sequence_impl : build_sequence_impl<T, 0, N - 1> {};
304
305template <typename T>
306struct make_integer_sequence_impl<T, 0> {
307 using type = std::integer_sequence<T>;
308};
309
310template <typename T, T N>
311using make_integer_sequence = typename make_integer_sequence_impl<T, N>::type;
312
313#endif // !defined BOOST_PFR_USE_MAKE_INTEGER_SEQ_BUILTIN
314#else // BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE == 1
315
316template <typename T, T N>
317using make_integer_sequence = std::make_integer_sequence<T, N>;
318
319#endif // BOOST_PFR_USE_STD_MAKE_INTEGRAL_SEQUENCE == 1
320
321template <std::size_t N>
322using make_index_sequence = make_integer_sequence<std::size_t, N>;
323
324template <typename... T>
325using index_sequence_for = make_index_sequence<sizeof...(T)>;
326
327}}} // namespace boost::pfr::detail
328
329#endif
330
331
332#include <utility> // metaprogramming stuff
333#include <cstddef> // std::size_t
334
336namespace boost { namespace pfr { namespace detail { namespace sequence_tuple {
337
338template <std::size_t N, class T>
339struct base_from_member {
340 T value;
341};
342
343template <class I, class ...Tail>
344struct tuple_base;
345
346
347
348template <std::size_t... I, class ...Tail>
349struct tuple_base< std::index_sequence<I...>, Tail... >
350 : base_from_member<I , Tail>...
351{
352 static constexpr std::size_t size_v = sizeof...(I);
353
354 // We do not use `noexcept` in the following functions, because if user forget to put one then clang will issue an error:
355 // "error: exception specification of explicitly defaulted default constructor does not match the calculated one".
356 constexpr tuple_base() = default;
357 constexpr tuple_base(tuple_base&&) = default;
358 constexpr tuple_base(const tuple_base&) = default;
359
360 constexpr tuple_base(Tail... v) noexcept
361 : base_from_member<I, Tail>{ v }...
362 {}
363};
364
365template <>
366struct tuple_base<std::index_sequence<> > {
367 static constexpr std::size_t size_v = 0;
368};
369
370template <std::size_t N, class T>
371constexpr T& get_impl(base_from_member<N, T>& t) noexcept {
372 // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
373 return t.value;
374}
375
376template <std::size_t N, class T>
377constexpr const T& get_impl(const base_from_member<N, T>& t) noexcept {
378 // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
379 return t.value;
380}
381
382template <std::size_t N, class T>
383constexpr volatile T& get_impl(volatile base_from_member<N, T>& t) noexcept {
384 // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
385 return t.value;
386}
387
388template <std::size_t N, class T>
389constexpr const volatile T& get_impl(const volatile base_from_member<N, T>& t) noexcept {
390 // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
391 return t.value;
392}
393
394template <std::size_t N, class T>
395constexpr T&& get_impl(base_from_member<N, T>&& t) noexcept {
396 // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
397 return std::forward<T>(t.value);
398}
399
400
401template <class T, std::size_t N>
402constexpr T& get_by_type_impl(base_from_member<N, T>& t) noexcept {
403 // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
404 return t.value;
405}
406
407template <class T, std::size_t N>
408constexpr const T& get_by_type_impl(const base_from_member<N, T>& t) noexcept {
409 // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
410 return t.value;
411}
412
413template <class T, std::size_t N>
414constexpr volatile T& get_by_type_impl(volatile base_from_member<N, T>& t) noexcept {
415 // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
416 return t.value;
417}
418
419template <class T, std::size_t N>
420constexpr const volatile T& get_by_type_impl(const volatile base_from_member<N, T>& t) noexcept {
421 // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
422 return t.value;
423}
424
425template <class T, std::size_t N>
426constexpr T&& get_by_type_impl(base_from_member<N, T>&& t) noexcept {
427 // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
428 return std::forward<T>(t.value);
429}
430
431template <class T, std::size_t N>
432constexpr const T&& get_by_type_impl(const base_from_member<N, T>&& t) noexcept {
433 // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
434 return std::forward<T>(t.value);
435}
436
437
438
439
440template <class ...Values>
441struct tuple: tuple_base<
442 detail::index_sequence_for<Values...>,
443 Values...>
444{
445 using tuple_base<
446 detail::index_sequence_for<Values...>,
447 Values...
448 >::tuple_base;
449
450 constexpr static std::size_t size() noexcept { return sizeof...(Values); }
451 constexpr static bool empty() noexcept { return size() == 0; }
452};
453
454
455template <std::size_t N, class ...T>
456constexpr decltype(auto) get(tuple<T...>& t) noexcept {
457 static_assert(N < tuple<T...>::size_v, "====================> Boost.PFR: Tuple index out of bounds");
458 return sequence_tuple::get_impl<N>(t);
459}
460
461template <std::size_t N, class ...T>
462constexpr decltype(auto) get(const tuple<T...>& t) noexcept {
463 static_assert(N < tuple<T...>::size_v, "====================> Boost.PFR: Tuple index out of bounds");
464 return sequence_tuple::get_impl<N>(t);
465}
466
467template <std::size_t N, class ...T>
468constexpr decltype(auto) get(const volatile tuple<T...>& t) noexcept {
469 static_assert(N < tuple<T...>::size_v, "====================> Boost.PFR: Tuple index out of bounds");
470 return sequence_tuple::get_impl<N>(t);
471}
472
473template <std::size_t N, class ...T>
474constexpr decltype(auto) get(volatile tuple<T...>& t) noexcept {
475 static_assert(N < tuple<T...>::size_v, "====================> Boost.PFR: Tuple index out of bounds");
476 return sequence_tuple::get_impl<N>(t);
477}
478
479template <std::size_t N, class ...T>
480constexpr decltype(auto) get(tuple<T...>&& t) noexcept {
481 static_assert(N < tuple<T...>::size_v, "====================> Boost.PFR: Tuple index out of bounds");
482 return sequence_tuple::get_impl<N>(std::move(t));
483}
484
485template <std::size_t I, class T>
486using tuple_element = std::remove_reference< decltype(
487 ::boost::pfr::detail::sequence_tuple::get<I>( std::declval<T>() )
488 ) >;
489
490template <class... Args>
491constexpr auto make_sequence_tuple(Args... args) noexcept {
492 return ::boost::pfr::detail::sequence_tuple::tuple<Args...>{ args... };
493}
494
495}}}} // namespace boost::pfr::detail::sequence_tuple
496
497#endif // BOOST_PFR_CORE_HPP
498// Copyright (c) 2016-2023 Antony Polukhin
499//
500// Distributed under the Boost Software License, Version 1.0. (See accompanying
501// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
502
503#ifndef BOOST_PFR_DETAIL_SIZE_T_HPP
504#define BOOST_PFR_DETAIL_SIZE_T_HPP
505
506namespace boost { namespace pfr { namespace detail {
507
509template <std::size_t Index>
510using size_t_ = std::integral_constant<std::size_t, Index >;
511
512}}} // namespace boost::pfr::detail
513
514#endif // BOOST_PFR_DETAIL_SIZE_T_HPP
515#include <type_traits> // for std::conditional_t, std::is_reference
516
517namespace boost { namespace pfr { namespace detail {
518
519template <class... Args>
520constexpr auto make_tuple_of_references(Args&&... args) noexcept {
521 return sequence_tuple::tuple<Args&...>{ args... };
522}
523
524template<typename T, typename Arg>
525constexpr decltype(auto) add_cv_like(Arg& arg) noexcept {
526 if constexpr (std::is_const<T>::value && std::is_volatile<T>::value) {
527 return const_cast<const volatile Arg&>(arg);
528 }
529 else if constexpr (std::is_const<T>::value) {
530 return const_cast<const Arg&>(arg);
531 }
532 else if constexpr (std::is_volatile<T>::value) {
533 return const_cast<volatile Arg&>(arg);
534 }
535 else {
536 return const_cast<Arg&>(arg);
537 }
538}
539
540// https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78939
541template<typename T, typename Sb, typename Arg>
542constexpr decltype(auto) workaround_cast(Arg& arg) noexcept {
543 using output_arg_t = std::conditional_t<!std::is_reference<Sb>(), decltype(detail::add_cv_like<T>(arg)), Sb>;
544 return const_cast<output_arg_t>(arg);
545}
546
547template <class T>
548constexpr auto tie_as_tuple(T& /*val*/, size_t_<0>) noexcept {
549 return sequence_tuple::tuple<>{};
550}
551
552template <class T>
553constexpr auto tie_as_tuple(T& val, size_t_<1>, std::enable_if_t<std::is_class< std::remove_cv_t<T> >::value>* = nullptr) noexcept {
554 auto& [a] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
555 return ::boost::pfr::detail::make_tuple_of_references(detail::workaround_cast<T, decltype(a)>(a));
556}
557
558
559template <class T>
560constexpr auto tie_as_tuple(T& val, size_t_<1>, std::enable_if_t<!std::is_class< std::remove_cv_t<T> >::value>* = nullptr) noexcept {
561 return ::boost::pfr::detail::make_tuple_of_references( val );
562}
563
564
565template <class T>
566constexpr auto tie_as_tuple(T& val, size_t_<2>) noexcept {
567 auto& [a,b] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
568 return ::boost::pfr::detail::make_tuple_of_references(detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b));
569}
570
571template <class T>
572constexpr auto tie_as_tuple(T& val, size_t_<3>) noexcept {
573 auto& [a,b,c] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
574
575 return ::boost::pfr::detail::make_tuple_of_references(
576 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c)
577 );
578}
579
580template <class T>
581constexpr auto tie_as_tuple(T& val, size_t_<4>) noexcept {
582 auto& [a,b,c,d] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
583
584 return ::boost::pfr::detail::make_tuple_of_references(
585 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
586 detail::workaround_cast<T, decltype(d)>(d)
587 );
588}
589
590template <class T>
591constexpr auto tie_as_tuple(T& val, size_t_<5>) noexcept {
592 auto& [a,b,c,d,e] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
593
594 return ::boost::pfr::detail::make_tuple_of_references(
595 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
596 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e)
597 );
598}
599
600template <class T>
601constexpr auto tie_as_tuple(T& val, size_t_<6>) noexcept {
602 auto& [a,b,c,d,e,f] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
603
604 return ::boost::pfr::detail::make_tuple_of_references(
605 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
606 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f)
607 );
608}
609
610template <class T>
611constexpr auto tie_as_tuple(T& val, size_t_<7>) noexcept {
612 auto& [a,b,c,d,e,f,g] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
613
614 return ::boost::pfr::detail::make_tuple_of_references(
615 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
616 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
617 detail::workaround_cast<T, decltype(g)>(g)
618 );
619}
620
621template <class T>
622constexpr auto tie_as_tuple(T& val, size_t_<8>) noexcept {
623 auto& [a,b,c,d,e,f,g,h] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
624
625 return ::boost::pfr::detail::make_tuple_of_references(
626 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
627 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
628 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h)
629 );
630}
631
632template <class T>
633constexpr auto tie_as_tuple(T& val, size_t_<9>) noexcept {
634 auto& [a,b,c,d,e,f,g,h,j] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
635
636 return ::boost::pfr::detail::make_tuple_of_references(
637 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
638 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
639 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j)
640 );
641}
642
643template <class T>
644constexpr auto tie_as_tuple(T& val, size_t_<10>) noexcept {
645 auto& [a,b,c,d,e,f,g,h,j,k] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
646
647 return ::boost::pfr::detail::make_tuple_of_references(
648 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
649 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
650 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
651 detail::workaround_cast<T, decltype(k)>(k)
652 );
653}
654
655template <class T>
656constexpr auto tie_as_tuple(T& val, size_t_<11>) noexcept {
657 auto& [a,b,c,d,e,f,g,h,j,k,l] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
658
659 return ::boost::pfr::detail::make_tuple_of_references(
660 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
661 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
662 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
663 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l)
664 );
665}
666
667template <class T>
668constexpr auto tie_as_tuple(T& val, size_t_<12>) noexcept {
669 auto& [a,b,c,d,e,f,g,h,j,k,l,m] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
670
671 return ::boost::pfr::detail::make_tuple_of_references(
672 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
673 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
674 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
675 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m)
676 );
677}
678
679template <class T>
680constexpr auto tie_as_tuple(T& val, size_t_<13>) noexcept {
681 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
682
683 return ::boost::pfr::detail::make_tuple_of_references(
684 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
685 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
686 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
687 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
688 detail::workaround_cast<T, decltype(n)>(n)
689 );
690}
691
692template <class T>
693constexpr auto tie_as_tuple(T& val, size_t_<14>) noexcept {
694 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
695
696 return ::boost::pfr::detail::make_tuple_of_references(
697 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
698 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
699 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
700 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
701 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p)
702 );
703}
704
705template <class T>
706constexpr auto tie_as_tuple(T& val, size_t_<15>) noexcept {
707 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
708
709 return ::boost::pfr::detail::make_tuple_of_references(
710 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
711 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
712 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
713 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
714 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q)
715 );
716}
717
718template <class T>
719constexpr auto tie_as_tuple(T& val, size_t_<16>) noexcept {
720 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
721
722 return ::boost::pfr::detail::make_tuple_of_references(
723 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
724 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
725 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
726 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
727 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
728 detail::workaround_cast<T, decltype(r)>(r)
729 );
730}
731
732template <class T>
733constexpr auto tie_as_tuple(T& val, size_t_<17>) noexcept {
734 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
735
736 return ::boost::pfr::detail::make_tuple_of_references(
737 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
738 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
739 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
740 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
741 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
742 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s)
743 );
744}
745
746template <class T>
747constexpr auto tie_as_tuple(T& val, size_t_<18>) noexcept {
748 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
749
750 return ::boost::pfr::detail::make_tuple_of_references(
751 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
752 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
753 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
754 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
755 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
756 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t)
757 );
758}
759
760template <class T>
761constexpr auto tie_as_tuple(T& val, size_t_<19>) noexcept {
762 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
763
764 return ::boost::pfr::detail::make_tuple_of_references(
765 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
766 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
767 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
768 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
769 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
770 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
771 detail::workaround_cast<T, decltype(u)>(u)
772 );
773}
774
775template <class T>
776constexpr auto tie_as_tuple(T& val, size_t_<20>) noexcept {
777 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
778
779 return ::boost::pfr::detail::make_tuple_of_references(
780 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
781 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
782 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
783 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
784 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
785 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
786 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v)
787 );
788}
789
790template <class T>
791constexpr auto tie_as_tuple(T& val, size_t_<21>) noexcept {
792 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
793
794 return ::boost::pfr::detail::make_tuple_of_references(
795 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
796 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
797 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
798 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
799 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
800 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
801 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w)
802 );
803}
804
805template <class T>
806constexpr auto tie_as_tuple(T& val, size_t_<22>) noexcept {
807 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
808
809 return ::boost::pfr::detail::make_tuple_of_references(
810 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
811 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
812 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
813 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
814 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
815 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
816 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
817 detail::workaround_cast<T, decltype(x)>(x)
818 );
819}
820
821template <class T>
822constexpr auto tie_as_tuple(T& val, size_t_<23>) noexcept {
823 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
824
825 return ::boost::pfr::detail::make_tuple_of_references(
826 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
827 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
828 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
829 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
830 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
831 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
832 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
833 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y)
834 );
835}
836
837template <class T>
838constexpr auto tie_as_tuple(T& val, size_t_<24>) noexcept {
839 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
840
841 return ::boost::pfr::detail::make_tuple_of_references(
842 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
843 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
844 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
845 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
846 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
847 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
848 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
849 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z)
850 );
851}
852
853template <class T>
854constexpr auto tie_as_tuple(T& val, size_t_<25>) noexcept {
855 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
856
857 return ::boost::pfr::detail::make_tuple_of_references(
858 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
859 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
860 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
861 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
862 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
863 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
864 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
865 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
866 detail::workaround_cast<T, decltype(A)>(A)
867 );
868}
869
870template <class T>
871constexpr auto tie_as_tuple(T& val, size_t_<26>) noexcept {
872 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
873
874 return ::boost::pfr::detail::make_tuple_of_references(
875 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
876 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
877 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
878 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
879 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
880 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
881 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
882 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
883 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B)
884 );
885}
886
887template <class T>
888constexpr auto tie_as_tuple(T& val, size_t_<27>) noexcept {
889 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
890
891 return ::boost::pfr::detail::make_tuple_of_references(
892 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
893 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
894 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
895 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
896 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
897 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
898 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
899 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
900 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C)
901 );
902}
903
904template <class T>
905constexpr auto tie_as_tuple(T& val, size_t_<28>) noexcept {
906 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
907
908 return ::boost::pfr::detail::make_tuple_of_references(
909 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
910 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
911 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
912 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
913 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
914 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
915 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
916 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
917 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
918 detail::workaround_cast<T, decltype(D)>(D)
919 );
920}
921
922template <class T>
923constexpr auto tie_as_tuple(T& val, size_t_<29>) noexcept {
924 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
925
926 return ::boost::pfr::detail::make_tuple_of_references(
927 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
928 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
929 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
930 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
931 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
932 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
933 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
934 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
935 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
936 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E)
937 );
938}
939
940template <class T>
941constexpr auto tie_as_tuple(T& val, size_t_<30>) noexcept {
942 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
943
944 return ::boost::pfr::detail::make_tuple_of_references(
945 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
946 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
947 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
948 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
949 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
950 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
951 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
952 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
953 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
954 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F)
955 );
956}
957
958template <class T>
959constexpr auto tie_as_tuple(T& val, size_t_<31>) noexcept {
960 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
961
962 return ::boost::pfr::detail::make_tuple_of_references(
963 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
964 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
965 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
966 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
967 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
968 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
969 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
970 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
971 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
972 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
973 detail::workaround_cast<T, decltype(G)>(G)
974 );
975}
976
977template <class T>
978constexpr auto tie_as_tuple(T& val, size_t_<32>) noexcept {
979 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
980
981 return ::boost::pfr::detail::make_tuple_of_references(
982 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
983 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
984 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
985 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
986 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
987 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
988 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
989 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
990 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
991 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
992 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H)
993 );
994}
995
996template <class T>
997constexpr auto tie_as_tuple(T& val, size_t_<33>) noexcept {
998 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
999
1000 return ::boost::pfr::detail::make_tuple_of_references(
1001 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1002 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1003 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1004 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1005 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1006 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1007 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1008 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1009 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1010 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1011 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J)
1012 );
1013}
1014
1015template <class T>
1016constexpr auto tie_as_tuple(T& val, size_t_<34>) noexcept {
1017 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1018
1019 return ::boost::pfr::detail::make_tuple_of_references(
1020 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1021 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1022 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1023 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1024 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1025 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1026 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1027 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1028 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1029 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1030 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1031 detail::workaround_cast<T, decltype(K)>(K)
1032 );
1033}
1034
1035template <class T>
1036constexpr auto tie_as_tuple(T& val, size_t_<35>) noexcept {
1037 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1038
1039 return ::boost::pfr::detail::make_tuple_of_references(
1040 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1041 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1042 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1043 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1044 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1045 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1046 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1047 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1048 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1049 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1050 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1051 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L)
1052 );
1053}
1054
1055template <class T>
1056constexpr auto tie_as_tuple(T& val, size_t_<36>) noexcept {
1057 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1058
1059 return ::boost::pfr::detail::make_tuple_of_references(
1060 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1061 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1062 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1063 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1064 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1065 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1066 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1067 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1068 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1069 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1070 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1071 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M)
1072 );
1073}
1074
1075template <class T>
1076constexpr auto tie_as_tuple(T& val, size_t_<37>) noexcept {
1077 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1078
1079 return ::boost::pfr::detail::make_tuple_of_references(
1080 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1081 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1082 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1083 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1084 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1085 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1086 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1087 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1088 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1089 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1090 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1091 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1092 detail::workaround_cast<T, decltype(N)>(N)
1093 );
1094}
1095
1096template <class T>
1097constexpr auto tie_as_tuple(T& val, size_t_<38>) noexcept {
1098 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1099
1100 return ::boost::pfr::detail::make_tuple_of_references(
1101 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1102 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1103 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1104 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1105 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1106 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1107 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1108 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1109 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1110 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1111 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1112 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1113 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P)
1114 );
1115}
1116
1117template <class T>
1118constexpr auto tie_as_tuple(T& val, size_t_<39>) noexcept {
1119 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1120
1121 return ::boost::pfr::detail::make_tuple_of_references(
1122 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1123 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1124 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1125 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1126 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1127 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1128 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1129 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1130 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1131 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1132 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1133 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1134 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q)
1135 );
1136}
1137
1138template <class T>
1139constexpr auto tie_as_tuple(T& val, size_t_<40>) noexcept {
1140 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1141
1142 return ::boost::pfr::detail::make_tuple_of_references(
1143 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1144 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1145 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1146 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1147 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1148 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1149 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1150 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1151 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1152 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1153 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1154 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1155 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1156 detail::workaround_cast<T, decltype(R)>(R)
1157 );
1158}
1159
1160template <class T>
1161constexpr auto tie_as_tuple(T& val, size_t_<41>) noexcept {
1162 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1163
1164 return ::boost::pfr::detail::make_tuple_of_references(
1165 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1166 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1167 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1168 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1169 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1170 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1171 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1172 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1173 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1174 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1175 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1176 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1177 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1178 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S)
1179 );
1180}
1181
1182template <class T>
1183constexpr auto tie_as_tuple(T& val, size_t_<42>) noexcept {
1184 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1185
1186 return ::boost::pfr::detail::make_tuple_of_references(
1187 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1188 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1189 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1190 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1191 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1192 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1193 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1194 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1195 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1196 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1197 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1198 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1199 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1200 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U)
1201 );
1202}
1203
1204template <class T>
1205constexpr auto tie_as_tuple(T& val, size_t_<43>) noexcept {
1206 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1207
1208 return ::boost::pfr::detail::make_tuple_of_references(
1209 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1210 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1211 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1212 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1213 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1214 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1215 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1216 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1217 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1218 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1219 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1220 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1221 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1222 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1223 detail::workaround_cast<T, decltype(V)>(V)
1224 );
1225}
1226
1227template <class T>
1228constexpr auto tie_as_tuple(T& val, size_t_<44>) noexcept {
1229 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1230
1231 return ::boost::pfr::detail::make_tuple_of_references(
1232 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1233 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1234 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1235 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1236 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1237 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1238 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1239 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1240 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1241 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1242 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1243 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1244 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1245 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1246 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W)
1247 );
1248}
1249
1250template <class T>
1251constexpr auto tie_as_tuple(T& val, size_t_<45>) noexcept {
1252 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1253
1254 return ::boost::pfr::detail::make_tuple_of_references(
1255 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1256 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1257 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1258 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1259 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1260 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1261 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1262 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1263 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1264 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1265 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1266 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1267 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1268 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1269 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X)
1270 );
1271}
1272
1273template <class T>
1274constexpr auto tie_as_tuple(T& val, size_t_<46>) noexcept {
1275 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1276
1277 return ::boost::pfr::detail::make_tuple_of_references(
1278 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1279 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1280 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1281 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1282 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1283 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1284 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1285 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1286 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1287 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1288 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1289 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1290 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1291 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1292 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1293 detail::workaround_cast<T, decltype(Y)>(Y)
1294 );
1295}
1296
1297template <class T>
1298constexpr auto tie_as_tuple(T& val, size_t_<47>) noexcept {
1299 auto& [a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1300
1301 return ::boost::pfr::detail::make_tuple_of_references(
1302 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1303 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1304 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1305 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1306 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1307 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1308 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1309 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1310 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1311 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1312 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1313 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1314 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1315 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1316 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1317 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z)
1318 );
1319}
1320
1321template <class T>
1322constexpr auto tie_as_tuple(T& val, size_t_<48>) noexcept {
1323 auto& [
1324 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1325 aa
1326 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1327
1328 return ::boost::pfr::detail::make_tuple_of_references(
1329 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1330 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1331 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1332 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1333 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1334 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1335 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1336 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1337 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1338 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1339 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1340 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1341 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1342 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1343 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1344 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa)
1345 );
1346}
1347
1348template <class T>
1349constexpr auto tie_as_tuple(T& val, size_t_<49>) noexcept {
1350 auto& [
1351 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1352 aa,ab
1353 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1354
1355 return ::boost::pfr::detail::make_tuple_of_references(
1356 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1357 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1358 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1359 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1360 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1361 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1362 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1363 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1364 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1365 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1366 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1367 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1368 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1369 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1370 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1371 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1372 detail::workaround_cast<T, decltype(ab)>(ab)
1373 );
1374}
1375
1376template <class T>
1377constexpr auto tie_as_tuple(T& val, size_t_<50>) noexcept {
1378 auto& [
1379 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1380 aa,ab,ac
1381 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1382
1383 return ::boost::pfr::detail::make_tuple_of_references(
1384 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1385 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1386 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1387 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1388 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1389 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1390 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1391 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1392 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1393 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1394 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1395 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1396 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1397 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1398 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1399 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1400 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac)
1401 );
1402}
1403
1404template <class T>
1405constexpr auto tie_as_tuple(T& val, size_t_<51>) noexcept {
1406 auto& [
1407 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1408 aa,ab,ac,ad
1409 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1410
1411 return ::boost::pfr::detail::make_tuple_of_references(
1412 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1413 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1414 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1415 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1416 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1417 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1418 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1419 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1420 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1421 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1422 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1423 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1424 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1425 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1426 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1427 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1428 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad)
1429 );
1430}
1431
1432template <class T>
1433constexpr auto tie_as_tuple(T& val, size_t_<52>) noexcept {
1434 auto& [
1435 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1436 aa,ab,ac,ad,ae
1437 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1438
1439 return ::boost::pfr::detail::make_tuple_of_references(
1440 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1441 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1442 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1443 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1444 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1445 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1446 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1447 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1448 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1449 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1450 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1451 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1452 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1453 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1454 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1455 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1456 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1457 detail::workaround_cast<T, decltype(ae)>(ae)
1458 );
1459}
1460
1461template <class T>
1462constexpr auto tie_as_tuple(T& val, size_t_<53>) noexcept {
1463 auto& [
1464 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1465 aa,ab,ac,ad,ae,af
1466 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1467
1468 return ::boost::pfr::detail::make_tuple_of_references(
1469 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1470 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1471 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1472 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1473 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1474 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1475 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1476 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1477 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1478 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1479 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1480 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1481 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1482 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1483 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1484 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1485 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1486 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af)
1487 );
1488}
1489
1490template <class T>
1491constexpr auto tie_as_tuple(T& val, size_t_<54>) noexcept {
1492 auto& [
1493 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1494 aa,ab,ac,ad,ae,af,ag
1495 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1496
1497 return ::boost::pfr::detail::make_tuple_of_references(
1498 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1499 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1500 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1501 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1502 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1503 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1504 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1505 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1506 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1507 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1508 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1509 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1510 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1511 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1512 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1513 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1514 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1515 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag)
1516 );
1517}
1518
1519template <class T>
1520constexpr auto tie_as_tuple(T& val, size_t_<55>) noexcept {
1521 auto& [
1522 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1523 aa,ab,ac,ad,ae,af,ag,ah
1524 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1525
1526 return ::boost::pfr::detail::make_tuple_of_references(
1527 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1528 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1529 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1530 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1531 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1532 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1533 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1534 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1535 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1536 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1537 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1538 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1539 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1540 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1541 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1542 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1543 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1544 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1545 detail::workaround_cast<T, decltype(ah)>(ah)
1546 );
1547}
1548
1549template <class T>
1550constexpr auto tie_as_tuple(T& val, size_t_<56>) noexcept {
1551 auto& [
1552 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1553 aa,ab,ac,ad,ae,af,ag,ah,aj
1554 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1555
1556 return ::boost::pfr::detail::make_tuple_of_references(
1557 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1558 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1559 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1560 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1561 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1562 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1563 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1564 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1565 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1566 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1567 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1568 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1569 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1570 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1571 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1572 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1573 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1574 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1575 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj)
1576 );
1577}
1578
1579template <class T>
1580constexpr auto tie_as_tuple(T& val, size_t_<57>) noexcept {
1581 auto& [
1582 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1583 aa,ab,ac,ad,ae,af,ag,ah,aj,ak
1584 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1585
1586 return ::boost::pfr::detail::make_tuple_of_references(
1587 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1588 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1589 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1590 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1591 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1592 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1593 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1594 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1595 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1596 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1597 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1598 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1599 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1600 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1601 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1602 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1603 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1604 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1605 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak)
1606 );
1607}
1608
1609template <class T>
1610constexpr auto tie_as_tuple(T& val, size_t_<58>) noexcept {
1611 auto& [
1612 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1613 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al
1614 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1615
1616 return ::boost::pfr::detail::make_tuple_of_references(
1617 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1618 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1619 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1620 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1621 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1622 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1623 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1624 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1625 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1626 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1627 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1628 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1629 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1630 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1631 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1632 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1633 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1634 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1635 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
1636 detail::workaround_cast<T, decltype(al)>(al)
1637 );
1638}
1639
1640template <class T>
1641constexpr auto tie_as_tuple(T& val, size_t_<59>) noexcept {
1642 auto& [
1643 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1644 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am
1645 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1646
1647 return ::boost::pfr::detail::make_tuple_of_references(
1648 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1649 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1650 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1651 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1652 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1653 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1654 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1655 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1656 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1657 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1658 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1659 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1660 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1661 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1662 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1663 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1664 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1665 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1666 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
1667 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am)
1668 );
1669}
1670
1671template <class T>
1672constexpr auto tie_as_tuple(T& val, size_t_<60>) noexcept {
1673 auto& [
1674 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1675 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an
1676 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1677
1678 return ::boost::pfr::detail::make_tuple_of_references(
1679 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1680 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1681 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1682 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1683 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1684 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1685 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1686 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1687 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1688 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1689 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1690 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1691 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1692 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1693 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1694 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1695 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1696 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1697 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
1698 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an)
1699 );
1700}
1701
1702template <class T>
1703constexpr auto tie_as_tuple(T& val, size_t_<61>) noexcept {
1704 auto& [
1705 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1706 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap
1707 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1708
1709 return ::boost::pfr::detail::make_tuple_of_references(
1710 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1711 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1712 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1713 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1714 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1715 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1716 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1717 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1718 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1719 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1720 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1721 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1722 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1723 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1724 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1725 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1726 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1727 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1728 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
1729 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
1730 detail::workaround_cast<T, decltype(ap)>(ap)
1731 );
1732}
1733
1734template <class T>
1735constexpr auto tie_as_tuple(T& val, size_t_<62>) noexcept {
1736 auto& [
1737 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1738 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq
1739 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1740
1741 return ::boost::pfr::detail::make_tuple_of_references(
1742 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1743 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1744 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1745 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1746 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1747 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1748 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1749 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1750 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1751 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1752 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1753 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1754 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1755 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1756 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1757 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1758 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1759 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1760 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
1761 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
1762 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq)
1763 );
1764}
1765
1766template <class T>
1767constexpr auto tie_as_tuple(T& val, size_t_<63>) noexcept {
1768 auto& [
1769 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1770 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar
1771 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1772
1773 return ::boost::pfr::detail::make_tuple_of_references(
1774 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1775 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1776 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1777 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1778 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1779 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1780 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1781 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1782 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1783 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1784 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1785 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1786 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1787 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1788 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1789 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1790 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1791 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1792 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
1793 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
1794 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar)
1795 );
1796}
1797
1798template <class T>
1799constexpr auto tie_as_tuple(T& val, size_t_<64>) noexcept {
1800 auto& [
1801 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1802 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as
1803 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1804
1805 return ::boost::pfr::detail::make_tuple_of_references(
1806 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1807 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1808 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1809 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1810 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1811 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1812 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1813 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1814 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1815 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1816 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1817 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1818 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1819 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1820 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1821 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1822 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1823 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1824 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
1825 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
1826 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
1827 detail::workaround_cast<T, decltype(as)>(as)
1828 );
1829}
1830
1831template <class T>
1832constexpr auto tie_as_tuple(T& val, size_t_<65>) noexcept {
1833 auto& [
1834 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1835 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at
1836 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1837
1838 return ::boost::pfr::detail::make_tuple_of_references(
1839 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1840 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1841 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1842 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1843 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1844 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1845 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1846 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1847 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1848 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1849 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1850 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1851 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1852 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1853 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1854 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1855 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1856 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1857 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
1858 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
1859 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
1860 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at)
1861 );
1862}
1863
1864template <class T>
1865constexpr auto tie_as_tuple(T& val, size_t_<66>) noexcept {
1866 auto& [
1867 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1868 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au
1869 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1870
1871 return ::boost::pfr::detail::make_tuple_of_references(
1872 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1873 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1874 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1875 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1876 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1877 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1878 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1879 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1880 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1881 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1882 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1883 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1884 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1885 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1886 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1887 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1888 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1889 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1890 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
1891 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
1892 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
1893 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au)
1894 );
1895}
1896
1897template <class T>
1898constexpr auto tie_as_tuple(T& val, size_t_<67>) noexcept {
1899 auto& [
1900 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1901 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av
1902 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1903
1904 return ::boost::pfr::detail::make_tuple_of_references(
1905 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1906 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1907 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1908 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1909 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1910 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1911 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1912 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1913 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1914 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1915 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1916 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1917 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1918 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1919 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1920 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1921 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1922 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1923 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
1924 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
1925 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
1926 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
1927 detail::workaround_cast<T, decltype(av)>(av)
1928 );
1929}
1930
1931template <class T>
1932constexpr auto tie_as_tuple(T& val, size_t_<68>) noexcept {
1933 auto& [
1934 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1935 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw
1936 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1937
1938 return ::boost::pfr::detail::make_tuple_of_references(
1939 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1940 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1941 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1942 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1943 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1944 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1945 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1946 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1947 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1948 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1949 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1950 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1951 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1952 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1953 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1954 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1955 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1956 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1957 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
1958 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
1959 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
1960 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
1961 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw)
1962 );
1963}
1964
1965template <class T>
1966constexpr auto tie_as_tuple(T& val, size_t_<69>) noexcept {
1967 auto& [
1968 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
1969 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax
1970 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
1971
1972 return ::boost::pfr::detail::make_tuple_of_references(
1973 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
1974 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
1975 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
1976 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
1977 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
1978 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
1979 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
1980 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
1981 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
1982 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
1983 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
1984 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
1985 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
1986 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
1987 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
1988 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
1989 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
1990 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
1991 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
1992 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
1993 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
1994 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
1995 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax)
1996 );
1997}
1998
1999template <class T>
2000constexpr auto tie_as_tuple(T& val, size_t_<70>) noexcept {
2001 auto& [
2002 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2003 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay
2004 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2005
2006 return ::boost::pfr::detail::make_tuple_of_references(
2007 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2008 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2009 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2010 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2011 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2012 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2013 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2014 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2015 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2016 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2017 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2018 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2019 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2020 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2021 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2022 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2023 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2024 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2025 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2026 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2027 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2028 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2029 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2030 detail::workaround_cast<T, decltype(ay)>(ay)
2031 );
2032}
2033
2034template <class T>
2035constexpr auto tie_as_tuple(T& val, size_t_<71>) noexcept {
2036 auto& [
2037 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2038 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az
2039 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2040
2041 return ::boost::pfr::detail::make_tuple_of_references(
2042 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2043 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2044 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2045 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2046 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2047 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2048 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2049 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2050 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2051 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2052 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2053 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2054 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2055 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2056 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2057 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2058 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2059 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2060 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2061 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2062 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2063 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2064 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2065 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az)
2066 );
2067}
2068
2069template <class T>
2070constexpr auto tie_as_tuple(T& val, size_t_<72>) noexcept {
2071 auto& [
2072 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2073 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA
2074 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2075
2076 return ::boost::pfr::detail::make_tuple_of_references(
2077 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2078 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2079 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2080 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2081 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2082 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2083 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2084 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2085 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2086 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2087 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2088 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2089 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2090 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2091 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2092 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2093 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2094 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2095 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2096 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2097 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2098 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2099 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2100 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA)
2101 );
2102}
2103
2104template <class T>
2105constexpr auto tie_as_tuple(T& val, size_t_<73>) noexcept {
2106 auto& [
2107 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2108 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB
2109 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2110
2111 return ::boost::pfr::detail::make_tuple_of_references(
2112 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2113 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2114 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2115 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2116 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2117 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2118 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2119 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2120 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2121 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2122 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2123 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2124 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2125 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2126 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2127 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2128 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2129 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2130 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2131 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2132 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2133 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2134 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2135 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2136 detail::workaround_cast<T, decltype(aB)>(aB)
2137 );
2138}
2139
2140template <class T>
2141constexpr auto tie_as_tuple(T& val, size_t_<74>) noexcept {
2142 auto& [
2143 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2144 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC
2145 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2146
2147 return ::boost::pfr::detail::make_tuple_of_references(
2148 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2149 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2150 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2151 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2152 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2153 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2154 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2155 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2156 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2157 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2158 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2159 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2160 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2161 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2162 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2163 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2164 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2165 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2166 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2167 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2168 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2169 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2170 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2171 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2172 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC)
2173 );
2174}
2175
2176template <class T>
2177constexpr auto tie_as_tuple(T& val, size_t_<75>) noexcept {
2178 auto& [
2179 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2180 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD
2181 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2182
2183 return ::boost::pfr::detail::make_tuple_of_references(
2184 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2185 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2186 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2187 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2188 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2189 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2190 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2191 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2192 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2193 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2194 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2195 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2196 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2197 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2198 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2199 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2200 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2201 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2202 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2203 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2204 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2205 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2206 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2207 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2208 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD)
2209 );
2210}
2211
2212template <class T>
2213constexpr auto tie_as_tuple(T& val, size_t_<76>) noexcept {
2214 auto& [
2215 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2216 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE
2217 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2218
2219 return ::boost::pfr::detail::make_tuple_of_references(
2220 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2221 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2222 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2223 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2224 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2225 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2226 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2227 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2228 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2229 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2230 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2231 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2232 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2233 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2234 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2235 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2236 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2237 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2238 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2239 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2240 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2241 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2242 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2243 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2244 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2245 detail::workaround_cast<T, decltype(aE)>(aE)
2246 );
2247}
2248
2249template <class T>
2250constexpr auto tie_as_tuple(T& val, size_t_<77>) noexcept {
2251 auto& [
2252 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2253 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF
2254 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2255
2256 return ::boost::pfr::detail::make_tuple_of_references(
2257 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2258 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2259 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2260 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2261 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2262 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2263 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2264 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2265 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2266 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2267 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2268 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2269 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2270 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2271 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2272 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2273 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2274 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2275 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2276 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2277 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2278 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2279 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2280 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2281 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2282 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF)
2283 );
2284}
2285
2286template <class T>
2287constexpr auto tie_as_tuple(T& val, size_t_<78>) noexcept {
2288 auto& [
2289 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2290 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG
2291 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2292
2293 return ::boost::pfr::detail::make_tuple_of_references(
2294 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2295 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2296 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2297 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2298 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2299 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2300 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2301 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2302 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2303 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2304 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2305 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2306 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2307 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2308 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2309 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2310 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2311 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2312 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2313 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2314 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2315 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2316 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2317 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2318 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2319 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG)
2320 );
2321}
2322
2323template <class T>
2324constexpr auto tie_as_tuple(T& val, size_t_<79>) noexcept {
2325 auto& [
2326 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2327 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH
2328 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2329
2330 return ::boost::pfr::detail::make_tuple_of_references(
2331 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2332 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2333 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2334 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2335 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2336 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2337 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2338 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2339 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2340 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2341 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2342 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2343 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2344 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2345 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2346 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2347 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2348 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2349 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2350 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2351 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2352 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2353 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2354 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2355 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2356 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2357 detail::workaround_cast<T, decltype(aH)>(aH)
2358 );
2359}
2360
2361template <class T>
2362constexpr auto tie_as_tuple(T& val, size_t_<80>) noexcept {
2363 auto& [
2364 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2365 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ
2366 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2367
2368 return ::boost::pfr::detail::make_tuple_of_references(
2369 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2370 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2371 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2372 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2373 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2374 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2375 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2376 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2377 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2378 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2379 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2380 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2381 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2382 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2383 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2384 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2385 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2386 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2387 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2388 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2389 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2390 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2391 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2392 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2393 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2394 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2395 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ)
2396 );
2397}
2398
2399template <class T>
2400constexpr auto tie_as_tuple(T& val, size_t_<81>) noexcept {
2401 auto& [
2402 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2403 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK
2404 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2405
2406 return ::boost::pfr::detail::make_tuple_of_references(
2407 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2408 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2409 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2410 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2411 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2412 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2413 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2414 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2415 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2416 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2417 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2418 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2419 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2420 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2421 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2422 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2423 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2424 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2425 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2426 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2427 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2428 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2429 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2430 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2431 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2432 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2433 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK)
2434 );
2435}
2436
2437template <class T>
2438constexpr auto tie_as_tuple(T& val, size_t_<82>) noexcept {
2439 auto& [
2440 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2441 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL
2442 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2443
2444 return ::boost::pfr::detail::make_tuple_of_references(
2445 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2446 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2447 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2448 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2449 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2450 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2451 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2452 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2453 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2454 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2455 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2456 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2457 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2458 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2459 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2460 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2461 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2462 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2463 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2464 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2465 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2466 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2467 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2468 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2469 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2470 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2471 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2472 detail::workaround_cast<T, decltype(aL)>(aL)
2473 );
2474}
2475
2476template <class T>
2477constexpr auto tie_as_tuple(T& val, size_t_<83>) noexcept {
2478 auto& [
2479 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2480 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM
2481 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2482
2483 return ::boost::pfr::detail::make_tuple_of_references(
2484 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2485 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2486 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2487 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2488 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2489 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2490 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2491 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2492 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2493 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2494 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2495 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2496 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2497 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2498 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2499 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2500 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2501 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2502 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2503 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2504 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2505 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2506 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2507 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2508 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2509 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2510 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2511 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM)
2512 );
2513}
2514
2515template <class T>
2516constexpr auto tie_as_tuple(T& val, size_t_<84>) noexcept {
2517 auto& [
2518 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2519 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN
2520 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2521
2522 return ::boost::pfr::detail::make_tuple_of_references(
2523 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2524 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2525 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2526 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2527 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2528 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2529 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2530 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2531 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2532 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2533 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2534 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2535 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2536 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2537 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2538 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2539 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2540 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2541 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2542 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2543 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2544 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2545 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2546 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2547 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2548 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2549 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2550 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN)
2551 );
2552}
2553
2554template <class T>
2555constexpr auto tie_as_tuple(T& val, size_t_<85>) noexcept {
2556 auto& [
2557 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2558 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP
2559 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2560
2561 return ::boost::pfr::detail::make_tuple_of_references(
2562 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2563 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2564 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2565 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2566 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2567 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2568 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2569 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2570 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2571 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2572 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2573 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2574 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2575 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2576 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2577 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2578 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2579 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2580 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2581 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2582 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2583 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2584 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2585 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2586 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2587 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2588 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2589 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
2590 detail::workaround_cast<T, decltype(aP)>(aP)
2591 );
2592}
2593
2594template <class T>
2595constexpr auto tie_as_tuple(T& val, size_t_<86>) noexcept {
2596 auto& [
2597 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2598 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ
2599 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2600
2601 return ::boost::pfr::detail::make_tuple_of_references(
2602 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2603 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2604 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2605 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2606 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2607 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2608 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2609 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2610 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2611 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2612 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2613 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2614 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2615 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2616 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2617 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2618 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2619 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2620 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2621 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2622 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2623 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2624 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2625 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2626 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2627 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2628 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2629 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
2630 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ)
2631 );
2632}
2633
2634template <class T>
2635constexpr auto tie_as_tuple(T& val, size_t_<87>) noexcept {
2636 auto& [
2637 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2638 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR
2639 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2640
2641 return ::boost::pfr::detail::make_tuple_of_references(
2642 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2643 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2644 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2645 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2646 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2647 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2648 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2649 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2650 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2651 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2652 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2653 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2654 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2655 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2656 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2657 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2658 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2659 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2660 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2661 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2662 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2663 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2664 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2665 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2666 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2667 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2668 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2669 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
2670 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR)
2671 );
2672}
2673
2674template <class T>
2675constexpr auto tie_as_tuple(T& val, size_t_<88>) noexcept {
2676 auto& [
2677 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2678 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS
2679 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2680
2681 return ::boost::pfr::detail::make_tuple_of_references(
2682 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2683 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2684 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2685 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2686 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2687 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2688 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2689 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2690 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2691 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2692 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2693 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2694 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2695 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2696 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2697 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2698 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2699 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2700 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2701 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2702 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2703 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2704 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2705 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2706 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2707 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2708 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2709 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
2710 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
2711 detail::workaround_cast<T, decltype(aS)>(aS)
2712 );
2713}
2714
2715template <class T>
2716constexpr auto tie_as_tuple(T& val, size_t_<89>) noexcept {
2717 auto& [
2718 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2719 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS,aU
2720 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2721
2722 return ::boost::pfr::detail::make_tuple_of_references(
2723 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2724 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2725 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2726 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2727 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2728 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2729 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2730 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2731 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2732 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2733 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2734 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2735 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2736 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2737 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2738 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2739 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2740 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2741 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2742 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2743 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2744 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2745 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2746 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2747 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2748 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2749 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2750 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
2751 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
2752 detail::workaround_cast<T, decltype(aS)>(aS),detail::workaround_cast<T, decltype(aU)>(aU)
2753 );
2754}
2755
2756template <class T>
2757constexpr auto tie_as_tuple(T& val, size_t_<90>) noexcept {
2758 auto& [
2759 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2760 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS,aU,aV
2761 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2762
2763 return ::boost::pfr::detail::make_tuple_of_references(
2764 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2765 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2766 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2767 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2768 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2769 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2770 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2771 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2772 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2773 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2774 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2775 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2776 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2777 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2778 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2779 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2780 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2781 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2782 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2783 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2784 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2785 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2786 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2787 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2788 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2789 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2790 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2791 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
2792 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
2793 detail::workaround_cast<T, decltype(aS)>(aS),detail::workaround_cast<T, decltype(aU)>(aU),detail::workaround_cast<T, decltype(aV)>(aV)
2794 );
2795}
2796
2797template <class T>
2798constexpr auto tie_as_tuple(T& val, size_t_<91>) noexcept {
2799 auto& [
2800 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2801 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS,aU,aV,aW
2802 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2803
2804 return ::boost::pfr::detail::make_tuple_of_references(
2805 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2806 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2807 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2808 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2809 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2810 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2811 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2812 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2813 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2814 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2815 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2816 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2817 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2818 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2819 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2820 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2821 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2822 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2823 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2824 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2825 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2826 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2827 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2828 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2829 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2830 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2831 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2832 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
2833 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
2834 detail::workaround_cast<T, decltype(aS)>(aS),detail::workaround_cast<T, decltype(aU)>(aU),detail::workaround_cast<T, decltype(aV)>(aV),
2835 detail::workaround_cast<T, decltype(aW)>(aW)
2836 );
2837}
2838
2839template <class T>
2840constexpr auto tie_as_tuple(T& val, size_t_<92>) noexcept {
2841 auto& [
2842 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2843 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS,aU,aV,aW,aX
2844 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2845
2846 return ::boost::pfr::detail::make_tuple_of_references(
2847 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2848 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2849 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2850 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2851 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2852 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2853 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2854 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2855 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2856 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2857 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2858 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2859 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2860 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2861 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2862 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2863 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2864 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2865 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2866 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2867 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2868 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2869 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2870 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2871 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2872 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2873 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2874 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
2875 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
2876 detail::workaround_cast<T, decltype(aS)>(aS),detail::workaround_cast<T, decltype(aU)>(aU),detail::workaround_cast<T, decltype(aV)>(aV),
2877 detail::workaround_cast<T, decltype(aW)>(aW),detail::workaround_cast<T, decltype(aX)>(aX)
2878 );
2879}
2880
2881template <class T>
2882constexpr auto tie_as_tuple(T& val, size_t_<93>) noexcept {
2883 auto& [
2884 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2885 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS,aU,aV,aW,aX,aY
2886 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2887
2888 return ::boost::pfr::detail::make_tuple_of_references(
2889 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2890 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2891 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2892 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2893 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2894 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2895 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2896 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2897 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2898 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2899 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2900 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2901 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2902 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2903 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2904 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2905 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2906 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2907 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2908 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2909 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2910 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2911 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2912 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2913 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2914 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2915 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2916 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
2917 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
2918 detail::workaround_cast<T, decltype(aS)>(aS),detail::workaround_cast<T, decltype(aU)>(aU),detail::workaround_cast<T, decltype(aV)>(aV),
2919 detail::workaround_cast<T, decltype(aW)>(aW),detail::workaround_cast<T, decltype(aX)>(aX),detail::workaround_cast<T, decltype(aY)>(aY)
2920 );
2921}
2922
2923template <class T>
2924constexpr auto tie_as_tuple(T& val, size_t_<94>) noexcept {
2925 auto& [
2926 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2927 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS,aU,aV,aW,aX,aY,aZ
2928 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2929
2930 return ::boost::pfr::detail::make_tuple_of_references(
2931 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2932 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2933 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2934 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2935 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2936 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2937 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2938 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2939 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2940 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2941 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2942 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2943 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2944 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2945 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2946 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2947 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2948 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2949 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2950 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2951 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2952 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2953 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2954 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2955 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
2956 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
2957 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
2958 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
2959 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
2960 detail::workaround_cast<T, decltype(aS)>(aS),detail::workaround_cast<T, decltype(aU)>(aU),detail::workaround_cast<T, decltype(aV)>(aV),
2961 detail::workaround_cast<T, decltype(aW)>(aW),detail::workaround_cast<T, decltype(aX)>(aX),detail::workaround_cast<T, decltype(aY)>(aY),
2962 detail::workaround_cast<T, decltype(aZ)>(aZ)
2963 );
2964}
2965
2966template <class T>
2967constexpr auto tie_as_tuple(T& val, size_t_<95>) noexcept {
2968 auto& [
2969 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
2970 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS,aU,aV,aW,aX,aY,aZ,
2971 ba
2972 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
2973
2974 return ::boost::pfr::detail::make_tuple_of_references(
2975 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
2976 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
2977 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
2978 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
2979 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
2980 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
2981 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
2982 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
2983 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
2984 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
2985 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
2986 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
2987 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
2988 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
2989 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
2990 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
2991 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
2992 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
2993 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
2994 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
2995 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
2996 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
2997 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
2998 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
2999 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
3000 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
3001 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
3002 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
3003 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
3004 detail::workaround_cast<T, decltype(aS)>(aS),detail::workaround_cast<T, decltype(aU)>(aU),detail::workaround_cast<T, decltype(aV)>(aV),
3005 detail::workaround_cast<T, decltype(aW)>(aW),detail::workaround_cast<T, decltype(aX)>(aX),detail::workaround_cast<T, decltype(aY)>(aY),
3006 detail::workaround_cast<T, decltype(aZ)>(aZ),detail::workaround_cast<T, decltype(ba)>(ba)
3007 );
3008}
3009
3010template <class T>
3011constexpr auto tie_as_tuple(T& val, size_t_<96>) noexcept {
3012 auto& [
3013 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
3014 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS,aU,aV,aW,aX,aY,aZ,
3015 ba,bb
3016 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
3017
3018 return ::boost::pfr::detail::make_tuple_of_references(
3019 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
3020 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
3021 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
3022 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
3023 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
3024 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
3025 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
3026 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
3027 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
3028 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
3029 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
3030 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
3031 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
3032 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
3033 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
3034 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
3035 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
3036 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
3037 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
3038 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
3039 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
3040 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
3041 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
3042 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
3043 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
3044 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
3045 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
3046 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
3047 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
3048 detail::workaround_cast<T, decltype(aS)>(aS),detail::workaround_cast<T, decltype(aU)>(aU),detail::workaround_cast<T, decltype(aV)>(aV),
3049 detail::workaround_cast<T, decltype(aW)>(aW),detail::workaround_cast<T, decltype(aX)>(aX),detail::workaround_cast<T, decltype(aY)>(aY),
3050 detail::workaround_cast<T, decltype(aZ)>(aZ),detail::workaround_cast<T, decltype(ba)>(ba),detail::workaround_cast<T, decltype(bb)>(bb)
3051 );
3052}
3053
3054template <class T>
3055constexpr auto tie_as_tuple(T& val, size_t_<97>) noexcept {
3056 auto& [
3057 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
3058 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS,aU,aV,aW,aX,aY,aZ,
3059 ba,bb,bc
3060 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
3061
3062 return ::boost::pfr::detail::make_tuple_of_references(
3063 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
3064 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
3065 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
3066 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
3067 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
3068 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
3069 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
3070 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
3071 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
3072 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
3073 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
3074 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
3075 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
3076 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
3077 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
3078 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
3079 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
3080 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
3081 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
3082 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
3083 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
3084 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
3085 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
3086 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
3087 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
3088 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
3089 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
3090 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
3091 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
3092 detail::workaround_cast<T, decltype(aS)>(aS),detail::workaround_cast<T, decltype(aU)>(aU),detail::workaround_cast<T, decltype(aV)>(aV),
3093 detail::workaround_cast<T, decltype(aW)>(aW),detail::workaround_cast<T, decltype(aX)>(aX),detail::workaround_cast<T, decltype(aY)>(aY),
3094 detail::workaround_cast<T, decltype(aZ)>(aZ),detail::workaround_cast<T, decltype(ba)>(ba),detail::workaround_cast<T, decltype(bb)>(bb),
3095 detail::workaround_cast<T, decltype(bc)>(bc)
3096 );
3097}
3098
3099template <class T>
3100constexpr auto tie_as_tuple(T& val, size_t_<98>) noexcept {
3101 auto& [
3102 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
3103 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS,aU,aV,aW,aX,aY,aZ,
3104 ba,bb,bc,bd
3105 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
3106
3107 return ::boost::pfr::detail::make_tuple_of_references(
3108 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
3109 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
3110 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
3111 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
3112 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
3113 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
3114 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
3115 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
3116 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
3117 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
3118 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
3119 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
3120 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
3121 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
3122 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
3123 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
3124 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
3125 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
3126 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
3127 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
3128 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
3129 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
3130 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
3131 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
3132 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
3133 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
3134 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
3135 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
3136 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
3137 detail::workaround_cast<T, decltype(aS)>(aS),detail::workaround_cast<T, decltype(aU)>(aU),detail::workaround_cast<T, decltype(aV)>(aV),
3138 detail::workaround_cast<T, decltype(aW)>(aW),detail::workaround_cast<T, decltype(aX)>(aX),detail::workaround_cast<T, decltype(aY)>(aY),
3139 detail::workaround_cast<T, decltype(aZ)>(aZ),detail::workaround_cast<T, decltype(ba)>(ba),detail::workaround_cast<T, decltype(bb)>(bb),
3140 detail::workaround_cast<T, decltype(bc)>(bc),detail::workaround_cast<T, decltype(bd)>(bd)
3141 );
3142}
3143
3144template <class T>
3145constexpr auto tie_as_tuple(T& val, size_t_<99>) noexcept {
3146 auto& [
3147 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
3148 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS,aU,aV,aW,aX,aY,aZ,
3149 ba,bb,bc,bd,be
3150 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
3151
3152 return ::boost::pfr::detail::make_tuple_of_references(
3153 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
3154 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
3155 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
3156 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
3157 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
3158 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
3159 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
3160 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
3161 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
3162 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
3163 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
3164 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
3165 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
3166 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
3167 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
3168 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
3169 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
3170 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
3171 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
3172 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
3173 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
3174 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
3175 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
3176 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
3177 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
3178 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
3179 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
3180 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
3181 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
3182 detail::workaround_cast<T, decltype(aS)>(aS),detail::workaround_cast<T, decltype(aU)>(aU),detail::workaround_cast<T, decltype(aV)>(aV),
3183 detail::workaround_cast<T, decltype(aW)>(aW),detail::workaround_cast<T, decltype(aX)>(aX),detail::workaround_cast<T, decltype(aY)>(aY),
3184 detail::workaround_cast<T, decltype(aZ)>(aZ),detail::workaround_cast<T, decltype(ba)>(ba),detail::workaround_cast<T, decltype(bb)>(bb),
3185 detail::workaround_cast<T, decltype(bc)>(bc),detail::workaround_cast<T, decltype(bd)>(bd),detail::workaround_cast<T, decltype(be)>(be)
3186 );
3187}
3188
3189template <class T>
3190constexpr auto tie_as_tuple(T& val, size_t_<100>) noexcept {
3191 auto& [
3192 a,b,c,d,e,f,g,h,j,k,l,m,n,p,q,r,s,t,u,v,w,x,y,z,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,S,U,V,W,X,Y,Z,
3193 aa,ab,ac,ad,ae,af,ag,ah,aj,ak,al,am,an,ap,aq,ar,as,at,au,av,aw,ax,ay,az,aA,aB,aC,aD,aE,aF,aG,aH,aJ,aK,aL,aM,aN,aP,aQ,aR,aS,aU,aV,aW,aX,aY,aZ,
3194 ba,bb,bc,bd,be,bf
3195 ] = const_cast<std::remove_cv_t<T>&>(val); // ====================> Boost.PFR: User-provided type is not a SimpleAggregate.
3196
3197 return ::boost::pfr::detail::make_tuple_of_references(
3198 detail::workaround_cast<T, decltype(a)>(a),detail::workaround_cast<T, decltype(b)>(b),detail::workaround_cast<T, decltype(c)>(c),
3199 detail::workaround_cast<T, decltype(d)>(d),detail::workaround_cast<T, decltype(e)>(e),detail::workaround_cast<T, decltype(f)>(f),
3200 detail::workaround_cast<T, decltype(g)>(g),detail::workaround_cast<T, decltype(h)>(h),detail::workaround_cast<T, decltype(j)>(j),
3201 detail::workaround_cast<T, decltype(k)>(k),detail::workaround_cast<T, decltype(l)>(l),detail::workaround_cast<T, decltype(m)>(m),
3202 detail::workaround_cast<T, decltype(n)>(n),detail::workaround_cast<T, decltype(p)>(p),detail::workaround_cast<T, decltype(q)>(q),
3203 detail::workaround_cast<T, decltype(r)>(r),detail::workaround_cast<T, decltype(s)>(s),detail::workaround_cast<T, decltype(t)>(t),
3204 detail::workaround_cast<T, decltype(u)>(u),detail::workaround_cast<T, decltype(v)>(v),detail::workaround_cast<T, decltype(w)>(w),
3205 detail::workaround_cast<T, decltype(x)>(x),detail::workaround_cast<T, decltype(y)>(y),detail::workaround_cast<T, decltype(z)>(z),
3206 detail::workaround_cast<T, decltype(A)>(A),detail::workaround_cast<T, decltype(B)>(B),detail::workaround_cast<T, decltype(C)>(C),
3207 detail::workaround_cast<T, decltype(D)>(D),detail::workaround_cast<T, decltype(E)>(E),detail::workaround_cast<T, decltype(F)>(F),
3208 detail::workaround_cast<T, decltype(G)>(G),detail::workaround_cast<T, decltype(H)>(H),detail::workaround_cast<T, decltype(J)>(J),
3209 detail::workaround_cast<T, decltype(K)>(K),detail::workaround_cast<T, decltype(L)>(L),detail::workaround_cast<T, decltype(M)>(M),
3210 detail::workaround_cast<T, decltype(N)>(N),detail::workaround_cast<T, decltype(P)>(P),detail::workaround_cast<T, decltype(Q)>(Q),
3211 detail::workaround_cast<T, decltype(R)>(R),detail::workaround_cast<T, decltype(S)>(S),detail::workaround_cast<T, decltype(U)>(U),
3212 detail::workaround_cast<T, decltype(V)>(V),detail::workaround_cast<T, decltype(W)>(W),detail::workaround_cast<T, decltype(X)>(X),
3213 detail::workaround_cast<T, decltype(Y)>(Y),detail::workaround_cast<T, decltype(Z)>(Z),detail::workaround_cast<T, decltype(aa)>(aa),
3214 detail::workaround_cast<T, decltype(ab)>(ab),detail::workaround_cast<T, decltype(ac)>(ac),detail::workaround_cast<T, decltype(ad)>(ad),
3215 detail::workaround_cast<T, decltype(ae)>(ae),detail::workaround_cast<T, decltype(af)>(af),detail::workaround_cast<T, decltype(ag)>(ag),
3216 detail::workaround_cast<T, decltype(ah)>(ah),detail::workaround_cast<T, decltype(aj)>(aj),detail::workaround_cast<T, decltype(ak)>(ak),
3217 detail::workaround_cast<T, decltype(al)>(al),detail::workaround_cast<T, decltype(am)>(am),detail::workaround_cast<T, decltype(an)>(an),
3218 detail::workaround_cast<T, decltype(ap)>(ap),detail::workaround_cast<T, decltype(aq)>(aq),detail::workaround_cast<T, decltype(ar)>(ar),
3219 detail::workaround_cast<T, decltype(as)>(as),detail::workaround_cast<T, decltype(at)>(at),detail::workaround_cast<T, decltype(au)>(au),
3220 detail::workaround_cast<T, decltype(av)>(av),detail::workaround_cast<T, decltype(aw)>(aw),detail::workaround_cast<T, decltype(ax)>(ax),
3221 detail::workaround_cast<T, decltype(ay)>(ay),detail::workaround_cast<T, decltype(az)>(az),detail::workaround_cast<T, decltype(aA)>(aA),
3222 detail::workaround_cast<T, decltype(aB)>(aB),detail::workaround_cast<T, decltype(aC)>(aC),detail::workaround_cast<T, decltype(aD)>(aD),
3223 detail::workaround_cast<T, decltype(aE)>(aE),detail::workaround_cast<T, decltype(aF)>(aF),detail::workaround_cast<T, decltype(aG)>(aG),
3224 detail::workaround_cast<T, decltype(aH)>(aH),detail::workaround_cast<T, decltype(aJ)>(aJ),detail::workaround_cast<T, decltype(aK)>(aK),
3225 detail::workaround_cast<T, decltype(aL)>(aL),detail::workaround_cast<T, decltype(aM)>(aM),detail::workaround_cast<T, decltype(aN)>(aN),
3226 detail::workaround_cast<T, decltype(aP)>(aP),detail::workaround_cast<T, decltype(aQ)>(aQ),detail::workaround_cast<T, decltype(aR)>(aR),
3227 detail::workaround_cast<T, decltype(aS)>(aS),detail::workaround_cast<T, decltype(aU)>(aU),detail::workaround_cast<T, decltype(aV)>(aV),
3228 detail::workaround_cast<T, decltype(aW)>(aW),detail::workaround_cast<T, decltype(aX)>(aX),detail::workaround_cast<T, decltype(aY)>(aY),
3229 detail::workaround_cast<T, decltype(aZ)>(aZ),detail::workaround_cast<T, decltype(ba)>(ba),detail::workaround_cast<T, decltype(bb)>(bb),
3230 detail::workaround_cast<T, decltype(bc)>(bc),detail::workaround_cast<T, decltype(bd)>(bd),detail::workaround_cast<T, decltype(be)>(be),
3231 detail::workaround_cast<T, decltype(bf)>(bf)
3232 );
3233}
3234
3235
3236template <class T, std::size_t I>
3237constexpr void tie_as_tuple(T& /*val*/, size_t_<I>) noexcept {
3238 static_assert(sizeof(T) && false,
3239 "====================> Boost.PFR: Too many fields in a structure T. Regenerate include/boost/pfr/detail/core17_generated.hpp file for appropriate count of fields. For example: `python ./misc/generate_cpp17.py 300 > include/boost/pfr/detail/core17_generated.hpp`");
3240}
3241
3242}}} // namespace boost::pfr::detail
3243
3244#endif // BOOST_PFR_DETAIL_CORE17_GENERATED_HPP
3245
3246// Copyright (c) 2016-2023 Antony Polukhin
3247//
3248// Distributed under the Boost Software License, Version 1.0. (See accompanying
3249// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
3250
3251#ifndef BOOST_PFR_DETAIL_FIELDS_COUNT_HPP
3252#define BOOST_PFR_DETAIL_FIELDS_COUNT_HPP
3253
3254// Copyright (c) 2019-2023 Antony Polukhin.
3255//
3256// Distributed under the Boost Software License, Version 1.0. (See accompanying
3257// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
3258
3259#ifndef BOOST_PFR_DETAIL_UNSAFE_DECLVAL_HPP
3260#define BOOST_PFR_DETAIL_UNSAFE_DECLVAL_HPP
3261
3262
3263#include <type_traits>
3264
3265namespace boost { namespace pfr { namespace detail {
3266
3267// This function serves as a link-time assert. If linker requires it, then
3268// `unsafe_declval()` is used at runtime.
3269void report_if_you_see_link_error_with_this_function() noexcept;
3270
3271// For returning non default constructible types. Do NOT use at runtime!
3272//
3273// GCCs std::declval may not be used in potentionally evaluated contexts,
3274// so we reinvent it.
3275template <class T>
3276constexpr T unsafe_declval() noexcept {
3277 report_if_you_see_link_error_with_this_function();
3278
3279 typename std::remove_reference<T>::type* ptr = nullptr;
3280 ptr += 42; // suppresses 'null pointer dereference' warnings
3281 return static_cast<T>(*ptr);
3282}
3283
3284}}} // namespace boost::pfr::detail
3285
3286
3287#endif // BOOST_PFR_DETAIL_UNSAFE_DECLVAL_HPP
3288
3289
3290#include <climits> // CHAR_BIT
3291#include <type_traits>
3292#include <utility> // metaprogramming stuff
3293
3294#ifdef __clang__
3295# pragma clang diagnostic push
3296# pragma clang diagnostic ignored "-Wmissing-braces"
3297# pragma clang diagnostic ignored "-Wundefined-inline"
3298# pragma clang diagnostic ignored "-Wundefined-internal"
3299# pragma clang diagnostic ignored "-Wmissing-field-initializers"
3300#endif
3301
3302namespace boost { namespace pfr { namespace detail {
3303
3305struct ubiq_lref_constructor {
3306 std::size_t ignore;
3307 template <class Type> constexpr operator Type&() const && noexcept { // tweak for template_unconstrained.cpp like cases
3308 return detail::unsafe_declval<Type&>();
3309 }
3310
3311 template <class Type> constexpr operator Type&() const & noexcept { // tweak for optional_chrono.cpp like cases
3312 return detail::unsafe_declval<Type&>();
3313 }
3314};
3315
3317struct ubiq_rref_constructor {
3318 std::size_t ignore;
3319 template <class Type> /*constexpr*/ operator Type() const && noexcept { // Allows initialization of rvalue reference fields and move-only types
3320 return detail::unsafe_declval<Type>();
3321 }
3322};
3323
3324
3325#ifndef __cpp_lib_is_aggregate
3327
3328// Structure that can be converted to reference to anything except reference to T
3329template <class T, bool IsCopyConstructible>
3330struct ubiq_constructor_except {
3331 std::size_t ignore;
3332 template <class Type> constexpr operator std::enable_if_t<!std::is_same<T, Type>::value, Type&> () const noexcept; // Undefined
3333};
3334
3335template <class T>
3336struct ubiq_constructor_except<T, false> {
3337 std::size_t ignore;
3338 template <class Type> constexpr operator std::enable_if_t<!std::is_same<T, Type>::value, Type&&> () const noexcept; // Undefined
3339};
3340
3341
3342// `std::is_constructible<T, ubiq_constructor_except<T>>` consumes a lot of time, so we made a separate lazy trait for it.
3343template <std::size_t N, class T> struct is_single_field_and_aggregate_initializable: std::false_type {};
3344template <class T> struct is_single_field_and_aggregate_initializable<1, T>: std::integral_constant<
3345 bool, !std::is_constructible<T, ubiq_constructor_except<T, std::is_copy_constructible<T>::value>>::value
3346> {};
3347
3348// Hand-made is_aggregate<T> trait:
3349// Before C++20 aggregates could be constructed from `decltype(ubiq_?ref_constructor{I})...` but type traits report that
3350// there's no constructor from `decltype(ubiq_?ref_constructor{I})...`
3351// Special case for N == 1: `std::is_constructible<T, ubiq_?ref_constructor>` returns true if N == 1 and T is copy/move constructible.
3352template <class T, std::size_t N>
3353struct is_aggregate_initializable_n {
3354 template <std::size_t ...I>
3355 static constexpr bool is_not_constructible_n(std::index_sequence<I...>) noexcept {
3356 return (!std::is_constructible<T, decltype(ubiq_lref_constructor{I})...>::value && !std::is_constructible<T, decltype(ubiq_rref_constructor{I})...>::value)
3357 || is_single_field_and_aggregate_initializable<N, T>::value
3358 ;
3359 }
3360
3361 static constexpr bool value =
3362 std::is_empty<T>::value
3363 || std::is_array<T>::value
3364 || std::is_fundamental<T>::value
3365 || is_not_constructible_n(detail::make_index_sequence<N>{})
3366 ;
3367};
3368
3369#endif // #ifndef __cpp_lib_is_aggregate
3370
3372template <class Derived, class U>
3373constexpr bool static_assert_non_inherited() noexcept {
3374 static_assert(
3375 !std::is_base_of<U, Derived>::value,
3376 "====================> Boost.PFR: Boost.PFR: Inherited types are not supported."
3377 );
3378 return true;
3379}
3380
3381template <class Derived>
3382struct ubiq_lref_base_asserting {
3383 template <class Type> constexpr operator Type&() const && // tweak for template_unconstrained.cpp like cases
3384 noexcept(detail::static_assert_non_inherited<Derived, Type>()) // force the computation of assert function
3385 {
3386 return detail::unsafe_declval<Type&>();
3387 }
3388
3389 template <class Type> constexpr operator Type&() const & // tweak for optional_chrono.cpp like cases
3390 noexcept(detail::static_assert_non_inherited<Derived, Type>()) // force the computation of assert function
3391 {
3392 return detail::unsafe_declval<Type&>();
3393 }
3394};
3395
3396template <class Derived>
3397struct ubiq_rref_base_asserting {
3398 template <class Type> /*constexpr*/ operator Type() const && // Allows initialization of rvalue reference fields and move-only types
3399 noexcept(detail::static_assert_non_inherited<Derived, Type>()) // force the computation of assert function
3400 {
3401 return detail::unsafe_declval<Type>();
3402 }
3403};
3404
3405template <class T, std::size_t I0, std::size_t... I, class /*Enable*/ = typename std::enable_if<std::is_copy_constructible<T>::value>::type>
3406constexpr auto assert_first_not_base(std::index_sequence<I0, I...>) noexcept
3407 -> typename std::add_pointer<decltype(T{ ubiq_lref_base_asserting<T>{}, ubiq_lref_constructor{I}... })>::type
3408{
3409 return nullptr;
3410}
3411
3412template <class T, std::size_t I0, std::size_t... I, class /*Enable*/ = typename std::enable_if<!std::is_copy_constructible<T>::value>::type>
3413constexpr auto assert_first_not_base(std::index_sequence<I0, I...>) noexcept
3414 -> typename std::add_pointer<decltype(T{ ubiq_rref_base_asserting<T>{}, ubiq_rref_constructor{I}... })>::type
3415{
3416 return nullptr;
3417}
3418
3419template <class T>
3420constexpr void* assert_first_not_base(std::index_sequence<>) noexcept
3421{
3422 return nullptr;
3423}
3424
3426template <class T, std::size_t... I, class /*Enable*/ = typename std::enable_if<std::is_copy_constructible<T>::value>::type>
3427constexpr auto enable_if_constructible_helper(std::index_sequence<I...>) noexcept
3428 -> typename std::add_pointer<decltype(T{ ubiq_lref_constructor{I}... })>::type;
3429
3430template <class T, std::size_t... I, class /*Enable*/ = typename std::enable_if<!std::is_copy_constructible<T>::value>::type>
3431constexpr auto enable_if_constructible_helper(std::index_sequence<I...>) noexcept
3432 -> typename std::add_pointer<decltype(T{ ubiq_rref_constructor{I}... })>::type;
3433
3434template <class T, std::size_t N, class /*Enable*/ = decltype( enable_if_constructible_helper<T>(detail::make_index_sequence<N>()) ) >
3435using enable_if_constructible_helper_t = std::size_t;
3436
3438template <std::size_t Begin, std::size_t Last>
3439using is_one_element_range = std::integral_constant<bool, Begin == Last>;
3440
3441using multi_element_range = std::false_type;
3442using one_element_range = std::true_type;
3443
3445template <class T, std::size_t Begin, std::size_t Middle>
3446constexpr std::size_t detect_fields_count(detail::one_element_range, long) noexcept {
3447 static_assert(
3448 Begin == Middle,
3449 "====================> Boost.PFR: Internal logic error."
3450 );
3451 return Begin;
3452}
3453
3454template <class T, std::size_t Begin, std::size_t Middle>
3455constexpr std::size_t detect_fields_count(detail::multi_element_range, int) noexcept;
3456
3457template <class T, std::size_t Begin, std::size_t Middle>
3458constexpr auto detect_fields_count(detail::multi_element_range, long) noexcept
3459 -> detail::enable_if_constructible_helper_t<T, Middle>
3460{
3461 constexpr std::size_t next_v = Middle + (Middle - Begin + 1) / 2;
3462 return detail::detect_fields_count<T, Middle, next_v>(detail::is_one_element_range<Middle, next_v>{}, 1L);
3463}
3464
3465template <class T, std::size_t Begin, std::size_t Middle>
3466constexpr std::size_t detect_fields_count(detail::multi_element_range, int) noexcept {
3467 constexpr std::size_t next_v = Begin + (Middle - Begin) / 2;
3468 return detail::detect_fields_count<T, Begin, next_v>(detail::is_one_element_range<Begin, next_v>{}, 1L);
3469}
3470
3472template <class T, std::size_t N>
3473constexpr auto detect_fields_count_greedy_remember(long) noexcept
3474 -> detail::enable_if_constructible_helper_t<T, N>
3475{
3476 return N;
3477}
3478
3479template <class T, std::size_t N>
3480constexpr std::size_t detect_fields_count_greedy_remember(int) noexcept {
3481 return 0;
3482}
3483
3484template <class T, std::size_t Begin, std::size_t Last>
3485constexpr std::size_t detect_fields_count_greedy(detail::one_element_range) noexcept {
3486 static_assert(
3487 Begin == Last,
3488 "====================> Boost.PFR: Internal logic error."
3489 );
3490 return detail::detect_fields_count_greedy_remember<T, Begin>(1L);
3491}
3492
3493template <class T, std::size_t Begin, std::size_t Last>
3494constexpr std::size_t detect_fields_count_greedy(detail::multi_element_range) noexcept {
3495 constexpr std::size_t middle = Begin + (Last - Begin) / 2;
3496 constexpr std::size_t fields_count_big_range = detail::detect_fields_count_greedy<T, middle + 1, Last>(
3497 detail::is_one_element_range<middle + 1, Last>{}
3498 );
3499
3500 constexpr std::size_t small_range_begin = (fields_count_big_range ? 0 : Begin);
3501 constexpr std::size_t small_range_last = (fields_count_big_range ? 0 : middle);
3502 constexpr std::size_t fields_count_small_range = detail::detect_fields_count_greedy<T, small_range_begin, small_range_last>(
3503 detail::is_one_element_range<small_range_begin, small_range_last>{}
3504 );
3505 return fields_count_big_range ? fields_count_big_range : fields_count_small_range;
3506}
3507
3509template <class T, std::size_t N>
3510constexpr auto detect_fields_count_dispatch(size_t_<N>, long, long) noexcept
3511 -> typename std::enable_if<std::is_array<T>::value, std::size_t>::type
3512{
3513 return sizeof(T) / sizeof(typename std::remove_all_extents<T>::type);
3514}
3515
3516template <class T, std::size_t N>
3517constexpr auto detect_fields_count_dispatch(size_t_<N>, long, int) noexcept
3518 -> decltype(sizeof(T{}))
3519{
3520 constexpr std::size_t middle = N / 2 + 1;
3521 return detail::detect_fields_count<T, 0, middle>(detail::multi_element_range{}, 1L);
3522}
3523
3524template <class T, std::size_t N>
3525constexpr std::size_t detect_fields_count_dispatch(size_t_<N>, int, int) noexcept {
3526 // T is not default aggregate initialzable. It means that at least one of the members is not default constructible,
3527 // so we have to check all the aggregate initializations for T up to N parameters and return the bigest succeeded
3528 // (we can not use binary search for detecting fields count).
3529 return detail::detect_fields_count_greedy<T, 0, N>(detail::multi_element_range{});
3530}
3531
3533template <class T>
3534constexpr std::size_t fields_count() noexcept {
3535 using type = std::remove_cv_t<T>;
3536
3537 static_assert(
3538 !std::is_reference<type>::value,
3539 "====================> Boost.PFR: Attempt to get fields count on a reference. This is not allowed because that could hide an issue and different library users expect different behavior in that case."
3540 );
3541
3542#if !BOOST_PFR_HAS_GUARANTEED_COPY_ELISION
3543 static_assert(
3544 std::is_copy_constructible<std::remove_all_extents_t<type>>::value || (
3545 std::is_move_constructible<std::remove_all_extents_t<type>>::value
3546 && std::is_move_assignable<std::remove_all_extents_t<type>>::value
3547 ),
3548 "====================> Boost.PFR: Type and each field in the type must be copy constructible (or move constructible and move assignable)."
3549 );
3550#endif // #if !BOOST_PFR_HAS_GUARANTEED_COPY_ELISION
3551
3552 static_assert(
3553 !std::is_polymorphic<type>::value,
3554 "====================> Boost.PFR: Type must have no virtual function, because otherwise it is not aggregate initializable."
3555 );
3556
3557#ifdef __cpp_lib_is_aggregate
3558 static_assert(
3559 std::is_aggregate<type>::value // Does not return `true` for built-in types.
3560 || std::is_scalar<type>::value,
3561 "====================> Boost.PFR: Type must be aggregate initializable."
3562 );
3563#endif
3564
3565// Can't use the following. See the non_std_layout.cpp test.
3566//#if !BOOST_PFR_USE_CPP17
3567// static_assert(
3568// std::is_standard_layout<type>::value, // Does not return `true` for structs that have non standard layout members.
3569// "Type must be aggregate initializable."
3570// );
3571//#endif
3572
3573#if defined(_MSC_VER) && (_MSC_VER <= 1920)
3574 // Workaround for msvc compilers. Versions <= 1920 have a limit of max 1024 elements in template parameter pack
3575 constexpr std::size_t max_fields_count = (sizeof(type) * CHAR_BIT >= 1024 ? 1024 : sizeof(type) * CHAR_BIT);
3576#else
3577 constexpr std::size_t max_fields_count = (sizeof(type) * CHAR_BIT); // We multiply by CHAR_BIT because the type may have bitfields in T
3578#endif
3579
3580 constexpr std::size_t result = detail::detect_fields_count_dispatch<type>(size_t_<max_fields_count>{}, 1L, 1L);
3581
3582 detail::assert_first_not_base<type>(detail::make_index_sequence<result>{});
3583
3584#ifndef __cpp_lib_is_aggregate
3585 static_assert(
3586 is_aggregate_initializable_n<type, result>::value,
3587 "====================> Boost.PFR: Types with user specified constructors (non-aggregate initializable types) are not supported."
3588 );
3589#endif
3590
3591 static_assert(
3592 result != 0 || std::is_empty<type>::value || std::is_fundamental<type>::value || std::is_reference<type>::value,
3593 "====================> Boost.PFR: If there's no other failed static asserts then something went wrong. Please report this issue to the github along with the structure you're reflecting."
3594 );
3595
3596 return result;
3597}
3598
3599}}} // namespace boost::pfr::detail
3600
3601#ifdef __clang__
3602# pragma clang diagnostic pop
3603#endif
3604
3605#endif // BOOST_PFR_DETAIL_FIELDS_COUNT_HPP
3606// Copyright (c) 2016-2023 Antony Polukhin
3607//
3608// Distributed under the Boost Software License, Version 1.0. (See accompanying
3609// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
3610
3611#ifndef BOOST_PFR_DETAIL_FOR_EACH_FIELD_IMPL_HPP
3612#define BOOST_PFR_DETAIL_FOR_EACH_FIELD_IMPL_HPP
3613
3614
3615#include <utility> // metaprogramming stuff
3616
3617// Copyright (c) 2016-2023 Antony Polukhin
3618//
3619// Distributed under the Boost Software License, Version 1.0. (See accompanying
3620// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
3621
3622#ifndef BOOST_PFR_DETAIL_RVALUE_T_HPP
3623#define BOOST_PFR_DETAIL_RVALUE_T_HPP
3624
3625#include <type_traits>
3626#include <utility> // std::enable_if_t
3627
3628// This header provides aliases rvalue_t and lvalue_t.
3629//
3630// Usage: template <class T> void foo(rvalue<T> rvalue);
3631//
3632// Those are useful for
3633// * better type safety - you can validate at compile time that only rvalue reference is passed into the function
3634// * documentation and readability - rvalue_t<T> is much better than T&&+SFINAE
3635
3636namespace boost { namespace pfr { namespace detail {
3637
3639template <class T
3640#ifdef BOOST_PFR_DETAIL_STRICT_RVALUE_TESTING
3641 , class = std::enable_if_t<std::is_rvalue_reference<T&&>::value>
3642#endif
3643>
3644using rvalue_t = T&&;
3645
3647
3648}}} // namespace boost::pfr::detail
3649
3650#endif // BOOST_PFR_DETAIL_RVALUE_T_HPP
3651
3652namespace boost { namespace pfr { namespace detail {
3653
3654template <std::size_t Index>
3655using size_t_ = std::integral_constant<std::size_t, Index >;
3656
3657template <class T, class F, class I, class = decltype(std::declval<F>()(std::declval<T>(), I{}))>
3658constexpr void for_each_field_impl_apply(T&& v, F&& f, I i, long) {
3659 std::forward<F>(f)(std::forward<T>(v), i);
3660}
3661
3662template <class T, class F, class I>
3663constexpr void for_each_field_impl_apply(T&& v, F&& f, I /*i*/, int) {
3664 std::forward<F>(f)(std::forward<T>(v));
3665}
3666
3667#if !defined(__cpp_fold_expressions) || __cpp_fold_expressions < 201603
3668template <class T, class F, std::size_t... I>
3669constexpr void for_each_field_impl(T& t, F&& f, std::index_sequence<I...>, std::false_type /*move_values*/) {
3670 const int v[] = {0, (
3671 detail::for_each_field_impl_apply(sequence_tuple::get<I>(t), std::forward<F>(f), size_t_<I>{}, 1L),
3672 0
3673 )...};
3674 (void)v;
3675}
3676
3677
3678template <class T, class F, std::size_t... I>
3679constexpr void for_each_field_impl(T& t, F&& f, std::index_sequence<I...>, std::true_type /*move_values*/) {
3680 const int v[] = {0, (
3681 detail::for_each_field_impl_apply(sequence_tuple::get<I>(std::move(t)), std::forward<F>(f), size_t_<I>{}, 1L),
3682 0
3683 )...};
3684 (void)v;
3685}
3686#else
3687template <class T, class F, std::size_t... I>
3688constexpr void for_each_field_impl(T& t, F&& f, std::index_sequence<I...>, std::false_type /*move_values*/) {
3689 (detail::for_each_field_impl_apply(sequence_tuple::get<I>(t), std::forward<F>(f), size_t_<I>{}, 1L), ...);
3690}
3691
3692template <class T, class F, std::size_t... I>
3693constexpr void for_each_field_impl(T& t, F&& f, std::index_sequence<I...>, std::true_type /*move_values*/) {
3694 (detail::for_each_field_impl_apply(sequence_tuple::get<I>(std::move(t)), std::forward<F>(f), size_t_<I>{}, 1L), ...);
3695}
3696#endif
3697
3698}}} // namespace boost::pfr::detail
3699
3700
3701#endif // BOOST_PFR_DETAIL_FOR_EACH_FIELD_IMPL_HPP
3702
3703namespace boost { namespace pfr { namespace detail {
3704
3705#ifndef _MSC_VER // MSVC fails to compile the following code, but compiles the structured bindings in core17_generated.hpp
3706struct do_not_define_std_tuple_size_for_me {
3707 bool test1 = true;
3708};
3709
3710template <class T>
3711constexpr bool do_structured_bindings_work() noexcept { // ******************************************* IN CASE OF ERROR READ THE FOLLOWING LINES IN boost/pfr/detail/core17.hpp FILE:
3712 T val{};
3713 auto& [a] = val; // ******************************************* IN CASE OF ERROR READ THE FOLLOWING LINES IN boost/pfr/detail/core17.hpp FILE:
3714
3715 /****************************************************************************
3716 *
3717 * It looks like your compiler or Standard Library can not handle C++17
3718 * structured bindings.
3719 *
3720 * Workaround: Define BOOST_PFR_USE_CPP17 to 0
3721 * It will disable the C++17 features for Boost.PFR library.
3722 *
3723 * Sorry for the inconvenience caused.
3724 *
3725 ****************************************************************************/
3726
3727 return a;
3728}
3729
3730static_assert(
3731 do_structured_bindings_work<do_not_define_std_tuple_size_for_me>(),
3732 "====================> Boost.PFR: Your compiler can not handle C++17 structured bindings. Read the above comments for workarounds."
3733);
3734#endif // #ifndef _MSC_VER
3735
3736template <class T>
3737constexpr auto tie_as_tuple(T& val) noexcept {
3738 static_assert(
3739 !std::is_union<T>::value,
3740 "====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
3741 );
3742 typedef size_t_<boost::pfr::detail::fields_count<T>()> fields_count_tag;
3743 return boost::pfr::detail::tie_as_tuple(val, fields_count_tag{});
3744}
3745
3746template <class T, class F, std::size_t... I>
3747constexpr void for_each_field_dispatcher(T& t, F&& f, std::index_sequence<I...>) {
3748 static_assert(
3749 !std::is_union<T>::value,
3750 "====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
3751 );
3752 std::forward<F>(f)(
3753 detail::tie_as_tuple(t)
3754 );
3755}
3756
3757}}} // namespace boost::pfr::detail
3758
3759#endif // BOOST_PFR_DETAIL_CORE17_HPP
3760#elif BOOST_PFR_USE_LOOPHOLE
3761// Copyright (c) 2017-2018 Alexandr Poltavsky, Antony Polukhin.
3762// Copyright (c) 2019-2023 Antony Polukhin.
3763//
3764// Distributed under the Boost Software License, Version 1.0. (See accompanying
3765// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
3766
3767
3768// The Great Type Loophole (C++14)
3769// Initial implementation by Alexandr Poltavsky, http://alexpolt.github.io
3770//
3771// Description:
3772// The Great Type Loophole is a technique that allows to exchange type information with template
3773// instantiations. Basically you can assign and read type information during compile time.
3774// Here it is used to detect data members of a data type. I described it for the first time in
3775// this blog post http://alexpolt.github.io/type-loophole.html .
3776//
3777// This technique exploits the http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#2118
3778// CWG 2118. Stateful metaprogramming via friend injection
3779// Note: CWG agreed that such techniques should be ill-formed, although the mechanism for prohibiting them is as yet undetermined.
3780
3781#ifndef BOOST_PFR_DETAIL_CORE14_LOOPHOLE_HPP
3782#define BOOST_PFR_DETAIL_CORE14_LOOPHOLE_HPP
3783
3784
3785#include <type_traits>
3786#include <utility>
3787
3788#include <boost/pfr/detail/cast_to_layout_compatible.hpp> // still needed for enums
3789// Copyright (c) 2017-2018 Chris Beck
3790// Copyright (c) 2019-2023 Antony Polukhin
3791//
3792// Distributed under the Boost Software License, Version 1.0. (See accompanying
3793// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
3794
3795#ifndef BOOST_PFR_DETAIL_OFFSET_BASED_GETTER_HPP
3796#define BOOST_PFR_DETAIL_OFFSET_BASED_GETTER_HPP
3797
3798
3799#include <type_traits>
3800#include <utility>
3801#include <memory> // std::addressof
3802
3803
3804namespace boost { namespace pfr { namespace detail {
3805
3806// Our own implementation of std::aligned_storage. On godbolt with MSVC, I have compilation errors
3807// using the standard version, it seems the compiler cannot generate default ctor.
3808
3809template<std::size_t s, std::size_t a>
3810struct internal_aligned_storage {
3811 alignas(a) char storage_[s];
3812};
3813
3814// Metafunction that replaces tuple<T1, T2, T3, ...> with
3815// tuple<std::aligned_storage_t<sizeof(T1), alignof(T1)>, std::aligned_storage<sizeof(T2), alignof(T2)>, ...>
3816//
3817// The point is, the new tuple is "layout compatible" in the sense that members have the same offsets,
3818// but this tuple is constexpr constructible.
3819
3820template <typename T>
3821struct tuple_of_aligned_storage;
3822
3823template <typename... Ts>
3824struct tuple_of_aligned_storage<sequence_tuple::tuple<Ts...>> {
3825 using type = sequence_tuple::tuple<internal_aligned_storage<sizeof(Ts),
3826#if defined(__GNUC__) && __GNUC__ < 8 && !defined(__x86_64__) && !defined(__CYGWIN__)
3827 // Before GCC-8 the `alignof` was returning the optimal alignment rather than the minimal one.
3828 // We have to adjust the alignment because otherwise we get the wrong offset.
3829 (alignof(Ts) > 4 ? 4 : alignof(Ts))
3830#else
3831 alignof(Ts)
3832#endif
3833 >...>;
3834};
3835
3836// Note: If pfr has a typelist also, could also have an overload for that here
3837
3838template <typename T>
3839using tuple_of_aligned_storage_t = typename tuple_of_aligned_storage<T>::type;
3840
3841/***
3842 * Given a structure type and its sequence of members, we want to build a function
3843 * object "getter" that implements a version of `std::get` using offset arithmetic
3844 * and reinterpret_cast.
3845 *
3846 * typename U should be a user-defined struct
3847 * typename S should be a sequence_tuple which is layout compatible with U
3848 */
3849
3850template <typename U, typename S>
3851class offset_based_getter {
3852 using this_t = offset_based_getter<U, S>;
3853
3854 static_assert(sizeof(U) == sizeof(S), "====================> Boost.PFR: Member sequence does not indicate correct size for struct type! Maybe the user-provided type is not a SimpleAggregate?");
3855 static_assert(alignof(U) == alignof(S), "====================> Boost.PFR: Member sequence does not indicate correct alignment for struct type!");
3856
3857 static_assert(!std::is_const<U>::value, "====================> Boost.PFR: const should be stripped from user-defined type when using offset_based_getter or overload resolution will be ambiguous later, this indicates an error within pfr");
3858 static_assert(!std::is_reference<U>::value, "====================> Boost.PFR: reference should be stripped from user-defined type when using offset_based_getter or overload resolution will be ambiguous later, this indicates an error within pfr");
3859 static_assert(!std::is_volatile<U>::value, "====================> Boost.PFR: volatile should be stripped from user-defined type when using offset_based_getter or overload resolution will be ambiguous later. this indicates an error within pfr");
3860
3861 // Get type of idx'th member
3862 template <std::size_t idx>
3863 using index_t = typename sequence_tuple::tuple_element<idx, S>::type;
3864
3865 // Get offset of idx'th member
3866 // Idea: Layout object has the same offsets as instance of S, so if S and U are layout compatible, then these offset
3867 // calculations are correct.
3868 template <std::size_t idx>
3869 static constexpr std::ptrdiff_t offset() noexcept {
3870 constexpr tuple_of_aligned_storage_t<S> layout{};
3871 return &sequence_tuple::get<idx>(layout).storage_[0] - &sequence_tuple::get<0>(layout).storage_[0];
3872 }
3873
3874 // Encapsulates offset arithmetic and reinterpret_cast
3875 template <std::size_t idx>
3876 static index_t<idx> * get_pointer(U * u) noexcept {
3877 return reinterpret_cast<index_t<idx> *>(reinterpret_cast<char *>(u) + this_t::offset<idx>());
3878 }
3879
3880 template <std::size_t idx>
3881 static const index_t<idx> * get_pointer(const U * u) noexcept {
3882 return reinterpret_cast<const index_t<idx> *>(reinterpret_cast<const char *>(u) + this_t::offset<idx>());
3883 }
3884
3885 template <std::size_t idx>
3886 static volatile index_t<idx> * get_pointer(volatile U * u) noexcept {
3887 return reinterpret_cast<volatile index_t<idx> *>(reinterpret_cast<volatile char *>(u) + this_t::offset<idx>());
3888 }
3889
3890 template <std::size_t idx>
3891 static const volatile index_t<idx> * get_pointer(const volatile U * u) noexcept {
3892 return reinterpret_cast<const volatile index_t<idx> *>(reinterpret_cast<const volatile char *>(u) + this_t::offset<idx>());
3893 }
3894
3895public:
3896 template <std::size_t idx>
3897 index_t<idx> & get(U & u, size_t_<idx>) const noexcept {
3898 return *this_t::get_pointer<idx>(std::addressof(u));
3899 }
3900
3901 template <std::size_t idx>
3902 index_t<idx> const & get(U const & u, size_t_<idx>) const noexcept {
3903 return *this_t::get_pointer<idx>(std::addressof(u));
3904 }
3905
3906 template <std::size_t idx>
3907 index_t<idx> volatile & get(U volatile & u, size_t_<idx>) const noexcept {
3908 return *this_t::get_pointer<idx>(std::addressof(u));
3909 }
3910
3911 template <std::size_t idx>
3912 index_t<idx> const volatile & get(U const volatile & u, size_t_<idx>) const noexcept {
3913 return *this_t::get_pointer<idx>(std::addressof(u));
3914 }
3915
3916 // rvalues must not be used here, to avoid template instantiation bloats.
3917 template <std::size_t idx>
3918 index_t<idx> && get(rvalue_t<U> u, size_t_<idx>) const = delete;
3919};
3920
3921
3922}}} // namespace boost::pfr::detail
3923
3924#endif // BOOST_PFR_DETAIL_OFFSET_LIST_HPP
3925// Copyright (c) 2016-2023 Antony Polukhin
3926//
3927// Distributed under the Boost Software License, Version 1.0. (See accompanying
3928// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
3929
3930#ifndef BOOST_PFR_DETAIL_MAKE_FLAT_TUPLE_OF_REFERENCES_HPP
3931#define BOOST_PFR_DETAIL_MAKE_FLAT_TUPLE_OF_REFERENCES_HPP
3932
3933
3934#include <utility> // metaprogramming stuff
3935
3936
3937namespace boost { namespace pfr { namespace detail {
3938
3939template <std::size_t Index>
3940using size_t_ = std::integral_constant<std::size_t, Index >;
3941
3942// Helper: Make a "getter" object corresponding to built-in tuple::get
3943// For user-defined structures, the getter should be "offset_based_getter"
3944struct sequence_tuple_getter {
3945 template <std::size_t idx, typename TupleOfReferences>
3946 decltype(auto) get(TupleOfReferences&& t, size_t_<idx>) const noexcept {
3947 return sequence_tuple::get<idx>(std::forward<TupleOfReferences>(t));
3948 }
3949};
3950
3951
3952template <class TupleOrUserType, class Getter, std::size_t Begin, std::size_t Size>
3953constexpr auto make_flat_tuple_of_references(TupleOrUserType&, const Getter&, size_t_<Begin>, size_t_<Size>) noexcept;
3954
3955template <class TupleOrUserType, class Getter, std::size_t Begin>
3956constexpr sequence_tuple::tuple<> make_flat_tuple_of_references(TupleOrUserType&, const Getter&, size_t_<Begin>, size_t_<0>) noexcept;
3957
3958template <class TupleOrUserType, class Getter, std::size_t Begin>
3959constexpr auto make_flat_tuple_of_references(TupleOrUserType&, const Getter&, size_t_<Begin>, size_t_<1>) noexcept;
3960
3961template <class... T>
3962constexpr auto tie_as_tuple_with_references(T&... args) noexcept {
3963 return sequence_tuple::tuple<T&...>{ args... };
3964}
3965
3966template <class... T>
3967constexpr decltype(auto) tie_as_tuple_with_references(detail::sequence_tuple::tuple<T...>& t) noexcept {
3968 return detail::make_flat_tuple_of_references(t, sequence_tuple_getter{}, size_t_<0>{}, size_t_<sequence_tuple::tuple<T...>::size_v>{});
3969}
3970
3971template <class... T>
3972constexpr decltype(auto) tie_as_tuple_with_references(const detail::sequence_tuple::tuple<T...>& t) noexcept {
3973 return detail::make_flat_tuple_of_references(t, sequence_tuple_getter{}, size_t_<0>{}, size_t_<sequence_tuple::tuple<T...>::size_v>{});
3974}
3975
3976template <class Tuple1, std::size_t... I1, class Tuple2, std::size_t... I2>
3977constexpr auto my_tuple_cat_impl(const Tuple1& t1, std::index_sequence<I1...>, const Tuple2& t2, std::index_sequence<I2...>) noexcept {
3978 return detail::tie_as_tuple_with_references(
3979 sequence_tuple::get<I1>(t1)...,
3980 sequence_tuple::get<I2>(t2)...
3981 );
3982}
3983
3984template <class Tuple1, class Tuple2>
3985constexpr auto my_tuple_cat(const Tuple1& t1, const Tuple2& t2) noexcept {
3986 return detail::my_tuple_cat_impl(
3987 t1, detail::make_index_sequence< Tuple1::size_v >{},
3988 t2, detail::make_index_sequence< Tuple2::size_v >{}
3989 );
3990}
3991
3992template <class TupleOrUserType, class Getter, std::size_t Begin, std::size_t Size>
3993constexpr auto make_flat_tuple_of_references(TupleOrUserType& t, const Getter& g, size_t_<Begin>, size_t_<Size>) noexcept {
3994 constexpr std::size_t next_size = Size / 2;
3995 return detail::my_tuple_cat(
3996 detail::make_flat_tuple_of_references(t, g, size_t_<Begin>{}, size_t_<next_size>{}),
3997 detail::make_flat_tuple_of_references(t, g, size_t_<Begin + Size / 2>{}, size_t_<Size - next_size>{})
3998 );
3999}
4000
4001template <class TupleOrUserType, class Getter, std::size_t Begin>
4002constexpr sequence_tuple::tuple<> make_flat_tuple_of_references(TupleOrUserType&, const Getter&, size_t_<Begin>, size_t_<0>) noexcept {
4003 return {};
4004}
4005
4006template <class TupleOrUserType, class Getter, std::size_t Begin>
4007constexpr auto make_flat_tuple_of_references(TupleOrUserType& t, const Getter& g, size_t_<Begin>, size_t_<1>) noexcept {
4008 return detail::tie_as_tuple_with_references(
4009 g.get(t, size_t_<Begin>{})
4010 );
4011}
4012
4013}}} // namespace boost::pfr::detail
4014
4015#endif // BOOST_PFR_DETAIL_MAKE_FLAT_TUPLE_OF_REFERENCES_HPP
4016
4017
4018#ifdef __clang__
4019# pragma clang diagnostic push
4020# pragma clang diagnostic ignored "-Wmissing-braces"
4021# pragma clang diagnostic ignored "-Wundefined-inline"
4022# pragma clang diagnostic ignored "-Wundefined-internal"
4023# pragma clang diagnostic ignored "-Wmissing-field-initializers"
4024#elif defined(__GNUC__)
4025# pragma GCC diagnostic push
4026# pragma GCC diagnostic ignored "-Wnon-template-friend"
4027#endif
4028
4029
4030namespace boost { namespace pfr { namespace detail {
4031
4032// tag<T,N> generates friend declarations and helps with overload resolution.
4033// There are two types: one with the auto return type, which is the way we read types later.
4034// The second one is used in the detection of instantiations without which we'd get multiple
4035// definitions.
4036
4037template <class T, std::size_t N>
4038struct tag {
4039 friend auto loophole(tag<T,N>);
4040};
4041
4042// The definitions of friend functions.
4043template <class T, class U, std::size_t N, bool B>
4044struct fn_def_lref {
4045 friend auto loophole(tag<T,N>) {
4046 // Standard Library containers do not SFINAE on invalid copy constructor. Because of that std::vector<std::unique_ptr<int>> reports that it is copyable,
4047 // which leads to an instantiation error at this place.
4048 //
4049 // To workaround the issue, we check that the type U is movable, and move it in that case.
4050 using no_extents_t = std::remove_all_extents_t<U>;
4051 return static_cast< std::conditional_t<std::is_move_constructible<no_extents_t>::value, no_extents_t&&, no_extents_t&> >(
4052 boost::pfr::detail::unsafe_declval<no_extents_t&>()
4053 );
4054 }
4055};
4056template <class T, class U, std::size_t N, bool B>
4057struct fn_def_rref {
4058 friend auto loophole(tag<T,N>) { return std::move(boost::pfr::detail::unsafe_declval< std::remove_all_extents_t<U>& >()); }
4059};
4060
4061
4062// Those specializations are to avoid multiple definition errors.
4063template <class T, class U, std::size_t N>
4064struct fn_def_lref<T, U, N, true> {};
4065
4066template <class T, class U, std::size_t N>
4067struct fn_def_rref<T, U, N, true> {};
4068
4069
4070// This has a templated conversion operator which in turn triggers instantiations.
4071// Important point, using sizeof seems to be more reliable. Also default template
4072// arguments are "cached" (I think). To fix that I provide a U template parameter to
4073// the ins functions which do the detection using constexpr friend functions and SFINAE.
4074template <class T, std::size_t N>
4075struct loophole_ubiq_lref {
4076 template<class U, std::size_t M> static std::size_t ins(...);
4077 template<class U, std::size_t M, std::size_t = sizeof(loophole(tag<T,M>{})) > static char ins(int);
4078
4079 template<class U, std::size_t = sizeof(fn_def_lref<T, U, N, sizeof(ins<U, N>(0)) == sizeof(char)>)>
4080 constexpr operator U&() const&& noexcept; // `const&&` here helps to avoid ambiguity in loophole instantiations. optional_like test validate that behavior.
4081};
4082
4083template <class T, std::size_t N>
4084struct loophole_ubiq_rref {
4085 template<class U, std::size_t M> static std::size_t ins(...);
4086 template<class U, std::size_t M, std::size_t = sizeof(loophole(tag<T,M>{})) > static char ins(int);
4087
4088 template<class U, std::size_t = sizeof(fn_def_rref<T, U, N, sizeof(ins<U, N>(0)) == sizeof(char)>)>
4089 constexpr operator U&&() const&& noexcept; // `const&&` here helps to avoid ambiguity in loophole instantiations. optional_like test validate that behavior.
4090};
4091
4092
4093// This is a helper to turn a data structure into a tuple.
4094template <class T, class U>
4095struct loophole_type_list_lref;
4096
4097template <typename T, std::size_t... I>
4098struct loophole_type_list_lref< T, std::index_sequence<I...> >
4099 // Instantiating loopholes:
4100 : sequence_tuple::tuple< decltype(T{ loophole_ubiq_lref<T, I>{}... }, 0) >
4101{
4102 using type = sequence_tuple::tuple< decltype(loophole(tag<T, I>{}))... >;
4103};
4104
4105
4106template <class T, class U>
4107struct loophole_type_list_rref;
4108
4109template <typename T, std::size_t... I>
4110struct loophole_type_list_rref< T, std::index_sequence<I...> >
4111 // Instantiating loopholes:
4112 : sequence_tuple::tuple< decltype(T{ loophole_ubiq_rref<T, I>{}... }, 0) >
4113{
4114 using type = sequence_tuple::tuple< decltype(loophole(tag<T, I>{}))... >;
4115};
4116
4117
4118// Lazily returns loophole_type_list_{lr}ref.
4119template <bool IsCopyConstructible /*= true*/, class T, class U>
4120struct loophole_type_list_selector {
4121 using type = loophole_type_list_lref<T, U>;
4122};
4123
4124template <class T, class U>
4125struct loophole_type_list_selector<false /*IsCopyConstructible*/, T, U> {
4126 using type = loophole_type_list_rref<T, U>;
4127};
4128
4129template <class T>
4130auto tie_as_tuple_loophole_impl(T& lvalue) noexcept {
4131 using type = std::remove_cv_t<std::remove_reference_t<T>>;
4132 using indexes = detail::make_index_sequence<fields_count<type>()>;
4133 using loophole_type_list = typename detail::loophole_type_list_selector<
4134 std::is_copy_constructible<std::remove_all_extents_t<type>>::value, type, indexes
4135 >::type;
4136 using tuple_type = typename loophole_type_list::type;
4137
4138 return boost::pfr::detail::make_flat_tuple_of_references(
4139 lvalue,
4140 offset_based_getter<type, tuple_type>{},
4141 size_t_<0>{},
4142 size_t_<tuple_type::size_v>{}
4143 );
4144}
4145
4146template <class T>
4147auto tie_as_tuple(T& val) noexcept {
4148 static_assert(
4149 !std::is_union<T>::value,
4150 "====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
4151 );
4152 return boost::pfr::detail::tie_as_tuple_loophole_impl(
4153 val
4154 );
4155}
4156
4157template <class T, class F, std::size_t... I>
4158void for_each_field_dispatcher(T& t, F&& f, std::index_sequence<I...>) {
4159 static_assert(
4160 !std::is_union<T>::value,
4161 "====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
4162 );
4163 std::forward<F>(f)(
4164 boost::pfr::detail::tie_as_tuple_loophole_impl(t)
4165 );
4166}
4167
4168}}} // namespace boost::pfr::detail
4169
4170
4171#ifdef __clang__
4172# pragma clang diagnostic pop
4173#elif defined(__GNUC__)
4174# pragma GCC diagnostic pop
4175#endif
4176
4177
4178#endif // BOOST_PFR_DETAIL_CORE14_LOOPHOLE_HPP
4179
4180#else
4181// Copyright (c) 2016-2023 Antony Polukhin
4182//
4183// Distributed under the Boost Software License, Version 1.0. (See accompanying
4184// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4185
4186#ifndef BOOST_PFR_DETAIL_CORE14_CLASSIC_HPP
4187#define BOOST_PFR_DETAIL_CORE14_CLASSIC_HPP
4188
4189
4190#include <type_traits>
4191#include <utility> // metaprogramming stuff
4192
4193// Copyright (c) 2016-2023 Antony Polukhin
4194//
4195// Distributed under the Boost Software License, Version 1.0. (See accompanying
4196// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4197
4198#ifndef BOOST_PFR_DETAIL_SIZE_ARRAY_HPP
4199#define BOOST_PFR_DETAIL_SIZE_ARRAY_HPP
4200
4201
4202#include <cstddef> // metaprogramming stuff
4203
4204namespace boost { namespace pfr { namespace detail {
4205
4207template <std::size_t N>
4208struct size_array { // libc++ misses constexpr on operator[]
4209 typedef std::size_t type;
4210 std::size_t data[N];
4211
4212 static constexpr std::size_t size() noexcept { return N; }
4213
4214 constexpr std::size_t count_nonzeros() const noexcept {
4215 std::size_t count = 0;
4216 for (std::size_t i = 0; i < size(); ++i) {
4217 if (data[i]) {
4218 ++ count;
4219 }
4220 }
4221 return count;
4222 }
4223
4224 constexpr std::size_t count_from_opening_till_matching_parenthis_seq(std::size_t from, std::size_t opening_parenthis, std::size_t closing_parenthis) const noexcept {
4225 if (data[from] != opening_parenthis) {
4226 return 0;
4227 }
4228 std::size_t unclosed_parnthesis = 0;
4229 std::size_t count = 0;
4230 for (; ; ++from) {
4231 if (data[from] == opening_parenthis) {
4232 ++ unclosed_parnthesis;
4233 } else if (data[from] == closing_parenthis) {
4234 -- unclosed_parnthesis;
4235 }
4236 ++ count;
4237
4238 if (unclosed_parnthesis == 0) {
4239 return count;
4240 }
4241 }
4242
4243 return count;
4244 }
4245};
4246
4247template <>
4248struct size_array<0> { // libc++ misses constexpr on operator[]
4249 typedef std::size_t type;
4250 std::size_t data[1];
4251
4252 static constexpr std::size_t size() noexcept { return 0; }
4253
4254 constexpr std::size_t count_nonzeros() const noexcept {
4255 return 0;
4256 }
4257};
4258
4259template <std::size_t I, std::size_t N>
4260constexpr std::size_t get(const size_array<N>& a) noexcept {
4261 static_assert(I < N, "====================> Boost.PFR: Array index out of bounds");
4262 return a.data[I];
4263}
4264
4265
4266
4267}}} // namespace boost::pfr::detail
4268
4269#endif // BOOST_PFR_DETAIL_SIZE_ARRAY_HPP
4270
4271#ifdef __clang__
4272# pragma clang diagnostic push
4273# pragma clang diagnostic ignored "-Wmissing-braces"
4274# pragma clang diagnostic ignored "-Wundefined-inline"
4275# pragma clang diagnostic ignored "-Wundefined-internal"
4276# pragma clang diagnostic ignored "-Wmissing-field-initializers"
4277#endif
4278
4279namespace boost { namespace pfr { namespace detail {
4280
4282
4283template <class T> struct identity {
4284 typedef T type;
4285};
4286
4287template <class T>
4288constexpr T construct_helper() noexcept { // adding const here allows to deal with copyable only types
4289 return {};
4290}
4291
4292template <class T> constexpr size_array<sizeof(T) * 3> fields_count_and_type_ids_with_zeros() noexcept;
4293template <class T> constexpr auto flat_array_of_type_ids() noexcept;
4294
4296namespace typeid_conversions {
4297
4299
4300#ifdef _MSC_VER
4301# pragma warning( push )
4302 // '<<': check operator precedence for possible error; use parentheses to clarify precedence
4303# pragma warning( disable : 4554 )
4304#endif
4305
4306constexpr std::size_t native_types_mask = 31;
4307constexpr std::size_t bits_per_extension = 3;
4308constexpr std::size_t extension_mask = (
4309 static_cast<std::size_t>((1 << bits_per_extension) - 1)
4310 << static_cast<std::size_t>(sizeof(std::size_t) * 8 - bits_per_extension)
4311);
4312constexpr std::size_t native_ptr_type = (
4313 static_cast<std::size_t>(1)
4314 << static_cast<std::size_t>(sizeof(std::size_t) * 8 - bits_per_extension)
4315);
4316constexpr std::size_t native_const_ptr_type = (
4317 static_cast<std::size_t>(2)
4318 << static_cast<std::size_t>(sizeof(std::size_t) * 8 - bits_per_extension)
4319);
4320
4321constexpr std::size_t native_const_volatile_ptr_type = (
4322 static_cast<std::size_t>(3)
4323 << static_cast<std::size_t>(sizeof(std::size_t) * 8 - bits_per_extension)
4324);
4325
4326constexpr std::size_t native_volatile_ptr_type = (
4327 static_cast<std::size_t>(4)
4328 << static_cast<std::size_t>(sizeof(std::size_t) * 8 - bits_per_extension)
4329);
4330
4331constexpr std::size_t native_ref_type = (
4332 static_cast<std::size_t>(5)
4333 << static_cast<std::size_t>(sizeof(std::size_t) * 8 - bits_per_extension)
4334);
4335
4336template <std::size_t Index, std::size_t Extension>
4337using if_extension = std::enable_if_t< (Index & extension_mask) == Extension >*;
4338
4340template <std::size_t Unptr>
4341constexpr std::size_t type_to_id_extension_apply(std::size_t ext) noexcept {
4342 constexpr std::size_t native_id = (Unptr & native_types_mask);
4343 constexpr std::size_t extensions = (Unptr & ~native_types_mask);
4344 static_assert(
4345 !((extensions >> bits_per_extension) & native_types_mask),
4346 "====================> Boost.PFR: Too many extensions for a single field (something close to `int************************** p;` is in the POD type)."
4347 );
4348
4349 return (extensions >> bits_per_extension) | native_id | ext;
4350}
4351
4352template <std::size_t Index>
4353using remove_1_ext = size_t_<
4354 ((Index & ~native_types_mask) << bits_per_extension) | (Index & native_types_mask)
4355>;
4356
4357#ifdef _MSC_VER
4358# pragma warning( pop )
4359#endif
4360
4362
4363template <class Type> constexpr std::size_t type_to_id(identity<Type*>) noexcept;
4364template <class Type> constexpr std::size_t type_to_id(identity<const Type*>) noexcept;
4365template <class Type> constexpr std::size_t type_to_id(identity<const volatile Type*>) noexcept;
4366template <class Type> constexpr std::size_t type_to_id(identity<volatile Type*>) noexcept;
4367template <class Type> constexpr std::size_t type_to_id(identity<Type&>) noexcept;
4368template <class Type> constexpr std::size_t type_to_id(identity<Type>, std::enable_if_t<std::is_enum<Type>::value>* = nullptr) noexcept;
4369template <class Type> constexpr std::size_t type_to_id(identity<Type>, std::enable_if_t<std::is_empty<Type>::value>* = nullptr) noexcept;
4370template <class Type> constexpr std::size_t type_to_id(identity<Type>, std::enable_if_t<std::is_union<Type>::value>* = nullptr) noexcept;
4371template <class Type> constexpr size_array<sizeof(Type) * 3> type_to_id(identity<Type>, std::enable_if_t<!std::is_enum<Type>::value && !std::is_empty<Type>::value && !std::is_union<Type>::value>* = 0) noexcept;
4372
4373template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_const_ptr_type> = nullptr) noexcept;
4374template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_ptr_type> = nullptr) noexcept;
4375template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_const_volatile_ptr_type> = nullptr) noexcept;
4376template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_volatile_ptr_type> = nullptr) noexcept;
4377template <std::size_t Index> constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_ref_type> = nullptr) noexcept;
4378
4379
4382#define BOOST_MAGIC_GET_REGISTER_TYPE(Type, Index) \
4383 constexpr std::size_t type_to_id(identity<Type>) noexcept { \
4384 return Index; \
4385 } \
4386 constexpr Type id_to_type( size_t_<Index > ) noexcept { \
4387 return detail::construct_helper<Type>(); \
4388 } \
4389
4391
4392
4393// Register all base types here
4394BOOST_MAGIC_GET_REGISTER_TYPE(unsigned char , 1)
4395BOOST_MAGIC_GET_REGISTER_TYPE(unsigned short , 2)
4396BOOST_MAGIC_GET_REGISTER_TYPE(unsigned int , 3)
4397BOOST_MAGIC_GET_REGISTER_TYPE(unsigned long , 4)
4398BOOST_MAGIC_GET_REGISTER_TYPE(unsigned long long , 5)
4399BOOST_MAGIC_GET_REGISTER_TYPE(signed char , 6)
4400BOOST_MAGIC_GET_REGISTER_TYPE(short , 7)
4401BOOST_MAGIC_GET_REGISTER_TYPE(int , 8)
4402BOOST_MAGIC_GET_REGISTER_TYPE(long , 9)
4403BOOST_MAGIC_GET_REGISTER_TYPE(long long , 10)
4404BOOST_MAGIC_GET_REGISTER_TYPE(char , 11)
4405BOOST_MAGIC_GET_REGISTER_TYPE(wchar_t , 12)
4406BOOST_MAGIC_GET_REGISTER_TYPE(char16_t , 13)
4407BOOST_MAGIC_GET_REGISTER_TYPE(char32_t , 14)
4408BOOST_MAGIC_GET_REGISTER_TYPE(float , 15)
4409BOOST_MAGIC_GET_REGISTER_TYPE(double , 16)
4410BOOST_MAGIC_GET_REGISTER_TYPE(long double , 17)
4411BOOST_MAGIC_GET_REGISTER_TYPE(bool , 18)
4412BOOST_MAGIC_GET_REGISTER_TYPE(void* , 19)
4413BOOST_MAGIC_GET_REGISTER_TYPE(const void* , 20)
4414BOOST_MAGIC_GET_REGISTER_TYPE(volatile void* , 21)
4415BOOST_MAGIC_GET_REGISTER_TYPE(const volatile void* , 22)
4416BOOST_MAGIC_GET_REGISTER_TYPE(std::nullptr_t , 23)
4417constexpr std::size_t tuple_begin_tag = 24;
4418constexpr std::size_t tuple_end_tag = 25;
4419
4420#undef BOOST_MAGIC_GET_REGISTER_TYPE
4421
4423template <class Type>
4424constexpr std::size_t type_to_id(identity<Type*>) noexcept {
4425 constexpr auto unptr = typeid_conversions::type_to_id(identity<Type>{});
4426 static_assert(
4427 std::is_same<const std::size_t, decltype(unptr)>::value,
4428 "====================> Boost.PFR: Pointers to user defined types are not supported."
4429 );
4430 return typeid_conversions::type_to_id_extension_apply<unptr>(native_ptr_type);
4431}
4432
4433template <class Type>
4434constexpr std::size_t type_to_id(identity<const Type*>) noexcept {
4435 constexpr auto unptr = typeid_conversions::type_to_id(identity<Type>{});
4436 static_assert(
4437 std::is_same<const std::size_t, decltype(unptr)>::value,
4438 "====================> Boost.PFR: Const pointers to user defined types are not supported."
4439 );
4440 return typeid_conversions::type_to_id_extension_apply<unptr>(native_const_ptr_type);
4441}
4442
4443template <class Type>
4444constexpr std::size_t type_to_id(identity<const volatile Type*>) noexcept {
4445 constexpr auto unptr = typeid_conversions::type_to_id(identity<Type>{});
4446 static_assert(
4447 std::is_same<const std::size_t, decltype(unptr)>::value,
4448 "====================> Boost.PFR: Const volatile pointers to user defined types are not supported."
4449 );
4450 return typeid_conversions::type_to_id_extension_apply<unptr>(native_const_volatile_ptr_type);
4451}
4452
4453template <class Type>
4454constexpr std::size_t type_to_id(identity<volatile Type*>) noexcept {
4455 constexpr auto unptr = typeid_conversions::type_to_id(identity<Type>{});
4456 static_assert(
4457 std::is_same<const std::size_t, decltype(unptr)>::value,
4458 "====================> Boost.PFR: Volatile pointers to user defined types are not supported."
4459 );
4460 return typeid_conversions::type_to_id_extension_apply<unptr>(native_volatile_ptr_type);
4461}
4462
4463template <class Type>
4464constexpr std::size_t type_to_id(identity<Type&>) noexcept {
4465 constexpr auto unptr = typeid_conversions::type_to_id(identity<Type>{});
4466 static_assert(
4467 std::is_same<const std::size_t, decltype(unptr)>::value,
4468 "====================> Boost.PFR: References to user defined types are not supported."
4469 );
4470 return typeid_conversions::type_to_id_extension_apply<unptr>(native_ref_type);
4471}
4472
4473template <class Type>
4474constexpr std::size_t type_to_id(identity<Type>, std::enable_if_t<std::is_enum<Type>::value>*) noexcept {
4475 return typeid_conversions::type_to_id(identity<typename std::underlying_type<Type>::type >{});
4476}
4477
4478template <class Type>
4479constexpr std::size_t type_to_id(identity<Type>, std::enable_if_t<std::is_empty<Type>::value>*) noexcept {
4480 static_assert(!std::is_empty<Type>::value, "====================> Boost.PFR: Empty classes/structures as members are not supported.");
4481 return 0;
4482}
4483
4484template <class Type>
4485constexpr std::size_t type_to_id(identity<Type>, std::enable_if_t<std::is_union<Type>::value>*) noexcept {
4486 static_assert(
4487 !std::is_union<Type>::value,
4488 "====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
4489 );
4490 return 0;
4491}
4492
4493template <class Type>
4494constexpr size_array<sizeof(Type) * 3> type_to_id(identity<Type>, std::enable_if_t<!std::is_enum<Type>::value && !std::is_empty<Type>::value && !std::is_union<Type>::value>*) noexcept {
4495 constexpr auto t = detail::flat_array_of_type_ids<Type>();
4496 size_array<sizeof(Type) * 3> result {{tuple_begin_tag}};
4497 constexpr bool requires_tuplening = (
4498 (t.count_nonzeros() != 1) || (t.count_nonzeros() == t.count_from_opening_till_matching_parenthis_seq(0, tuple_begin_tag, tuple_end_tag))
4499 );
4500
4501 if (requires_tuplening) {
4502 for (std::size_t i = 0; i < t.size(); ++i)
4503 result.data[i + 1] = t.data[i];
4504 result.data[result.size() - 1] = tuple_end_tag;
4505 } else {
4506 for (std::size_t i = 0; i < t.size(); ++i)
4507 result.data[i] = t.data[i];
4508 }
4509 return result;
4510}
4511
4512
4513
4514template <std::size_t Index>
4515constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_ptr_type>) noexcept {
4516 typedef decltype( typeid_conversions::id_to_type(remove_1_ext<Index>()) )* res_t;
4517 return detail::construct_helper<res_t>();
4518}
4519
4520template <std::size_t Index>
4521constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_const_ptr_type>) noexcept {
4522 typedef const decltype( typeid_conversions::id_to_type(remove_1_ext<Index>()) )* res_t;
4523 return detail::construct_helper<res_t>();
4524}
4525
4526template <std::size_t Index>
4527constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_const_volatile_ptr_type>) noexcept {
4528 typedef const volatile decltype( typeid_conversions::id_to_type(remove_1_ext<Index>()) )* res_t;
4529 return detail::construct_helper<res_t>();
4530}
4531
4532
4533template <std::size_t Index>
4534constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_volatile_ptr_type>) noexcept {
4535 typedef volatile decltype( typeid_conversions::id_to_type(remove_1_ext<Index>()) )* res_t;
4536 return detail::construct_helper<res_t>();
4537}
4538
4539
4540template <std::size_t Index>
4541constexpr auto id_to_type(size_t_<Index >, if_extension<Index, native_ref_type>) noexcept {
4542 static_assert(!Index, "====================> Boost.PFR: References are not supported");
4543 return nullptr;
4544}
4545
4546} // namespace typeid_conversions
4547
4549struct ubiq_val {
4550 std::size_t* ref_;
4551
4552 template <class T>
4553 constexpr void assign(const T& typeids) const noexcept {
4554 for (std::size_t i = 0; i < T::size(); ++i)
4555 ref_[i] = typeids.data[i];
4556 }
4557
4558 constexpr void assign(std::size_t val) const noexcept {
4559 ref_[0] = val;
4560 }
4561
4562 template <class Type>
4563 constexpr operator Type() const noexcept {
4564 constexpr auto typeids = typeid_conversions::type_to_id(identity<Type>{});
4565 assign(typeids);
4566 return detail::construct_helper<Type>();
4567 }
4568};
4569
4571struct ubiq_sizes {
4572 std::size_t& ref_;
4573
4574 template <class Type>
4575 constexpr operator Type() const noexcept {
4576 ref_ = sizeof(Type);
4577 return detail::construct_helper<Type>();
4578 }
4579};
4580
4582template <class T, std::size_t N, std::size_t... I>
4583constexpr size_array<N> get_type_offsets() noexcept {
4584 typedef size_array<N> array_t;
4585 array_t sizes{};
4586 T tmp{ ubiq_sizes{sizes.data[I]}... };
4587 (void)tmp;
4588
4589 array_t offsets{{0}};
4590 for (std::size_t i = 1; i < N; ++i)
4591 offsets.data[i] = offsets.data[i - 1] + sizes.data[i - 1];
4592
4593 return offsets;
4594}
4595
4597template <class T, std::size_t N, std::size_t... I>
4598constexpr void* flat_type_to_array_of_type_ids(std::size_t* types, std::index_sequence<I...>) noexcept
4599{
4600 static_assert(
4601 N <= sizeof(T),
4602 "====================> Boost.PFR: Bit fields are not supported."
4603 );
4604
4605 constexpr auto offsets = detail::get_type_offsets<T, N, I...>();
4606 T tmp{ ubiq_val{types + get<I>(offsets) * 3}... };
4607 (void)types;
4608 (void)tmp;
4609 (void)offsets; // If type is empty offsets are not used
4610 return nullptr;
4611}
4612
4614template <class T>
4615constexpr size_array<sizeof(T) * 3> fields_count_and_type_ids_with_zeros() noexcept {
4616 size_array<sizeof(T) * 3> types{};
4617 constexpr std::size_t N = detail::fields_count<T>();
4618 detail::flat_type_to_array_of_type_ids<T, N>(types.data, detail::make_index_sequence<N>());
4619 return types;
4620}
4621
4623template <class T>
4624constexpr auto flat_array_of_type_ids() noexcept {
4625 constexpr auto types = detail::fields_count_and_type_ids_with_zeros<T>();
4626 constexpr std::size_t count = types.count_nonzeros();
4627 size_array<count> res{};
4628 std::size_t j = 0;
4629 for (std::size_t i = 0; i < decltype(types)::size(); ++i) {
4630 if (types.data[i]) {
4631 res.data[j] = types.data[i];
4632 ++ j;
4633 }
4634 }
4635
4636 return res;
4637}
4638
4640
4641template <class T, std::size_t First, std::size_t... I>
4642constexpr auto as_flat_tuple_impl(std::index_sequence<First, I...>) noexcept;
4643
4644template <class T>
4645constexpr sequence_tuple::tuple<> as_flat_tuple_impl(std::index_sequence<>) noexcept {
4646 return sequence_tuple::tuple<>{};
4647}
4648
4649template <std::size_t Increment, std::size_t... I>
4650constexpr auto increment_index_sequence(std::index_sequence<I...>) noexcept {
4651 return std::index_sequence<I + Increment...>{};
4652}
4653
4654template <class T, std::size_t V, std::size_t I, std::size_t SubtupleLength>
4655constexpr auto prepare_subtuples(size_t_<V>, size_t_<I>, size_t_<SubtupleLength>) noexcept {
4656 static_assert(SubtupleLength == 0, "====================> Boost.PFR: Internal error while representing nested field as tuple");
4657 return typeid_conversions::id_to_type(size_t_<V>{});
4658}
4659
4660template <class T, std::size_t I, std::size_t SubtupleLength>
4661constexpr auto prepare_subtuples(size_t_<typeid_conversions::tuple_end_tag>, size_t_<I>, size_t_<SubtupleLength>) noexcept {
4662 static_assert(sizeof(T) == 0, "====================> Boost.PFR: Internal error while representing nested field as tuple");
4663 return int{};
4664}
4665
4666template <class T, std::size_t I, std::size_t SubtupleLength>
4667constexpr auto prepare_subtuples(size_t_<typeid_conversions::tuple_begin_tag>, size_t_<I>, size_t_<SubtupleLength>) noexcept {
4668 static_assert(SubtupleLength > 2, "====================> Boost.PFR: Internal error while representing nested field as tuple");
4669 constexpr auto seq = detail::make_index_sequence<SubtupleLength - 2>{};
4670 return detail::as_flat_tuple_impl<T>( detail::increment_index_sequence<I + 1>(seq) );
4671}
4672
4673
4674template <class Array>
4675constexpr Array remove_subtuples(Array indexes_plus_1, const Array& subtuple_lengths) noexcept {
4676 for (std::size_t i = 0; i < subtuple_lengths.size(); ++i) {
4677 if (subtuple_lengths.data[i]) {
4678 const std::size_t skips_count = subtuple_lengths.data[i];
4679 for (std::size_t j = i + 1; j < skips_count + i; ++j) {
4680 indexes_plus_1.data[j] = 0;
4681 }
4682 i += skips_count - 1;
4683 }
4684 }
4685 return indexes_plus_1;
4686}
4687
4688template <std::size_t N, class Array>
4689constexpr size_array<N> resize_dropping_zeros_and_decrementing(size_t_<N>, const Array& a) noexcept {
4690 size_array<N> result{};
4691 std::size_t result_indx = 0;
4692 for (std::size_t i = 0; i < a.size(); ++i) {
4693 if (a.data[i]) {
4694 result.data[result_indx] = static_cast<std::size_t>(a.data[i] - 1);
4695 ++ result_indx;
4696 }
4697 }
4698
4699 return result;
4700}
4701
4702template <class T, std::size_t First, std::size_t... I, std::size_t... INew>
4703constexpr auto as_flat_tuple_impl_drop_helpers(std::index_sequence<First, I...>, std::index_sequence<INew...>) noexcept {
4704 constexpr auto a = detail::flat_array_of_type_ids<T>();
4705
4706 constexpr size_array<sizeof...(I) + 1> subtuples_length {{
4707 a.count_from_opening_till_matching_parenthis_seq(First, typeid_conversions::tuple_begin_tag, typeid_conversions::tuple_end_tag),
4708 a.count_from_opening_till_matching_parenthis_seq(I, typeid_conversions::tuple_begin_tag, typeid_conversions::tuple_end_tag)...
4709 }};
4710
4711 constexpr size_array<sizeof...(I) + 1> type_indexes_with_subtuple_internals {{ 1, 1 + I - First...}};
4712 constexpr auto type_indexes_plus_1_and_zeros_as_skips = detail::remove_subtuples(type_indexes_with_subtuple_internals, subtuples_length);
4713 constexpr auto new_size = size_t_<type_indexes_plus_1_and_zeros_as_skips.count_nonzeros()>{};
4714 constexpr auto type_indexes = detail::resize_dropping_zeros_and_decrementing(new_size, type_indexes_plus_1_and_zeros_as_skips);
4715
4716 typedef sequence_tuple::tuple<
4717 decltype(detail::prepare_subtuples<T>(
4718 size_t_< a.data[ First + type_indexes.data[INew] ] >{}, // id of type
4719 size_t_< First + type_indexes.data[INew] >{}, // index of current id in `a`
4720 size_t_< subtuples_length.data[ type_indexes.data[INew] ] >{} // if id of type is tuple, then length of that tuple
4721 ))...
4722 > subtuples_uncleanuped_t;
4723
4724 return subtuples_uncleanuped_t{};
4725}
4726
4727template <class Array>
4728constexpr std::size_t count_skips_in_array(std::size_t begin_index, std::size_t end_index, const Array& a) noexcept {
4729 std::size_t skips = 0;
4730 for (std::size_t i = begin_index; i < end_index; ++i) {
4731 if (a.data[i] == typeid_conversions::tuple_begin_tag) {
4732 const std::size_t this_tuple_size = a.count_from_opening_till_matching_parenthis_seq(i, typeid_conversions::tuple_begin_tag, typeid_conversions::tuple_end_tag) - 1;
4733 skips += this_tuple_size;
4734 i += this_tuple_size - 1;
4735 }
4736 }
4737
4738 return skips;
4739}
4740
4741template <class T, std::size_t First, std::size_t... I>
4742constexpr auto as_flat_tuple_impl(std::index_sequence<First, I...>) noexcept {
4743 constexpr auto a = detail::flat_array_of_type_ids<T>();
4744 constexpr std::size_t count_of_I = sizeof...(I);
4745
4746 return detail::as_flat_tuple_impl_drop_helpers<T>(
4747 std::index_sequence<First, I...>{},
4748 detail::make_index_sequence< 1 + count_of_I - count_skips_in_array(First, First + count_of_I, a) >{}
4749 );
4750}
4751
4752template <class T>
4753constexpr auto internal_tuple_with_same_alignment() noexcept {
4754 typedef typename std::remove_cv<T>::type type;
4755
4756 static_assert(
4757 std::is_trivial<type>::value && std::is_standard_layout<type>::value,
4758 "====================> Boost.PFR: Type can not be reflected without Loophole or C++17, because it's not POD"
4759 );
4760 static_assert(!std::is_reference<type>::value, "====================> Boost.PFR: Not applyable");
4761 constexpr auto res = detail::as_flat_tuple_impl<type>(
4762 detail::make_index_sequence< decltype(detail::flat_array_of_type_ids<type>())::size() >()
4763 );
4764
4765 return res;
4766}
4767
4768template <class T>
4769using internal_tuple_with_same_alignment_t = decltype( detail::internal_tuple_with_same_alignment<T>() );
4770
4771
4773struct ubiq_is_flat_refelectable {
4774 bool& is_flat_refelectable;
4775
4776 template <class Type>
4777 constexpr operator Type() const noexcept {
4778 is_flat_refelectable = std::is_fundamental<std::remove_pointer_t<Type>>::value;
4779 return {};
4780 }
4781};
4782
4783template <class T, std::size_t... I>
4784constexpr bool is_flat_refelectable(std::index_sequence<I...>) noexcept {
4785 constexpr std::size_t fields = sizeof...(I);
4786 bool result[fields] = {static_cast<bool>(I)...};
4787 const T v{ ubiq_is_flat_refelectable{result[I]}... };
4788 (void)v;
4789
4790 for (std::size_t i = 0; i < fields; ++i) {
4791 if (!result[i]) {
4792 return false;
4793 }
4794 }
4795
4796 return true;
4797}
4798
4799template<class T>
4800constexpr bool is_flat_refelectable(std::index_sequence<>) noexcept {
4801 return true;
4802}
4803
4804template <class T>
4805auto tie_as_flat_tuple(T& lvalue) noexcept {
4806 static_assert(
4807 !std::is_union<T>::value,
4808 "====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
4809 );
4810 using type = std::remove_cv_t<T>;
4811 using tuple_type = internal_tuple_with_same_alignment_t<type>;
4812
4813 offset_based_getter<type, tuple_type> getter;
4814 return boost::pfr::detail::make_flat_tuple_of_references(lvalue, getter, size_t_<0>{}, size_t_<tuple_type::size_v>{});
4815}
4816
4817template <class T>
4818auto tie_as_tuple(T& val) noexcept {
4819 static_assert(
4820 !std::is_union<T>::value,
4821 "====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
4822 );
4823 static_assert(
4824 boost::pfr::detail::is_flat_refelectable<T>( detail::make_index_sequence<boost::pfr::detail::fields_count<T>()>{} ),
4825 "====================> Boost.PFR: Not possible in C++14 to represent that type without loosing information. Change type definition or enable C++17"
4826 );
4827 return boost::pfr::detail::tie_as_flat_tuple(val);
4828}
4829
4831
4833struct ubiq_constructor_constexpr_copy {
4834 std::size_t ignore;
4835
4836 template <class Type>
4837 constexpr operator Type() const noexcept {
4838 static_assert(
4839 std::is_trivially_destructible<Type>::value,
4840 "====================> Boost.PFR: One of the fields in the type passed to `for_each_field` has non trivial destructor."
4841 );
4842 return {};
4843 }
4844};
4845
4847
4848template <class T, std::size_t... I>
4849struct is_constexpr_aggregate_initializable {
4850 template<class T2, std::size_t... I2>
4851 static constexpr void* constexpr_aggregate_initializer() noexcept {
4852 T2 tmp{ ubiq_constructor_constexpr_copy{I2}... };
4853 (void)tmp;
4854 return nullptr;
4855 }
4856
4857 template <void* = constexpr_aggregate_initializer<T, I...>() >
4858 static std::true_type test(long) noexcept;
4859
4860 static std::false_type test(...) noexcept;
4861
4862 static constexpr bool value = decltype(test(0)){};
4863};
4864
4865
4866template <class T, class F, std::size_t I0, std::size_t... I, class... Fields>
4867void for_each_field_in_depth(T& t, F&& f, std::index_sequence<I0, I...>, identity<Fields>...);
4868
4869template <class T, class F, class... Fields>
4870void for_each_field_in_depth(T& t, F&& f, std::index_sequence<>, identity<Fields>...);
4871
4872template <class T, class F, class IndexSeq, class... Fields>
4873struct next_step {
4874 T& t;
4875 F& f;
4876
4877 template <class Field>
4878 operator Field() const {
4879 boost::pfr::detail::for_each_field_in_depth(
4880 t,
4881 std::forward<F>(f),
4882 IndexSeq{},
4883 identity<Fields>{}...,
4884 identity<Field>{}
4885 );
4886
4887 return {};
4888 }
4889};
4890
4891template <class T, class F, std::size_t I0, std::size_t... I, class... Fields>
4892void for_each_field_in_depth(T& t, F&& f, std::index_sequence<I0, I...>, identity<Fields>...) {
4893 (void)std::add_const_t<std::remove_reference_t<T>>{
4894 Fields{}...,
4895 next_step<T, F, std::index_sequence<I...>, Fields...>{t, f},
4896 ubiq_constructor_constexpr_copy{I}...
4897 };
4898}
4899
4900template <class T, class F, class... Fields>
4901void for_each_field_in_depth(T& lvalue, F&& f, std::index_sequence<>, identity<Fields>...) {
4902 using tuple_type = sequence_tuple::tuple<Fields...>;
4903
4904 offset_based_getter<std::remove_cv_t<std::remove_reference_t<T>>, tuple_type> getter;
4905 std::forward<F>(f)(
4906 boost::pfr::detail::make_flat_tuple_of_references(lvalue, getter, size_t_<0>{}, size_t_<sizeof...(Fields)>{})
4907 );
4908}
4909
4910template <class T, class F, std::size_t... I>
4911void for_each_field_dispatcher_1(T& t, F&& f, std::index_sequence<I...>, std::true_type /*is_flat_refelectable*/) {
4912 std::forward<F>(f)(
4913 boost::pfr::detail::tie_as_flat_tuple(t)
4914 );
4915}
4916
4917
4918template <class T, class F, std::size_t... I>
4919void for_each_field_dispatcher_1(T& t, F&& f, std::index_sequence<I...>, std::false_type /*is_flat_refelectable*/) {
4920 boost::pfr::detail::for_each_field_in_depth(
4921 t,
4922 std::forward<F>(f),
4923 std::index_sequence<I...>{}
4924 );
4925}
4926
4927template <class T, class F, std::size_t... I>
4928void for_each_field_dispatcher(T& t, F&& f, std::index_sequence<I...>) {
4929 static_assert(
4930 !std::is_union<T>::value,
4931 "====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
4932 );
4933 static_assert(is_constexpr_aggregate_initializable<T, I...>::value, "====================> Boost.PFR: T must be a constexpr initializable type");
4934
4935 constexpr bool is_flat_refelectable_val = detail::is_flat_refelectable<T>( std::index_sequence<I...>{} );
4936 detail::for_each_field_dispatcher_1(
4937 t,
4938 std::forward<F>(f),
4939 std::index_sequence<I...>{},
4940 std::integral_constant<bool, is_flat_refelectable_val>{}
4941 );
4942}
4943
4945
4946
4947#ifdef __clang__
4948# pragma clang diagnostic pop
4949#endif
4950
4951}}} // namespace boost::pfr::detail
4952
4953#endif // BOOST_PFR_DETAIL_CORE14_CLASSIC_HPP
4954#endif
4955
4956#endif // BOOST_PFR_DETAIL_CORE_HPP
4957
4958// Copyright (c) 2016-2023 Antony Polukhin
4959//
4960// Distributed under the Boost Software License, Version 1.0. (See accompanying
4961// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4962
4963#ifndef BOOST_PFR_DETAIL_STDTUPLE_HPP
4964#define BOOST_PFR_DETAIL_STDTUPLE_HPP
4965
4966
4967#include <utility> // metaprogramming stuff
4968#include <tuple>
4969
4970
4971namespace boost { namespace pfr { namespace detail {
4972
4973template <class T, std::size_t... I>
4974constexpr auto make_stdtuple_from_tietuple(const T& t, std::index_sequence<I...>) noexcept {
4975 return std::make_tuple(
4976 boost::pfr::detail::sequence_tuple::get<I>(t)...
4977 );
4978}
4979
4980template <class T, std::size_t... I>
4981constexpr auto make_stdtiedtuple_from_tietuple(const T& t, std::index_sequence<I...>) noexcept {
4982 return std::tie(
4983 boost::pfr::detail::sequence_tuple::get<I>(t)...
4984 );
4985}
4986
4987template <class T, std::size_t... I>
4988constexpr auto make_conststdtiedtuple_from_tietuple(const T& t, std::index_sequence<I...>) noexcept {
4989 return std::tuple<
4990 std::add_lvalue_reference_t<std::add_const_t<
4991 std::remove_reference_t<decltype(boost::pfr::detail::sequence_tuple::get<I>(t))>
4992 >>...
4993 >(
4994 boost::pfr::detail::sequence_tuple::get<I>(t)...
4995 );
4996}
4997
4998}}} // namespace boost::pfr::detail
4999
5000#endif // BOOST_PFR_DETAIL_STDTUPLE_HPP
5001// Copyright (c) 2018 Adam Butcher, Antony Polukhin
5002// Copyright (c) 2019-2023 Antony Polukhin
5003//
5004// Distributed under the Boost Software License, Version 1.0. (See accompanying
5005// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5006
5007#ifndef BOOST_PFR_DETAIL_TIE_FROM_STRUCTURE_TUPLE_HPP
5008#define BOOST_PFR_DETAIL_TIE_FROM_STRUCTURE_TUPLE_HPP
5009
5010
5011
5012// Copyright (c) 2016-2023 Antony Polukhin
5013//
5014// Distributed under the Boost Software License, Version 1.0. (See accompanying
5015// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5016
5017
5018#ifndef BOOST_PFR_TUPLE_SIZE_HPP
5019#define BOOST_PFR_TUPLE_SIZE_HPP
5020
5021
5022#include <type_traits>
5023#include <utility> // metaprogramming stuff
5024
5025
5030namespace boost { namespace pfr {
5031
5039template <class T>
5040using tuple_size = detail::size_t_< boost::pfr::detail::fields_count<T>() >;
5041
5042
5050template <class T>
5051constexpr std::size_t tuple_size_v = tuple_size<T>::value;
5052
5053}} // namespace boost::pfr
5054
5055#endif // BOOST_PFR_TUPLE_SIZE_HPP
5056
5057#include <tuple>
5058
5059namespace boost { namespace pfr { namespace detail {
5060
5065template <typename... Elements>
5066struct tie_from_structure_tuple : std::tuple<Elements&...> {
5067 using base = std::tuple<Elements&...>;
5068 using base::base;
5069
5070 template <typename T>
5071 constexpr tie_from_structure_tuple& operator= (T const& t) {
5072 base::operator=(
5073 detail::make_stdtiedtuple_from_tietuple(
5074 detail::tie_as_tuple(t),
5075 detail::make_index_sequence<tuple_size_v<T>>()));
5076 return *this;
5077 }
5078};
5079
5080}}} // namespace boost::pfr::detail
5081
5082#endif // BOOST_PFR_DETAIL_TIE_FROM_STRUCTURE_TUPLE_HPP
5083
5084#include <type_traits>
5085#include <utility> // metaprogramming stuff
5086
5087
5092
5093namespace boost { namespace pfr {
5094
5110template <std::size_t I, class T>
5111constexpr decltype(auto) get(const T& val) noexcept {
5112 return detail::sequence_tuple::get<I>( detail::tie_as_tuple(val) );
5113}
5114
5116template <std::size_t I, class T>
5117constexpr decltype(auto) get(T& val
5118#if !BOOST_PFR_USE_CPP17
5119 , std::enable_if_t<std::is_assignable<T, T>::value>* = nullptr
5120#endif
5121) noexcept {
5122 return detail::sequence_tuple::get<I>( detail::tie_as_tuple(val) );
5123}
5124
5125#if !BOOST_PFR_USE_CPP17
5127template <std::size_t I, class T>
5128constexpr auto get(T&, std::enable_if_t<!std::is_assignable<T, T>::value>* = nullptr) noexcept {
5129 static_assert(sizeof(T) && false, "====================> Boost.PFR: Calling boost::pfr::get on non const non assignable type is allowed only in C++17");
5130 return 0;
5131}
5132#endif
5133
5134
5136template <std::size_t I, class T>
5137constexpr auto get(T&& val, std::enable_if_t< std::is_rvalue_reference<T&&>::value>* = nullptr) noexcept {
5138 return std::move(detail::sequence_tuple::get<I>( detail::tie_as_tuple(val) ));
5139}
5140
5141
5143template <class U, class T>
5144constexpr const U& get(const T& val) noexcept {
5145 return detail::sequence_tuple::get_by_type_impl<const U&>( detail::tie_as_tuple(val) );
5146}
5147
5148
5150template <class U, class T>
5151constexpr U& get(T& val
5152#if !BOOST_PFR_USE_CPP17
5153 , std::enable_if_t<std::is_assignable<T, T>::value>* = nullptr
5154#endif
5155) noexcept {
5156 return detail::sequence_tuple::get_by_type_impl<U&>( detail::tie_as_tuple(val) );
5157}
5158
5159#if !BOOST_PFR_USE_CPP17
5161template <class U, class T>
5162constexpr U& get(T&, std::enable_if_t<!std::is_assignable<T, T>::value>* = nullptr) noexcept {
5163 static_assert(sizeof(T) && false, "====================> Boost.PFR: Calling boost::pfr::get on non const non assignable type is allowed only in C++17");
5164 return 0;
5165}
5166#endif
5167
5168
5170template <class U, class T>
5171constexpr U&& get(T&& val, std::enable_if_t< std::is_rvalue_reference<T&&>::value>* = nullptr) noexcept {
5172 return std::move(detail::sequence_tuple::get_by_type_impl<U&>( detail::tie_as_tuple(val) ));
5173}
5174
5175
5182template <std::size_t I, class T>
5183using tuple_element = detail::sequence_tuple::tuple_element<I, decltype( ::boost::pfr::detail::tie_as_tuple(std::declval<T&>()) ) >;
5184
5185
5192template <std::size_t I, class T>
5193using tuple_element_t = typename tuple_element<I, T>::type;
5194
5195
5205template <class T>
5206constexpr auto structure_to_tuple(const T& val) noexcept {
5207 return detail::make_stdtuple_from_tietuple(
5208 detail::tie_as_tuple(val),
5209 detail::make_index_sequence< tuple_size_v<T> >()
5210 );
5211}
5212
5213
5230template <class T>
5231constexpr auto structure_tie(const T& val) noexcept {
5232 return detail::make_conststdtiedtuple_from_tietuple(
5233 detail::tie_as_tuple(const_cast<T&>(val)),
5234 detail::make_index_sequence< tuple_size_v<T> >()
5235 );
5236}
5237
5238
5240template <class T>
5241constexpr auto structure_tie(T& val
5242#if !BOOST_PFR_USE_CPP17
5243 , std::enable_if_t<std::is_assignable<T, T>::value>* = nullptr
5244#endif
5245) noexcept {
5246 return detail::make_stdtiedtuple_from_tietuple(
5247 detail::tie_as_tuple(val),
5248 detail::make_index_sequence< tuple_size_v<T> >()
5249 );
5250}
5251
5252#if !BOOST_PFR_USE_CPP17
5254template <class T>
5255constexpr auto structure_tie(T&, std::enable_if_t<!std::is_assignable<T, T>::value>* = nullptr) noexcept {
5256 static_assert(sizeof(T) && false, "====================> Boost.PFR: Calling boost::pfr::structure_tie on non const non assignable type is allowed only in C++17");
5257 return 0;
5258}
5259#endif
5260
5261
5263template <class T>
5264constexpr auto structure_tie(T&&, std::enable_if_t< std::is_rvalue_reference<T&&>::value>* = nullptr) noexcept {
5265 static_assert(sizeof(T) && false, "====================> Boost.PFR: Calling boost::pfr::structure_tie on rvalue references is forbidden");
5266 return 0;
5267}
5268
5285template <class T, class F>
5286constexpr void for_each_field(T&& value, F&& func) {
5287 constexpr std::size_t fields_count_val = boost::pfr::detail::fields_count<std::remove_reference_t<T>>();
5288
5289 ::boost::pfr::detail::for_each_field_dispatcher(
5290 value,
5291 [f = std::forward<F>(func)](auto&& t) mutable {
5292 // MSVC related workaround. Its lambdas do not capture constexprs.
5293 constexpr std::size_t fields_count_val_in_lambda
5294 = boost::pfr::detail::fields_count<std::remove_reference_t<T>>();
5295
5296 ::boost::pfr::detail::for_each_field_impl(
5297 t,
5298 std::forward<F>(f),
5299 detail::make_index_sequence<fields_count_val_in_lambda>{},
5300 std::is_rvalue_reference<T&&>{}
5301 );
5302 },
5303 detail::make_index_sequence<fields_count_val>{}
5304 );
5305}
5306
5321template <typename... Elements>
5322constexpr detail::tie_from_structure_tuple<Elements...> tie_from_structure(Elements&... args) noexcept {
5323 return detail::tie_from_structure_tuple<Elements...>(args...);
5324}
5325
5326}} // namespace boost::pfr
5327
5328#endif // BOOST_PFR_CORE_HPP
5329// Copyright (c) 2023 Bela Schaum, X-Ryl669, Denis Mikhailov.
5330//
5331// Distributed under the Boost Software License, Version 1.0. (See accompanying
5332// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5333
5334
5335// Initial implementation by Bela Schaum, https://github.com/schaumb
5336// The way to make it union and UB free by X-Ryl669, https://github.com/X-Ryl669
5337//
5338
5339#ifndef BOOST_PFR_CORE_NAME_HPP
5340#define BOOST_PFR_CORE_NAME_HPP
5341
5342
5343// Copyright (c) 2023 Bela Schaum, X-Ryl669, Denis Mikhailov.
5344//
5345// Distributed under the Boost Software License, Version 1.0. (See accompanying
5346// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5347
5348
5349// Initial implementation by Bela Schaum, https://github.com/schaumb
5350// The way to make it union and UB free by X-Ryl669, https://github.com/X-Ryl669
5351//
5352
5353#ifndef BOOST_PFR_DETAIL_CORE_NAME_HPP
5354#define BOOST_PFR_DETAIL_CORE_NAME_HPP
5355
5356
5357// Each core_name provides `boost::pfr::detail::get_name` and
5358// `boost::pfr::detail::tie_as_names_tuple` functions.
5359//
5360// The whole functional of extracting field's names is build on top of those
5361// two functions.
5362#if BOOST_PFR_CORE_NAME_ENABLED
5363// Copyright (c) 2023 Bela Schaum, X-Ryl669, Denis Mikhailov.
5364//
5365// Distributed under the Boost Software License, Version 1.0. (See accompanying
5366// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5367
5368
5369// Initial implementation by Bela Schaum, https://github.com/schaumb
5370// The way to make it union and UB free by X-Ryl669, https://github.com/X-Ryl669
5371//
5372
5373#ifndef BOOST_PFR_DETAIL_CORE_NAME20_STATIC_HPP
5374#define BOOST_PFR_DETAIL_CORE_NAME20_STATIC_HPP
5375
5376// Copyright (c) 2023 Denis Mikhailov
5377//
5378// Distributed under the Boost Software License, Version 1.0. (See accompanying
5379// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5380
5381#ifndef BOOST_PFR_DETAIL_STDARRAY_HPP
5382#define BOOST_PFR_DETAIL_STDARRAY_HPP
5383
5384
5385#include <utility> // metaprogramming stuff
5386#include <array>
5387#include <type_traits> // for std::common_type_t
5388#include <cstddef>
5389
5390
5391namespace boost { namespace pfr { namespace detail {
5392
5393template <class... Types>
5394constexpr auto make_stdarray(const Types&... t) noexcept {
5395 return std::array<std::common_type_t<Types...>, sizeof...(Types)>{t...};
5396}
5397
5398template <class T, std::size_t... I>
5399constexpr auto make_stdarray_from_tietuple(const T& t, std::index_sequence<I...>, int) noexcept {
5400 return detail::make_stdarray(
5401 boost::pfr::detail::sequence_tuple::get<I>(t)...
5402 );
5403}
5404
5405template <class T>
5406constexpr auto make_stdarray_from_tietuple(const T&, std::index_sequence<>, long) noexcept {
5407 return std::array<std::nullptr_t, 0>{};
5408}
5409
5410}}} // namespace boost::pfr::detail
5411
5412#endif // BOOST_PFR_DETAIL_STDARRAY_HPP
5413
5414// Copyright (c) 2023 Bela Schaum, X-Ryl669, Denis Mikhailov.
5415//
5416// Distributed under the Boost Software License, Version 1.0. (See accompanying
5417// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5418
5419
5420// Initial implementation by Bela Schaum, https://github.com/schaumb
5421// The way to make it union and UB free by X-Ryl669, https://github.com/X-Ryl669
5422//
5423
5424#ifndef BOOST_PFR_DETAIL_FAKE_OBJECT_HPP
5425#define BOOST_PFR_DETAIL_FAKE_OBJECT_HPP
5426
5427
5428namespace boost { namespace pfr { namespace detail {
5429
5430template <class T>
5431extern const T fake_object;
5432
5433}}} // namespace boost::pfr::detail
5434
5435#endif // BOOST_PFR_DETAIL_FAKE_OBJECT_HPP
5436
5437#include <type_traits>
5438#include <string_view>
5439#include <array>
5440#include <memory> // for std::addressof
5441
5442namespace boost { namespace pfr { namespace detail {
5443
5444struct core_name_skip {
5445 std::size_t size_at_begin;
5446 std::size_t size_at_end;
5447 bool is_backward;
5448 std::string_view until_runtime;
5449
5450 consteval std::string_view apply(std::string_view sv) const noexcept {
5451 // We use std::min here to make the compiler diagnostic shorter and
5452 // cleaner in case of misconfigured BOOST_PFR_CORE_NAME_PARSING
5453 sv.remove_prefix((std::min)(size_at_begin, sv.size()));
5454 sv.remove_suffix((std::min)(size_at_end, sv.size()));
5455 if (until_runtime.empty()) {
5456 return sv;
5457 }
5458
5459 const auto found = is_backward ? sv.rfind(until_runtime)
5460 : sv.find(until_runtime);
5461
5462 const auto cut_until = found + until_runtime.size();
5463 const auto safe_cut_until = (std::min)(cut_until, sv.size());
5464 return sv.substr(safe_cut_until);
5465 }
5466};
5467
5468struct backward {
5469 explicit consteval backward(std::string_view value) noexcept
5470 : value(value)
5471 {}
5472
5473 std::string_view value;
5474};
5475
5476consteval core_name_skip make_core_name_skip(std::size_t size_at_begin,
5477 std::size_t size_at_end,
5478 std::string_view until_runtime) noexcept
5479{
5480 return core_name_skip{size_at_begin, size_at_end, false, until_runtime};
5481}
5482
5483consteval core_name_skip make_core_name_skip(std::size_t size_at_begin,
5484 std::size_t size_at_end,
5485 backward until_runtime) noexcept
5486{
5487 return core_name_skip{size_at_begin, size_at_end, true, until_runtime.value};
5488}
5489
5490// it might be compilation failed without this workaround sometimes
5491// See https://github.com/llvm/llvm-project/issues/41751 for details
5492template <class>
5493consteval std::string_view clang_workaround(std::string_view value) noexcept
5494{
5495 return value;
5496}
5497
5498template <class MsvcWorkaround, auto ptr>
5499consteval auto name_of_field_impl() noexcept {
5500 // Some of the following compiler specific macro may be defined only
5501 // inside the function body:
5502
5503#ifndef BOOST_PFR_FUNCTION_SIGNATURE
5504# if defined(__FUNCSIG__)
5505# define BOOST_PFR_FUNCTION_SIGNATURE __FUNCSIG__
5506# elif defined(__PRETTY_FUNCTION__) || defined(__GNUC__) || defined(__clang__)
5507# define BOOST_PFR_FUNCTION_SIGNATURE __PRETTY_FUNCTION__
5508# else
5509# define BOOST_PFR_FUNCTION_SIGNATURE ""
5510# endif
5511#endif
5512
5513 constexpr std::string_view sv = detail::clang_workaround<MsvcWorkaround>(BOOST_PFR_FUNCTION_SIGNATURE);
5514 static_assert(!sv.empty(),
5515 "====================> Boost.PFR: Field reflection parser configured in a wrong way. "
5516 "Please define the BOOST_PFR_FUNCTION_SIGNATURE to a compiler specific macro, "
5517 "that outputs the whole function signature including non-type template parameters."
5518 );
5519
5520 constexpr auto skip = detail::make_core_name_skip BOOST_PFR_CORE_NAME_PARSING;
5521 static_assert(skip.size_at_begin + skip.size_at_end + skip.until_runtime.size() < sv.size(),
5522 "====================> Boost.PFR: Field reflection parser configured in a wrong way. "
5523 "It attempts to skip more chars than available. "
5524 "Please define BOOST_PFR_CORE_NAME_PARSING to correct values. See documentation section "
5525 "'Limitations and Configuration' for more information."
5526 );
5527 constexpr auto fn = skip.apply(sv);
5528 static_assert(
5529 !fn.empty(),
5530 "====================> Boost.PFR: Extraction of field name is misconfigured for your compiler. "
5531 "It skipped all the input, leaving the field name empty. "
5532 "Please define BOOST_PFR_CORE_NAME_PARSING to correct values. See documentation section "
5533 "'Limitations and Configuration' for more information."
5534 );
5535 auto res = std::array<char, fn.size()+1>{};
5536
5537 auto* out = res.data();
5538 for (auto x: fn) {
5539 *out = x;
5540 ++out;
5541 }
5542
5543 return res;
5544}
5545
5546#ifdef __clang__
5547#pragma clang diagnostic push
5548#pragma clang diagnostic ignored "-Wundefined-var-template"
5549
5550// clang 16 and earlier don't support address of non-static member as template parameter
5551// but fortunately it's possible to use C++20 non-type template parameters in another way
5552// even in clang 16 and more older clangs
5553// all we need is to wrap pointer into 'clang_wrapper_t' and then pass it into template
5554template <class T>
5555struct clang_wrapper_t {
5556 T v;
5557};
5558template <class T>
5559clang_wrapper_t(T) -> clang_wrapper_t<T>;
5560
5561template <class T>
5562constexpr auto make_clang_wrapper(const T& arg) noexcept {
5563 return clang_wrapper_t{arg};
5564}
5565
5566#else
5567
5568template <class T>
5569constexpr const T& make_clang_wrapper(const T& arg) noexcept {
5570 // It's everything OK with address of non-static member as template parameter support on this compiler
5571 // so we don't need a wrapper here, just pass the pointer into template
5572 return arg;
5573}
5574
5575#endif
5576
5577template <class MsvcWorkaround, auto ptr>
5578consteval auto name_of_field() noexcept {
5579 // Sanity check: known field name must match the deduced one
5580 static_assert(
5581 sizeof(MsvcWorkaround) // do not trigger if `name_of_field()` is not used
5582 && std::string_view{
5583 detail::name_of_field_impl<
5584 core_name_skip, detail::make_clang_wrapper(std::addressof(
5585 fake_object<core_name_skip>.size_at_begin
5586 ))
5587 >().data()
5588 } == "size_at_begin",
5589 "====================> Boost.PFR: Extraction of field name is misconfigured for your compiler. "
5590 "It does not return the proper field name. "
5591 "Please define BOOST_PFR_CORE_NAME_PARSING to correct values. See documentation section "
5592 "'Limitations and Configuration' for more information."
5593 );
5594
5595 return detail::name_of_field_impl<MsvcWorkaround, ptr>();
5596}
5597
5598// Storing part of a string literal into an array minimizes the binary size.
5599//
5600// Without passing 'T' into 'name_of_field' different fields from different structures might have the same name!
5601// See https://developercommunity.visualstudio.com/t/__FUNCSIG__-outputs-wrong-value-with-C/10458554 for details
5602template <class T, std::size_t I>
5603inline constexpr auto stored_name_of_field = detail::name_of_field<T,
5604 detail::make_clang_wrapper(std::addressof(detail::sequence_tuple::get<I>(
5605 detail::tie_as_tuple(detail::fake_object<T>)
5606 )))
5607>();
5608
5609#ifdef __clang__
5610#pragma clang diagnostic pop
5611#endif
5612
5613template <class T, std::size_t... I>
5614constexpr auto tie_as_names_tuple_impl(std::index_sequence<I...>) noexcept {
5615 return detail::sequence_tuple::make_sequence_tuple(std::string_view{stored_name_of_field<T, I>.data()}...);
5616}
5617
5618template <class T, std::size_t I>
5619constexpr std::string_view get_name() noexcept {
5620 static_assert(
5621 !std::is_union<T>::value,
5622 "====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
5623 );
5624 static_assert(
5625 !std::is_array<T>::value,
5626 "====================> Boost.PFR: It is impossible to extract name from old C array since it doesn't have named members"
5627 );
5628 static_assert(
5629 sizeof(T) && BOOST_PFR_USE_CPP17,
5630 "====================> Boost.PFR: Extraction of field's names is allowed only when the BOOST_PFR_USE_CPP17 macro enabled."
5631 );
5632
5633 return stored_name_of_field<T, I>.data();
5634}
5635
5636template <class T>
5637constexpr auto tie_as_names_tuple() noexcept {
5638 static_assert(
5639 !std::is_union<T>::value,
5640 "====================> Boost.PFR: For safety reasons it is forbidden to reflect unions. See `Reflection of unions` section in the docs for more info."
5641 );
5642 static_assert(
5643 !std::is_array<T>::value,
5644 "====================> Boost.PFR: It is impossible to extract name from old C array since it doesn't have named members"
5645 );
5646 static_assert(
5647 sizeof(T) && BOOST_PFR_USE_CPP17,
5648 "====================> Boost.PFR: Extraction of field's names is allowed only when the BOOST_PFR_USE_CPP17 macro enabled."
5649 );
5650
5651 return detail::tie_as_names_tuple_impl<T>(detail::make_index_sequence<detail::fields_count<T>()>{});
5652}
5653
5654}}} // namespace boost::pfr::detail
5655
5656#endif // BOOST_PFR_DETAIL_CORE_NAME20_STATIC_HPP
5657
5658#else
5659// Copyright (c) 2023 Bela Schaum, X-Ryl669, Denis Mikhailov.
5660//
5661// Distributed under the Boost Software License, Version 1.0. (See accompanying
5662// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5663
5664
5665// Initial implementation by Bela Schaum, https://github.com/schaumb
5666// The way to make it union and UB free by X-Ryl669, https://github.com/X-Ryl669
5667//
5668
5669#ifndef BOOST_PFR_DETAIL_CORE_NAME14_DISABLED_HPP
5670#define BOOST_PFR_DETAIL_CORE_NAME14_DISABLED_HPP
5671
5672
5673namespace boost { namespace pfr { namespace detail {
5674
5675template <class T, std::size_t I>
5676constexpr auto get_name() noexcept {
5677 static_assert(
5678 sizeof(T) && false,
5679 "====================> Boost.PFR: Field's names extracting functionality requires C++20."
5680 );
5681
5682 return nullptr;
5683}
5684
5685template <class T>
5686constexpr auto tie_as_names_tuple() noexcept {
5687 static_assert(
5688 sizeof(T) && false,
5689 "====================> Boost.PFR: Field's names extracting functionality requires C++20."
5690 );
5691
5692 return detail::sequence_tuple::make_sequence_tuple();
5693}
5694
5695}}} // namespace boost::pfr::detail
5696
5697#endif // BOOST_PFR_DETAIL_CORE_NAME14_DISABLED_HPP
5698
5699#endif
5700
5701#endif // BOOST_PFR_DETAIL_CORE_NAME_HPP
5702
5703
5704
5705#include <cstddef> // for std::size_t
5706
5707
5714
5715namespace boost { namespace pfr {
5716
5726template <std::size_t I, class T>
5727constexpr
5728#ifdef BOOST_PFR_DOXYGEN_INVOKED
5729std::string_view
5730#else
5731auto
5732#endif
5733get_name() noexcept {
5734 return detail::get_name<T, I>();
5735}
5736
5737// FIXME: implement this
5738// template<class U, class T>
5739// constexpr auto get_name() noexcept {
5740// return detail::sequence_tuple::get_by_type_impl<U>( detail::tie_as_names_tuple<T>() );
5741// }
5742
5751template <class T>
5752constexpr
5753#ifdef BOOST_PFR_DOXYGEN_INVOKED
5754std::array<std::string_view, boost::pfr::tuple_size_v<T>>
5755#else
5756auto
5757#endif
5758names_as_array() noexcept {
5759 return detail::make_stdarray_from_tietuple(
5760 detail::tie_as_names_tuple<T>(),
5761 detail::make_index_sequence< tuple_size_v<T> >(),
5762 1L
5763 );
5764}
5765
5766}} // namespace boost::pfr
5767
5768#endif // BOOST_PFR_CORE_NAME_HPP
5769
5770// Copyright (c) 2016-2023 Antony Polukhin
5771//
5772// Distributed under the Boost Software License, Version 1.0. (See accompanying
5773// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5774
5775#ifndef BOOST_PFR_FUNCTIONS_FOR_HPP
5776#define BOOST_PFR_FUNCTIONS_FOR_HPP
5777
5778
5779// Copyright (c) 2016-2023 Antony Polukhin
5780//
5781// Distributed under the Boost Software License, Version 1.0. (See accompanying
5782// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5783
5784#ifndef BOOST_PFR_OPS_FIELDS_HPP
5785#define BOOST_PFR_OPS_FIELDS_HPP
5786
5787
5788// Copyright (c) 2016-2023 Antony Polukhin
5789//
5790// Distributed under the Boost Software License, Version 1.0. (See accompanying
5791// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
5792
5793#ifndef BOOST_PFR_DETAIL_FUNCTIONAL_HPP
5794#define BOOST_PFR_DETAIL_FUNCTIONAL_HPP
5795
5796
5797#include <functional>
5798#include <cstdint>
5799
5800
5801namespace boost { namespace pfr { namespace detail {
5802 template <std::size_t I, std::size_t N>
5803 struct equal_impl {
5804 template <class T, class U>
5805 constexpr static bool cmp(const T& v1, const U& v2) noexcept {
5806 return ::boost::pfr::detail::sequence_tuple::get<I>(v1) == ::boost::pfr::detail::sequence_tuple::get<I>(v2)
5807 && equal_impl<I + 1, N>::cmp(v1, v2);
5808 }
5809 };
5810
5811 template <std::size_t N>
5812 struct equal_impl<N, N> {
5813 template <class T, class U>
5814 constexpr static bool cmp(const T&, const U&) noexcept {
5815 return T::size_v == U::size_v;
5816 }
5817 };
5818
5819 template <std::size_t I, std::size_t N>
5820 struct not_equal_impl {
5821 template <class T, class U>
5822 constexpr static bool cmp(const T& v1, const U& v2) noexcept {
5823 return ::boost::pfr::detail::sequence_tuple::get<I>(v1) != ::boost::pfr::detail::sequence_tuple::get<I>(v2)
5824 || not_equal_impl<I + 1, N>::cmp(v1, v2);
5825 }
5826 };
5827
5828 template <std::size_t N>
5829 struct not_equal_impl<N, N> {
5830 template <class T, class U>
5831 constexpr static bool cmp(const T&, const U&) noexcept {
5832 return T::size_v != U::size_v;
5833 }
5834 };
5835
5836 template <std::size_t I, std::size_t N>
5837 struct less_impl {
5838 template <class T, class U>
5839 constexpr static bool cmp(const T& v1, const U& v2) noexcept {
5840 return sequence_tuple::get<I>(v1) < sequence_tuple::get<I>(v2)
5841 || (sequence_tuple::get<I>(v1) == sequence_tuple::get<I>(v2) && less_impl<I + 1, N>::cmp(v1, v2));
5842 }
5843 };
5844
5845 template <std::size_t N>
5846 struct less_impl<N, N> {
5847 template <class T, class U>
5848 constexpr static bool cmp(const T&, const U&) noexcept {
5849 return T::size_v < U::size_v;
5850 }
5851 };
5852
5853 template <std::size_t I, std::size_t N>
5854 struct less_equal_impl {
5855 template <class T, class U>
5856 constexpr static bool cmp(const T& v1, const U& v2) noexcept {
5857 return sequence_tuple::get<I>(v1) < sequence_tuple::get<I>(v2)
5858 || (sequence_tuple::get<I>(v1) == sequence_tuple::get<I>(v2) && less_equal_impl<I + 1, N>::cmp(v1, v2));
5859 }
5860 };
5861
5862 template <std::size_t N>
5863 struct less_equal_impl<N, N> {
5864 template <class T, class U>
5865 constexpr static bool cmp(const T&, const U&) noexcept {
5866 return T::size_v <= U::size_v;
5867 }
5868 };
5869
5870 template <std::size_t I, std::size_t N>
5871 struct greater_impl {
5872 template <class T, class U>
5873 constexpr static bool cmp(const T& v1, const U& v2) noexcept {
5874 return sequence_tuple::get<I>(v1) > sequence_tuple::get<I>(v2)
5875 || (sequence_tuple::get<I>(v1) == sequence_tuple::get<I>(v2) && greater_impl<I + 1, N>::cmp(v1, v2));
5876 }
5877 };
5878
5879 template <std::size_t N>
5880 struct greater_impl<N, N> {
5881 template <class T, class U>
5882 constexpr static bool cmp(const T&, const U&) noexcept {
5883 return T::size_v > U::size_v;
5884 }
5885 };
5886
5887 template <std::size_t I, std::size_t N>
5888 struct greater_equal_impl {
5889 template <class T, class U>
5890 constexpr static bool cmp(const T& v1, const U& v2) noexcept {
5891 return sequence_tuple::get<I>(v1) > sequence_tuple::get<I>(v2)
5892 || (sequence_tuple::get<I>(v1) == sequence_tuple::get<I>(v2) && greater_equal_impl<I + 1, N>::cmp(v1, v2));
5893 }
5894 };
5895
5896 template <std::size_t N>
5897 struct greater_equal_impl<N, N> {
5898 template <class T, class U>
5899 constexpr static bool cmp(const T&, const U&) noexcept {
5900 return T::size_v >= U::size_v;
5901 }
5902 };
5903
5904 // Hash combine functions copied from Boost.ContainerHash
5905 // https://github.com/boostorg/container_hash/blob/171c012d4723c5e93cc7cffe42919afdf8b27dfa/include/boost/container_hash/hash.hpp#L311
5906 // that is based on Peter Dimov's proposal
5907 // http://www.open-std.org/JTC1/SC22/WG21/docs/papers/2005/n1756.pdf
5908 // issue 6.18.
5909 //
5910 // This also contains public domain code from MurmurHash. From the
5911 // MurmurHash header:
5912 //
5913 // MurmurHash3 was written by Austin Appleby, and is placed in the public
5914 // domain. The author hereby disclaims copyright to this source code.
5915 template <typename SizeT>
5916 constexpr void hash_combine(SizeT& seed, SizeT value) noexcept {
5917 seed ^= value + 0x9e3779b9 + (seed<<6) + (seed>>2);
5918 }
5919
5920 constexpr auto rotl(std::uint32_t x, std::uint32_t r) noexcept {
5921 return (x << r) | (x >> (32 - r));
5922 }
5923
5924 constexpr void hash_combine(std::uint32_t& h1, std::uint32_t k1) noexcept {
5925 const std::uint32_t c1 = 0xcc9e2d51;
5926 const std::uint32_t c2 = 0x1b873593;
5927
5928 k1 *= c1;
5929 k1 = detail::rotl(k1,15);
5930 k1 *= c2;
5931
5932 h1 ^= k1;
5933 h1 = detail::rotl(h1,13);
5934 h1 = h1*5+0xe6546b64;
5935 }
5936
5937#if defined(INT64_MIN) && defined(UINT64_MAX)
5938 constexpr void hash_combine(std::uint64_t& h, std::uint64_t k) noexcept {
5939 const std::uint64_t m = 0xc6a4a7935bd1e995ULL;
5940 const int r = 47;
5941
5942 k *= m;
5943 k ^= k >> r;
5944 k *= m;
5945
5946 h ^= k;
5947 h *= m;
5948
5949 // Completely arbitrary number, to prevent 0's
5950 // from hashing to 0.
5951 h += 0xe6546b64;
5952 }
5953#endif
5954
5955 template <typename T>
5956 auto compute_hash(const T& value, long /*priority*/)
5957 -> decltype(std::hash<T>()(value))
5958 {
5959 return std::hash<T>()(value);
5960 }
5961
5962 template <typename T>
5963 std::size_t compute_hash(const T& /*value*/, int /*priority*/) {
5964 static_assert(sizeof(T) && false, "====================> Boost.PFR: std::hash not specialized for type T");
5965 return 0;
5966 }
5967
5968 template <std::size_t I, std::size_t N>
5969 struct hash_impl {
5970 template <class T>
5971 constexpr static std::size_t compute(const T& val) noexcept {
5972 std::size_t h = detail::compute_hash( ::boost::pfr::detail::sequence_tuple::get<I>(val), 1L );
5973 detail::hash_combine(h, hash_impl<I + 1, N>::compute(val) );
5974 return h;
5975 }
5976 };
5977
5978 template <std::size_t N>
5979 struct hash_impl<N, N> {
5980 template <class T>
5981 constexpr static std::size_t compute(const T&) noexcept {
5982 return 0;
5983 }
5984 };
5985
5987 constexpr std::size_t min_size(std::size_t x, std::size_t y) noexcept {
5988 return x < y ? x : y;
5989 }
5990
5991 template <template <std::size_t, std::size_t> class Visitor, class T, class U>
5992 constexpr bool binary_visit(const T& x, const U& y) {
5993 constexpr std::size_t fields_count_lhs = detail::fields_count<std::remove_reference_t<T>>();
5994 constexpr std::size_t fields_count_rhs = detail::fields_count<std::remove_reference_t<U>>();
5995 constexpr std::size_t fields_count_min = detail::min_size(fields_count_lhs, fields_count_rhs);
5996 typedef Visitor<0, fields_count_min> visitor_t;
5997
5998#if BOOST_PFR_USE_CPP17 || BOOST_PFR_USE_LOOPHOLE
5999 return visitor_t::cmp(detail::tie_as_tuple(x), detail::tie_as_tuple(y));
6000#else
6001 bool result = true;
6002 ::boost::pfr::detail::for_each_field_dispatcher(
6003 x,
6004 [&result, &y](const auto& lhs) {
6005 constexpr std::size_t fields_count_rhs_ = detail::fields_count<std::remove_reference_t<U>>();
6006 ::boost::pfr::detail::for_each_field_dispatcher(
6007 y,
6008 [&result, &lhs](const auto& rhs) {
6009 result = visitor_t::cmp(lhs, rhs);
6010 },
6011 detail::make_index_sequence<fields_count_rhs_>{}
6012 );
6013 },
6014 detail::make_index_sequence<fields_count_lhs>{}
6015 );
6016
6017 return result;
6018#endif
6019 }
6020
6021}}} // namespace boost::pfr::detail
6022
6023#endif // BOOST_PFR_DETAIL_FUNCTIONAL_HPP
6024
6044namespace boost { namespace pfr {
6045
6050 // `rhs` respectively; `N` is `std::min(tuple_size_v<T>, tuple_size_v<U>)`.
6051 template <class T, class U>
6052 constexpr bool eq_fields(const T& lhs, const U& rhs) noexcept {
6053 return detail::binary_visit<detail::equal_impl>(lhs, rhs);
6054 }
6055
6056
6061 // `rhs` respectively; `N` is `std::min(tuple_size_v<T>, tuple_size_v<U>)`.
6062 template <class T, class U>
6063 constexpr bool ne_fields(const T& lhs, const U& rhs) noexcept {
6064 return detail::binary_visit<detail::not_equal_impl>(lhs, rhs);
6065 }
6066
6071 // `rhs` respectively; `N` is `std::min(tuple_size_v<T>, tuple_size_v<U>)`.
6072 template <class T, class U>
6073 constexpr bool gt_fields(const T& lhs, const U& rhs) noexcept {
6074 return detail::binary_visit<detail::greater_impl>(lhs, rhs);
6075 }
6076
6077
6082 // `rhs` respectively; `N` is `std::min(tuple_size_v<T>, tuple_size_v<U>)`.
6083 template <class T, class U>
6084 constexpr bool lt_fields(const T& lhs, const U& rhs) noexcept {
6085 return detail::binary_visit<detail::less_impl>(lhs, rhs);
6086 }
6087
6088
6093 // `rhs` respectively; `N` is `std::min(tuple_size_v<T>, tuple_size_v<U>)`.
6094 template <class T, class U>
6095 constexpr bool ge_fields(const T& lhs, const U& rhs) noexcept {
6096 return detail::binary_visit<detail::greater_equal_impl>(lhs, rhs);
6097 }
6098
6099
6104 // `rhs` respectively; `N` is `std::min(tuple_size_v<T>, tuple_size_v<U>)`.
6105 template <class T, class U>
6106 constexpr bool le_fields(const T& lhs, const U& rhs) noexcept {
6107 return detail::binary_visit<detail::less_equal_impl>(lhs, rhs);
6108 }
6109
6110
6114 template <class T>
6115 std::size_t hash_fields(const T& x) {
6116 constexpr std::size_t fields_count_val = boost::pfr::detail::fields_count<std::remove_reference_t<T>>();
6117#if BOOST_PFR_USE_CPP17 || BOOST_PFR_USE_LOOPHOLE
6118 return detail::hash_impl<0, fields_count_val>::compute(detail::tie_as_tuple(x));
6119#else
6120 std::size_t result = 0;
6121 ::boost::pfr::detail::for_each_field_dispatcher(
6122 x,
6123 [&result](const auto& lhs) {
6124 // We can not reuse `fields_count_val` in lambda because compilers had issues with
6125 // passing constexpr variables into lambdas. Computing is again is the most portable solution.
6126 constexpr std::size_t fields_count_val_lambda = boost::pfr::detail::fields_count<std::remove_reference_t<T>>();
6127 result = detail::hash_impl<0, fields_count_val_lambda>::compute(lhs);
6128 },
6129 detail::make_index_sequence<fields_count_val>{}
6130 );
6131
6132 return result;
6133#endif
6134 }
6135}} // namespace boost::pfr
6136
6137#endif // BOOST_PFR_OPS_HPP
6138// Copyright (c) 2016-2023 Antony Polukhin
6139//
6140// Distributed under the Boost Software License, Version 1.0. (See accompanying
6141// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6142
6143
6144#ifndef BOOST_PFR_IO_FIELDS_HPP
6145#define BOOST_PFR_IO_FIELDS_HPP
6146
6147
6148
6149#include <type_traits>
6150#include <utility> // metaprogramming stuff
6151
6152// Copyright (c) 2016-2023 Antony Polukhin
6153//
6154// Distributed under the Boost Software License, Version 1.0. (See accompanying
6155// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6156
6157#ifndef BOOST_PFR_DETAIL_IO_HPP
6158#define BOOST_PFR_DETAIL_IO_HPP
6159
6160
6161#include <iosfwd> // stream operators
6162#include <iomanip>
6163
6164#if defined(__has_include)
6165# if __has_include(<string_view>) && BOOST_PFR_USE_CPP17
6166# include <string_view>
6167# endif
6168#endif
6169
6170namespace boost { namespace pfr { namespace detail {
6171
6172inline auto quoted_helper(const std::string& s) noexcept {
6173 return std::quoted(s);
6174}
6175
6176#if defined(__has_include)
6177# if __has_include(<string_view>) && BOOST_PFR_USE_CPP17
6178template <class CharT, class Traits>
6179inline auto quoted_helper(std::basic_string_view<CharT, Traits> s) noexcept {
6180 return std::quoted(s);
6181}
6182# endif
6183#endif
6184
6185inline auto quoted_helper(std::string& s) noexcept {
6186 return std::quoted(s);
6187}
6188
6189template <class T>
6190inline decltype(auto) quoted_helper(T&& v) noexcept {
6191 return std::forward<T>(v);
6192}
6193
6194template <std::size_t I, std::size_t N>
6195struct print_impl {
6196 template <class Stream, class T>
6197 static void print (Stream& out, const T& value) {
6198 if (!!I) out << ", ";
6199 out << detail::quoted_helper(boost::pfr::detail::sequence_tuple::get<I>(value));
6200 print_impl<I + 1, N>::print(out, value);
6201 }
6202};
6203
6204template <std::size_t I>
6205struct print_impl<I, I> {
6206 template <class Stream, class T> static void print (Stream&, const T&) noexcept {}
6207};
6208
6209
6210template <std::size_t I, std::size_t N>
6211struct read_impl {
6212 template <class Stream, class T>
6213 static void read (Stream& in, const T& value) {
6214 char ignore = {};
6215 if (!!I) {
6216 in >> ignore;
6217 if (ignore != ',') in.setstate(Stream::failbit);
6218 in >> ignore;
6219 if (ignore != ' ') in.setstate(Stream::failbit);
6220 }
6221 in >> detail::quoted_helper( boost::pfr::detail::sequence_tuple::get<I>(value) );
6222 read_impl<I + 1, N>::read(in, value);
6223 }
6224};
6225
6226template <std::size_t I>
6227struct read_impl<I, I> {
6228 template <class Stream, class T> static void read (Stream&, const T&) {}
6229};
6230
6231}}} // namespace boost::pfr::detail
6232
6233#endif // BOOST_PFR_DETAIL_IO_HPP
6234
6257
6258namespace boost { namespace pfr {
6259
6260namespace detail {
6261
6262template <class T>
6263struct io_fields_impl {
6264 T value;
6265};
6266
6267
6268template <class Char, class Traits, class T>
6269std::basic_ostream<Char, Traits>& operator<<(std::basic_ostream<Char, Traits>& out, io_fields_impl<const T&>&& x) {
6270 const T& value = x.value;
6271 constexpr std::size_t fields_count_val = boost::pfr::detail::fields_count<T>();
6272 out << '{';
6273#if BOOST_PFR_USE_CPP17 || BOOST_PFR_USE_LOOPHOLE
6274 detail::print_impl<0, fields_count_val>::print(out, detail::tie_as_tuple(value));
6275#else
6276 ::boost::pfr::detail::for_each_field_dispatcher(
6277 value,
6278 [&out](const auto& val) {
6279 // We can not reuse `fields_count_val` in lambda because compilers had issues with
6280 // passing constexpr variables into lambdas. Computing is again is the most portable solution.
6281 constexpr std::size_t fields_count_val_lambda = boost::pfr::detail::fields_count<T>();
6282 detail::print_impl<0, fields_count_val_lambda>::print(out, val);
6283 },
6284 detail::make_index_sequence<fields_count_val>{}
6285 );
6286#endif
6287 return out << '}';
6288}
6289
6290
6291template <class Char, class Traits, class T>
6292std::basic_ostream<Char, Traits>& operator<<(std::basic_ostream<Char, Traits>& out, io_fields_impl<T>&& x) {
6293 return out << io_fields_impl<const std::remove_reference_t<T>&>{x.value};
6294}
6295
6296template <class Char, class Traits, class T>
6297std::basic_istream<Char, Traits>& operator>>(std::basic_istream<Char, Traits>& in, io_fields_impl<T&>&& x) {
6298 T& value = x.value;
6299 constexpr std::size_t fields_count_val = boost::pfr::detail::fields_count<T>();
6300
6301 const auto prev_exceptions = in.exceptions();
6302 in.exceptions( typename std::basic_istream<Char, Traits>::iostate(0) );
6303 const auto prev_flags = in.flags( typename std::basic_istream<Char, Traits>::fmtflags(0) );
6304
6305 char parenthis = {};
6306 in >> parenthis;
6307 if (parenthis != '{') in.setstate(std::basic_istream<Char, Traits>::failbit);
6308
6309#if BOOST_PFR_USE_CPP17 || BOOST_PFR_USE_LOOPHOLE
6310 detail::read_impl<0, fields_count_val>::read(in, detail::tie_as_tuple(value));
6311#else
6312 ::boost::pfr::detail::for_each_field_dispatcher(
6313 value,
6314 [&in](const auto& val) {
6315 // We can not reuse `fields_count_val` in lambda because compilers had issues with
6316 // passing constexpr variables into lambdas. Computing is again is the most portable solution.
6317 constexpr std::size_t fields_count_val_lambda = boost::pfr::detail::fields_count<T>();
6318 detail::read_impl<0, fields_count_val_lambda>::read(in, val);
6319 },
6320 detail::make_index_sequence<fields_count_val>{}
6321 );
6322#endif
6323
6324 in >> parenthis;
6325 if (parenthis != '}') in.setstate(std::basic_istream<Char, Traits>::failbit);
6326
6327 in.flags(prev_flags);
6328 in.exceptions(prev_exceptions);
6329
6330 return in;
6331}
6332
6333template <class Char, class Traits, class T>
6334std::basic_istream<Char, Traits>& operator>>(std::basic_istream<Char, Traits>& in, io_fields_impl<const T&>&& ) {
6335 static_assert(sizeof(T) && false, "====================> Boost.PFR: Attempt to use istream operator on a boost::pfr::io_fields wrapped type T with const qualifier.");
6336 return in;
6337}
6338
6339template <class Char, class Traits, class T>
6340std::basic_istream<Char, Traits>& operator>>(std::basic_istream<Char, Traits>& in, io_fields_impl<T>&& ) {
6341 static_assert(sizeof(T) && false, "====================> Boost.PFR: Attempt to use istream operator on a boost::pfr::io_fields wrapped temporary of type T.");
6342 return in;
6343}
6344
6345} // namespace detail
6346
6369template <class T>
6370auto io_fields(T&& value) noexcept {
6371 return detail::io_fields_impl<T>{std::forward<T>(value)};
6372}
6373
6374}} // namespace boost::pfr
6375
6376#endif // BOOST_PFR_IO_FIELDS_HPP
6377
6395
6434
6435#define BOOST_PFR_FUNCTIONS_FOR(T) \
6436 BOOST_PFR_MAYBE_UNUSED inline bool operator==(const T& lhs, const T& rhs) { return ::boost::pfr::eq_fields(lhs, rhs); } \
6437 BOOST_PFR_MAYBE_UNUSED inline bool operator!=(const T& lhs, const T& rhs) { return ::boost::pfr::ne_fields(lhs, rhs); } \
6438 BOOST_PFR_MAYBE_UNUSED inline bool operator< (const T& lhs, const T& rhs) { return ::boost::pfr::lt_fields(lhs, rhs); } \
6439 BOOST_PFR_MAYBE_UNUSED inline bool operator> (const T& lhs, const T& rhs) { return ::boost::pfr::gt_fields(lhs, rhs); } \
6440 BOOST_PFR_MAYBE_UNUSED inline bool operator<=(const T& lhs, const T& rhs) { return ::boost::pfr::le_fields(lhs, rhs); } \
6441 BOOST_PFR_MAYBE_UNUSED inline bool operator>=(const T& lhs, const T& rhs) { return ::boost::pfr::ge_fields(lhs, rhs); } \
6442 template <class Char, class Traits> \
6443 BOOST_PFR_MAYBE_UNUSED inline ::std::basic_ostream<Char, Traits>& operator<<(::std::basic_ostream<Char, Traits>& out, const T& value) { \
6444 return out << ::boost::pfr::io_fields(value); \
6445 } \
6446 template <class Char, class Traits> \
6447 BOOST_PFR_MAYBE_UNUSED inline ::std::basic_istream<Char, Traits>& operator>>(::std::basic_istream<Char, Traits>& in, T& value) { \
6448 return in >> ::boost::pfr::io_fields(value); \
6449 } \
6450 BOOST_PFR_MAYBE_UNUSED inline std::size_t hash_value(const T& v) { \
6451 return ::boost::pfr::hash_fields(v); \
6452 } \
6453
6454
6455#endif // BOOST_PFR_FUNCTIONS_FOR_HPP
6456
6457// Copyright (c) 2016-2023 Antony Polukhin
6458//
6459// Distributed under the Boost Software License, Version 1.0. (See accompanying
6460// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6461
6462#ifndef BOOST_PFR_FUNCTORS_HPP
6463#define BOOST_PFR_FUNCTORS_HPP
6464
6465
6466// Copyright (c) 2016-2023 Antony Polukhin
6467//
6468// Distributed under the Boost Software License, Version 1.0. (See accompanying
6469// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6470
6471#ifndef BOOST_PFR_OPS_HPP
6472#define BOOST_PFR_OPS_HPP
6473
6474
6475// Copyright (c) 2016-2023 Antony Polukhin
6476//
6477// Distributed under the Boost Software License, Version 1.0. (See accompanying
6478// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6479
6480#ifndef BOOST_PFR_DETAIL_DETECTORS_HPP
6481#define BOOST_PFR_DETAIL_DETECTORS_HPP
6482
6483
6484#include <functional>
6485#include <type_traits>
6486
6487namespace boost { namespace pfr { namespace detail {
6489 struct can_not_apply{};
6490
6491 template <template <class, class> class Detector, class Tleft, class Tright>
6492 struct not_appliable {
6493 static constexpr bool value = std::is_same<
6494 Detector<Tleft, Tright>,
6495 can_not_apply
6496 >::value;
6497 };
6498
6500 template <class S, class T> auto comp_eq_detector_msvc_helper(long) -> decltype(std::declval<S>() == std::declval<T>());
6501 template <class S, class T> can_not_apply comp_eq_detector_msvc_helper(int);
6502 template <class T1, class T2> using comp_eq_detector = decltype(comp_eq_detector_msvc_helper<T1,T2>(1L));
6503
6504 template <class S, class T> auto comp_ne_detector_msvc_helper(long) -> decltype(std::declval<S>() != std::declval<T>());
6505 template <class S, class T> can_not_apply comp_ne_detector_msvc_helper(int);
6506 template <class T1, class T2> using comp_ne_detector = decltype(comp_ne_detector_msvc_helper<T1,T2>(1L));
6507
6508 template <class S, class T> auto comp_lt_detector_msvc_helper(long) -> decltype(std::declval<S>() < std::declval<T>());
6509 template <class S, class T> can_not_apply comp_lt_detector_msvc_helper(int);
6510 template <class T1, class T2> using comp_lt_detector = decltype(comp_lt_detector_msvc_helper<T1,T2>(1L));
6511
6512 template <class S, class T> auto comp_le_detector_msvc_helper(long) -> decltype(std::declval<S>() <= std::declval<T>());
6513 template <class S, class T> can_not_apply comp_le_detector_msvc_helper(int);
6514 template <class T1, class T2> using comp_le_detector = decltype(comp_le_detector_msvc_helper<T1,T2>(1L));
6515
6516 template <class S, class T> auto comp_gt_detector_msvc_helper(long) -> decltype(std::declval<S>() > std::declval<T>());
6517 template <class S, class T> can_not_apply comp_gt_detector_msvc_helper(int);
6518 template <class T1, class T2> using comp_gt_detector = decltype(comp_gt_detector_msvc_helper<T1,T2>(1L));
6519
6520 template <class S, class T> auto comp_ge_detector_msvc_helper(long) -> decltype(std::declval<S>() >= std::declval<T>());
6521 template <class S, class T> can_not_apply comp_ge_detector_msvc_helper(int);
6522 template <class T1, class T2> using comp_ge_detector = decltype(comp_ge_detector_msvc_helper<T1,T2>(1L));
6523
6524
6525 template <class S> auto hash_detector_msvc_helper(long) -> decltype(std::hash<S>{}(std::declval<S>()));
6526 template <class S> can_not_apply hash_detector_msvc_helper(int);
6527 template <class T1, class T2> using hash_detector = decltype(hash_detector_msvc_helper<T1,T2>(1L));
6528
6529
6530 template <class S, class T> auto ostreamable_detector_msvc_helper(long) -> decltype(std::declval<S>() << std::declval<T>());
6531 template <class S, class T> can_not_apply ostreamable_detector_msvc_helper(int);
6532 template <class S, class T> using ostreamable_detector = decltype(ostreamable_detector_msvc_helper<S,T>(1L));
6533
6534 template <class S, class T> auto istreamable_detector_msvc_helper(long) -> decltype(std::declval<S>() >> std::declval<T>());
6535 template <class S, class T> can_not_apply istreamable_detector_msvc_helper(int);
6536 template <class S, class T> using istreamable_detector = decltype(istreamable_detector_msvc_helper<S,T>(1L));
6537
6538}}} // namespace boost::pfr::detail
6539
6540#endif // BOOST_PFR_DETAIL_DETECTORS_HPP
6541
6542
6543
6565namespace boost { namespace pfr {
6566
6567namespace detail {
6568
6570 template <template <class, class> class Detector, class T, class U>
6571 using enable_not_comp_base_t = std::enable_if_t<
6572 not_appliable<Detector, T const&, U const&>::value,
6573 bool
6574 >;
6575
6576 template <template <class, class> class Detector, class T, class U>
6577 using enable_comp_base_t = std::enable_if_t<
6578 !not_appliable<Detector, T const&, U const&>::value,
6579 bool
6580 >;
6582
6583 template <class T, class U> using enable_not_eq_comp_t = enable_not_comp_base_t<comp_eq_detector, T, U>;
6584 template <class T, class U> using enable_not_ne_comp_t = enable_not_comp_base_t<comp_ne_detector, T, U>;
6585 template <class T, class U> using enable_not_lt_comp_t = enable_not_comp_base_t<comp_lt_detector, T, U>;
6586 template <class T, class U> using enable_not_le_comp_t = enable_not_comp_base_t<comp_le_detector, T, U>;
6587 template <class T, class U> using enable_not_gt_comp_t = enable_not_comp_base_t<comp_gt_detector, T, U>;
6588 template <class T, class U> using enable_not_ge_comp_t = enable_not_comp_base_t<comp_ge_detector, T, U>;
6589
6590 template <class T> using enable_not_hashable_t = std::enable_if_t<
6591 not_appliable<hash_detector, const T&, const T&>::value,
6592 std::size_t
6593 >;
6595
6596 template <class T, class U> using enable_eq_comp_t = enable_comp_base_t<comp_eq_detector, T, U>;
6597 template <class T, class U> using enable_ne_comp_t = enable_comp_base_t<comp_ne_detector, T, U>;
6598 template <class T, class U> using enable_lt_comp_t = enable_comp_base_t<comp_lt_detector, T, U>;
6599 template <class T, class U> using enable_le_comp_t = enable_comp_base_t<comp_le_detector, T, U>;
6600 template <class T, class U> using enable_gt_comp_t = enable_comp_base_t<comp_gt_detector, T, U>;
6601 template <class T, class U> using enable_ge_comp_t = enable_comp_base_t<comp_ge_detector, T, U>;
6602
6603 template <class T> using enable_hashable_t = std::enable_if_t<
6604 !not_appliable<hash_detector, const T&, const T&>::value,
6605 std::size_t
6606 >;
6607} // namespace detail
6608
6609
6613template <class T, class U>
6614constexpr detail::enable_not_eq_comp_t<T, U> eq(const T& lhs, const U& rhs) noexcept {
6615 return boost::pfr::eq_fields(lhs, rhs);
6616}
6617
6619template <class T, class U>
6620constexpr detail::enable_eq_comp_t<T, U> eq(const T& lhs, const U& rhs) {
6621 return lhs == rhs;
6622}
6623
6624
6628template <class T, class U>
6629constexpr detail::enable_not_ne_comp_t<T, U> ne(const T& lhs, const U& rhs) noexcept {
6630 return boost::pfr::ne_fields(lhs, rhs);
6631}
6632
6634template <class T, class U>
6635constexpr detail::enable_ne_comp_t<T, U> ne(const T& lhs, const U& rhs) {
6636 return lhs != rhs;
6637}
6638
6639
6643template <class T, class U>
6644constexpr detail::enable_not_lt_comp_t<T, U> lt(const T& lhs, const U& rhs) noexcept {
6645 return boost::pfr::lt_fields(lhs, rhs);
6646}
6647
6649template <class T, class U>
6650constexpr detail::enable_lt_comp_t<T, U> lt(const T& lhs, const U& rhs) {
6651 return lhs < rhs;
6652}
6653
6654
6658template <class T, class U>
6659constexpr detail::enable_not_gt_comp_t<T, U> gt(const T& lhs, const U& rhs) noexcept {
6660 return boost::pfr::gt_fields(lhs, rhs);
6661}
6662
6664template <class T, class U>
6665constexpr detail::enable_gt_comp_t<T, U> gt(const T& lhs, const U& rhs) {
6666 return lhs > rhs;
6667}
6668
6669
6673template <class T, class U>
6674constexpr detail::enable_not_le_comp_t<T, U> le(const T& lhs, const U& rhs) noexcept {
6675 return boost::pfr::le_fields(lhs, rhs);
6676}
6677
6679template <class T, class U>
6680constexpr detail::enable_le_comp_t<T, U> le(const T& lhs, const U& rhs) {
6681 return lhs <= rhs;
6682}
6683
6684
6688template <class T, class U>
6689constexpr detail::enable_not_ge_comp_t<T, U> ge(const T& lhs, const U& rhs) noexcept {
6690 return boost::pfr::ge_fields(lhs, rhs);
6691}
6692
6694template <class T, class U>
6695constexpr detail::enable_ge_comp_t<T, U> ge(const T& lhs, const U& rhs) {
6696 return lhs >= rhs;
6697}
6698
6699
6703template <class T>
6704constexpr detail::enable_not_hashable_t<T> hash_value(const T& value) noexcept {
6705 return boost::pfr::hash_fields(value);
6706}
6707
6709template <class T>
6710constexpr detail::enable_hashable_t<T> hash_value(const T& value) {
6711 return std::hash<T>{}(value);
6712}
6713
6714}} // namespace boost::pfr
6715
6716#endif // BOOST_PFR_OPS_HPP
6717
6718
6739namespace boost { namespace pfr {
6740
6742
6744template <class T = void> struct equal_to {
6746 bool operator()(const T& x, const T& y) const {
6747 return boost::pfr::eq(x, y);
6748 }
6749
6750#ifdef BOOST_PFR_DOXYGEN_INVOKED
6752 typedef std::true_type is_transparent;
6753
6756 template <class V, class U> bool operator()(const V& x, const U& y) const;
6757#endif
6758};
6759
6761template <> struct equal_to<void> {
6762 template <class T, class U>
6763 bool operator()(const T& x, const U& y) const {
6764 return boost::pfr::eq(x, y);
6765 }
6766
6767 typedef std::true_type is_transparent;
6768};
6770
6772template <class T = void> struct not_equal {
6774 bool operator()(const T& x, const T& y) const {
6775 return boost::pfr::ne(x, y);
6776 }
6777
6778#ifdef BOOST_PFR_DOXYGEN_INVOKED
6780 typedef std::true_type is_transparent;
6781
6784 template <class V, class U> bool operator()(const V& x, const U& y) const;
6785#endif
6786};
6787
6789template <> struct not_equal<void> {
6790 template <class T, class U>
6791 bool operator()(const T& x, const U& y) const {
6792 return boost::pfr::ne(x, y);
6793 }
6794
6795 typedef std::true_type is_transparent;
6796};
6798
6800template <class T = void> struct greater {
6802 bool operator()(const T& x, const T& y) const {
6803 return boost::pfr::gt(x, y);
6804 }
6805
6806#ifdef BOOST_PFR_DOXYGEN_INVOKED
6808 typedef std::true_type is_transparent;
6809
6812 template <class V, class U> bool operator()(const V& x, const U& y) const;
6813#endif
6814};
6815
6817template <> struct greater<void> {
6818 template <class T, class U>
6819 bool operator()(const T& x, const U& y) const {
6820 return boost::pfr::gt(x, y);
6821 }
6822
6823 typedef std::true_type is_transparent;
6824};
6826
6828template <class T = void> struct less {
6830 bool operator()(const T& x, const T& y) const {
6831 return boost::pfr::lt(x, y);
6832 }
6833
6834#ifdef BOOST_PFR_DOXYGEN_INVOKED
6836 typedef std::true_type is_transparent;
6837
6840 template <class V, class U> bool operator()(const V& x, const U& y) const;
6841#endif
6842};
6843
6845template <> struct less<void> {
6846 template <class T, class U>
6847 bool operator()(const T& x, const U& y) const {
6848 return boost::pfr::lt(x, y);
6849 }
6850
6851 typedef std::true_type is_transparent;
6852};
6854
6856template <class T = void> struct greater_equal {
6859 bool operator()(const T& x, const T& y) const {
6860 return boost::pfr::ge(x, y);
6861 }
6862
6863#ifdef BOOST_PFR_DOXYGEN_INVOKED
6865 typedef std::true_type is_transparent;
6866
6869 template <class V, class U> bool operator()(const V& x, const U& y) const;
6870#endif
6871};
6872
6874template <> struct greater_equal<void> {
6875 template <class T, class U>
6876 bool operator()(const T& x, const U& y) const {
6877 return boost::pfr::ge(x, y);
6878 }
6879
6880 typedef std::true_type is_transparent;
6881};
6883
6885template <class T = void> struct less_equal {
6888 bool operator()(const T& x, const T& y) const {
6889 return boost::pfr::le(x, y);
6890 }
6891
6892#ifdef BOOST_PFR_DOXYGEN_INVOKED
6894 typedef std::true_type is_transparent;
6895
6898 template <class V, class U> bool operator()(const V& x, const U& y) const;
6899#endif
6900};
6901
6903template <> struct less_equal<void> {
6904 template <class T, class U>
6905 bool operator()(const T& x, const U& y) const {
6906 return boost::pfr::le(x, y);
6907 }
6908
6909 typedef std::true_type is_transparent;
6910};
6912
6913
6915template <class T> struct hash {
6917 std::size_t operator()(const T& x) const {
6918 return boost::pfr::hash_value(x);
6919 }
6920};
6921
6922}} // namespace boost::pfr
6923
6924#endif // BOOST_PFR_FUNCTORS_HPP
6925// Copyright (c) 2016-2023 Antony Polukhin
6926//
6927// Distributed under the Boost Software License, Version 1.0. (See accompanying
6928// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6929
6930#ifndef BOOST_PFR_IO_HPP
6931#define BOOST_PFR_IO_HPP
6932
6933
6934
6954namespace boost { namespace pfr {
6955
6956namespace detail {
6957
6959 template <class Stream, class Type>
6960 using enable_not_ostreamable_t = std::enable_if_t<
6961 not_appliable<ostreamable_detector, Stream&, const std::remove_reference_t<Type>&>::value,
6962 Stream&
6963 >;
6964
6965 template <class Stream, class Type>
6966 using enable_not_istreamable_t = std::enable_if_t<
6967 not_appliable<istreamable_detector, Stream&, Type&>::value,
6968 Stream&
6969 >;
6970
6971 template <class Stream, class Type>
6972 using enable_ostreamable_t = std::enable_if_t<
6973 !not_appliable<ostreamable_detector, Stream&, const std::remove_reference_t<Type>&>::value,
6974 Stream&
6975 >;
6976
6977 template <class Stream, class Type>
6978 using enable_istreamable_t = std::enable_if_t<
6979 !not_appliable<istreamable_detector, Stream&, Type&>::value,
6980 Stream&
6981 >;
6982
6984
6985template <class T>
6986struct io_impl {
6987 T value;
6988};
6989
6990template <class Char, class Traits, class T>
6991enable_not_ostreamable_t<std::basic_ostream<Char, Traits>, T> operator<<(std::basic_ostream<Char, Traits>& out, io_impl<T>&& x) {
6992 return out << boost::pfr::io_fields(std::forward<T>(x.value));
6993}
6994
6995template <class Char, class Traits, class T>
6996enable_ostreamable_t<std::basic_ostream<Char, Traits>, T> operator<<(std::basic_ostream<Char, Traits>& out, io_impl<T>&& x) {
6997 return out << x.value;
6998}
6999
7000template <class Char, class Traits, class T>
7001enable_not_istreamable_t<std::basic_istream<Char, Traits>, T> operator>>(std::basic_istream<Char, Traits>& in, io_impl<T>&& x) {
7002 return in >> boost::pfr::io_fields(std::forward<T>(x.value));
7003}
7004
7005template <class Char, class Traits, class T>
7006enable_istreamable_t<std::basic_istream<Char, Traits>, T> operator>>(std::basic_istream<Char, Traits>& in, io_impl<T>&& x) {
7007 return in >> x.value;
7008}
7009
7010} // namespace detail
7011
7026template <class T>
7027auto io(T&& value) noexcept {
7028 return detail::io_impl<T>{std::forward<T>(value)};
7029}
7030
7031}} // namespace boost::pfr
7032
7033#endif // BOOST_PFR_IO_HPP
7034// Copyright (c) 2022 Denis Mikhailov
7035//
7036// Distributed under the Boost Software License, Version 1.0. (See accompanying
7037// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7038
7039#ifndef BOOST_PFR_DETAIL_TRAITS_FWD_HPP
7040#define BOOST_PFR_DETAIL_TRAITS_FWD_HPP
7041
7042
7043namespace boost { namespace pfr {
7044
7045template<class T, class WhatFor>
7046struct is_reflectable;
7047
7048}} // namespace boost::pfr
7049
7050#endif // BOOST_PFR_DETAIL_TRAITS_FWD_HPP
7051
7052
7053// Copyright (c) 2022 Denis Mikhailov
7054//
7055// Distributed under the Boost Software License, Version 1.0. (See accompanying
7056// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7057
7058#ifndef BOOST_PFR_TRAITS_HPP
7059#define BOOST_PFR_TRAITS_HPP
7060
7061
7062// Copyright (c) 2022 Denis Mikhailov
7063//
7064// Distributed under the Boost Software License, Version 1.0. (See accompanying
7065// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
7066
7067#ifndef BOOST_PFR_DETAIL_POSSIBLE_REFLECTABLE_HPP
7068#define BOOST_PFR_DETAIL_POSSIBLE_REFLECTABLE_HPP
7069
7070
7071#include <type_traits> // for std::is_aggregate
7072
7073namespace boost { namespace pfr { namespace detail {
7074
7076template <class T, class WhatFor>
7077constexpr decltype(is_reflectable<T, WhatFor>::value) possible_reflectable(long) noexcept {
7078 return is_reflectable<T, WhatFor>::value;
7079}
7080
7081#if BOOST_PFR_ENABLE_IMPLICIT_REFLECTION
7082
7083template <class T, class WhatFor>
7084constexpr bool possible_reflectable(int) noexcept {
7085# if defined(__cpp_lib_is_aggregate)
7086 using type = std::remove_cv_t<T>;
7087 return std::is_aggregate<type>();
7088# else
7089 return true;
7090# endif
7091}
7092
7093#else
7094
7095template <class T, class WhatFor>
7096constexpr bool possible_reflectable(int) noexcept {
7097 // negative answer here won't change behaviour in PFR-dependent libraries(like Fusion)
7098 return false;
7099}
7100
7101#endif
7102
7103}}} // namespace boost::pfr::detail
7104
7105#endif // BOOST_PFR_DETAIL_POSSIBLE_REFLECTABLE_HPP
7106
7107
7108#include <type_traits>
7109
7114
7115namespace boost { namespace pfr {
7116
7128template<class T, class WhatFor>
7129struct is_reflectable { /* does not have 'value' because value is unknown */ };
7130
7131// these specs can't be inherited from 'std::integral_constant< bool, boost::pfr::is_reflectable<T, WhatFor>::value >',
7132// because it will break the sfinae-friendliness
7133template<class T, class WhatFor>
7134struct is_reflectable<const T, WhatFor> : boost::pfr::is_reflectable<T, WhatFor> {};
7135
7136template<class T, class WhatFor>
7137struct is_reflectable<volatile T, WhatFor> : boost::pfr::is_reflectable<T, WhatFor> {};
7138
7139template<class T, class WhatFor>
7140struct is_reflectable<const volatile T, WhatFor> : boost::pfr::is_reflectable<T, WhatFor> {};
7141
7144template<class T, class WhatFor>
7145using is_implicitly_reflectable = std::integral_constant< bool, boost::pfr::detail::possible_reflectable<T, WhatFor>(1L) >;
7146
7149template<class T, class WhatFor>
7150constexpr bool is_implicitly_reflectable_v = is_implicitly_reflectable<T, WhatFor>::value;
7151
7152}} // namespace boost::pfr
7153
7154#endif // BOOST_PFR_TRAITS_HPP
7155
7156
7157#endif // BOOST_PFR_HPP