[PATCH v2] libstdc++: implement Philox Engine [PR119794]
Jonathan Wakely
jwakely@redhat.com
Fri Jul 11 17:16:23 GMT 2025
On Fri, 11 Jul 2025 at 18:12, Jonathan Wakely <jwakely@redhat.com> wrote:
> > > + static constexpr std::array<result_type, __n / 2> multipliers =
> > > + philox_engine::__popMultArray();
> > > + static constexpr std::array<result_type, __n / 2> round_consts =
> > > + philox_engine::__popConstArray();
>
> Since you're creating static data members for these anyway, would it
> make more sense for them to just be variable templates instead of
> calling
Sorry, ignore this incomplete sentence, I changed my mind about
variable templates and wrote this instead ...
> Can we just use a single function for both of these?
>
> template<size_t _Ind0, size_t _Ind1>
> static constexpr array<result_type, __n/2>
> _S_populate_array()
> {
> if constexpr (__n == 4)
> return {__consts...[_Ind0], __consts[_Ind1]};
> else
> return {__consts...[_Ind0]};
> }
>
> then:
>
> static constexpr std::array<result_type, __n / 2> multipliers
> = _S_populate_array<0, 2>();
> static constexpr std::array<result_type, __n / 2> round_consts
> = _S_populate_array<1, 3>();
>
Or slightly simpler:
template<int _Offset>
static constexpr array<result_type, __n/2>
_S_populate_array()
{
if constexpr (__n == 4)
return {__consts...[_Offset], __consts...[_Offset+2]};
else
return {__consts...[_Offset]};
}
static constexpr std::array<result_type, __n / 2> multipliers
= _S_populate_array<0>();
static constexpr std::array<result_type, __n / 2> round_consts
= _S_populate_array<1>();
More information about the Libstdc++
mailing list