26 #include "../concepts.h"
39 template < std::
size_t >
42 template <
typename T >
46 template <
class T, std::size_t I0, std::size_t... I >
48 -> std::add_pointer_t<
51 out =
sizeof...( I ) + 1;
55 template <
class T, std::size_t... I >
58 if constexpr (
sizeof...( I ) > 0 ) {
59 decompose_count_impl< T >(
60 out, std::make_index_sequence<
sizeof...( I ) - 1 >{} );
61 }
else if constexpr ( std::is_default_constructible_v< T > ) {
69 template <
typename T >
73 decompose_count_impl< std::decay_t< T > >(
74 c, std::make_index_sequence< max_decompose_count >{} );
80 template <
typename T >
81 concept
decomposable = std::is_class_v< std::decay_t< T > > && !gettable_container< T > &&
82 ( detail::decompose_count< T >() >= 0 );
84 #define EMLABCPP_GENERATE_DECOMPOSE( ID, ... ) \
85 template < typename T > \
86 concept decomposable_##ID = decomposable< T > && detail::decompose_count< T >() == ( ID ); \
88 template < decomposable_##ID T > \
89 constexpr auto decompose( T&& item ) \
91 if constexpr ( !std::is_lvalue_reference_v< T > ) { \
92 auto&& [__VA_ARGS__] = std::forward< T >( item ); \
93 return std::make_tuple( __VA_ARGS__ ); \
95 auto& [__VA_ARGS__] = item; \
96 return std::tie( __VA_ARGS__ ); \
100 template <
typename T >
101 concept
decomposable_0 = decomposable< T > && ( detail::decompose_count< T >() == 0 );
103 template < decomposable_0 T >
109 template <
typename T,
typename Tuple >
113 []<
typename... Args >( Args&&...
args ) {
114 return T{ std::forward< Args >(
args )... };
128 EMLABCPP_GENERATE_DECOMPOSE( 10, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9 )
129 EMLABCPP_GENERATE_DECOMPOSE( 11, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10 )
130 EMLABCPP_GENERATE_DECOMPOSE( 12, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11 )
131 EMLABCPP_GENERATE_DECOMPOSE( 13, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12 )
132 EMLABCPP_GENERATE_DECOMPOSE( 14, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13 )
133 EMLABCPP_GENERATE_DECOMPOSE( 15, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14 )
153 template < typename T >
154 using decomposed_type = decltype(
decompose( std::declval< T >() ) );
constexpr int decompose_count()
Definition: decompose.h:70
constexpr auto decompose_count_impl(int &out, std::index_sequence< I0, I... >) -> std::add_pointer_t< decltype(T{ decompose_anything< I0 >{}, decompose_anything< I >{}... }) >
Definition: decompose.h:47
static constexpr std::size_t max_decompose_count
Definition: decompose.h:37
MIT License.
Definition: impl.h:31
Args const & args
Definition: min_max.h:83
constexpr T compose(Tuple tpl)
Definition: decompose.h:110
concept decomposable
Definition: decompose.h:81
EMLABCPP_GENERATE_DECOMPOSE(16, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15) template< typename T > using decomposed_type
concept decomposable_0
Definition: decompose.h:101
constexpr std::tuple decompose(T &&)
Definition: decompose.h:104
Definition: decompose.h:41