Tomasz Kaminski [Monday, 23 February 2026 09:19:12 CET]: > > I do not think that this should be a separate overload and another if > > constexpr branch > > In the default implementation. > > That's what I initially did. It was horrible because I need to extract the > first element and the remaining pack from __rest... to do so. I could make > the function take 3 arguments + pack, but then I'd need an overload for the > 2-arg case, which would the duplicate the implementation. > What I could do is call a 3-arg + pack function/lambda from the constexpr-if > branch, but personally I find the overload simpler (and hopefully cheaper > to compile). > I think you are already using pack indexing in the implementation of > simd_mask, so I do not see a problem here: if (sizeof...(rest) > 0) and > _N0 > __Ns...[0].
__Ns...[0] is already something that needs to go the next nested constexpr-if:
if constexpr (__has_single_bit(unsigned(_N0)) && sizeof...(__rest) >= 2 && _N0
> _N1)
{
static constexpr array __tmp {_Ns...};
constexpr auto& [_N2, ..._N3s] = __tmp;
if constexpr (_N0 >= (_N1 + _N2))
{
const auto& [__c, ...__ds] = std::tie(__rest...);
return __vec_concat_sized<_N0, _N1 + _N2, _N3s...>(
__a, __vec_concat_sized<_N1, _N2>(__b, __c), __ds...);
}
}
else { ... }
And now I need to duplicate the else branch or remove the 'else' altogether
and have the code in the else branch unconditionally "visible".
--
──────────────────────────────────────────────────────────────────────────
Dr. Matthias Kretz https://mattkretz.github.io
GSI Helmholtz Center for Heavy Ion Research https://gsi.de
std::simd
──────────────────────────────────────────────────────────────────────────
signature.asc
Description: This is a digitally signed message part.
