@@ -100,33 +100,33 @@ constexpr auto apply_unary(Self &self, FunctionObject&& f) {
100100
101101// apply on skeleton struct S<F>
102102template <class FunctionObject , template <template <class > class > class S , template <class > class F >
103- constexpr auto apply (S<F> &self, FunctionObject&& f) {
103+ __attribute__ ((flatten)) constexpr auto apply (S<F> &self, FunctionObject&& f) {
104104 return apply_unary (self, std::forward<FunctionObject&&>(f));
105105}
106106
107107template <class FunctionObject , template <template <class > class > class S , template <class > class F >
108- constexpr auto apply (const S<F> &self, FunctionObject&& f) {
108+ __attribute__ ((flatten)) constexpr auto apply (const S<F> &self, FunctionObject&& f) {
109109 return apply_unary (self, std::forward<FunctionObject&&>(f));
110110}
111111
112112// apply on wrappers, forwarding to the base type
113113template <class FunctionObject , class Self >
114114 requires requires { typename Self::Base; }
115- constexpr auto apply (Self &self, FunctionObject&& f) {
115+ __attribute__ ((flatten)) constexpr auto apply (Self &self, FunctionObject&& f) {
116116 return apply_unary<typename Self::Base>(self, std::forward<FunctionObject&&>(f));
117117}
118118
119119template <class FunctionObject , class Self >
120120 requires requires { typename Self::Base; }
121- constexpr auto apply (const Self &self, FunctionObject&& f) {
121+ __attribute__ ((flatten)) constexpr auto apply (const Self &self, FunctionObject&& f) {
122122 return apply_unary<const typename Self::Base>(self, std::forward<FunctionObject&&>(f));
123123}
124124
125125
126126// template <class FunctionObject, class Self, class Other>
127127// constexpr auto apply(Self &self, Other &other, FunctionObject&& f) {
128128template <class Self , class Other , class FunctionObject >
129- constexpr auto apply_binary (Self &self, Other &other, FunctionObject&& f) {
129+ __attribute__ ((flatten)) constexpr auto apply_binary (Self &self, Other &other, FunctionObject&& f) {
130130 auto construct_output = [&]<size_t ... Is>(std::index_sequence<Is...>) -> Self {
131131 return {f (
132132 self.[:nsdms (^^Self)[Is]:], other.[:nsdms (^^Other)[Is]:])...};
@@ -136,25 +136,24 @@ constexpr auto apply_binary(Self &self, Other &other, FunctionObject&& f) {
136136}
137137
138138template <class FunctionObject , template <template <class > class > class S , template <class > class F_self , template <class > class F_other >
139- constexpr auto apply (S<F_self> &self, S<F_other> &other, FunctionObject&& f) {
139+ __attribute__ ((flatten)) constexpr auto apply (S<F_self> &self, S<F_other> &other, FunctionObject&& f) {
140140 return apply_binary (self, other, std::forward<FunctionObject&&>(f));
141141}
142142
143143template <class FunctionObject , template <template <class > class > class S , template <class > class F_self , template <class > class F_other >
144- constexpr auto apply (S<F_self> &self, const S<F_other> &other, FunctionObject&& f) {
144+ __attribute__ ((flatten)) constexpr auto apply (S<F_self> &self, const S<F_other> &other, FunctionObject&& f) {
145145 return apply_binary (self, other, std::forward<FunctionObject&&>(f));
146146}
147147
148148template <class Self , class Other , class FunctionObject >
149149 requires requires { typename Self::Base; typename Other::Base; }
150- constexpr auto apply (Self &self, Other &other, FunctionObject&& f) {
150+ __attribute__ ((flatten)) constexpr auto apply (Self &self, Other &other, FunctionObject&& f) {
151151 return apply_binary<typename Self::Base, typename Other::Base>(self, other, std::forward<FunctionObject&&>(f));
152152}
153153
154154template <class Self , class Other , class FunctionObject >
155155 requires requires { typename Self::Base; typename Other::Base; }
156- constexpr auto apply (Self &self, const Other &other, FunctionObject&& f) {
157- static_assert (count_members<typename Self::Base>() == 4 );
156+ __attribute__ ((flatten)) constexpr auto apply (Self &self, const Other &other, FunctionObject&& f) {
158157 return apply_binary<typename Self::Base, const typename Other::Base>(self, other, std::forward<FunctionObject&&>(f));
159158}
160159
0 commit comments