35 virtual void bytes(uint8_t* buf,
size_t n) = 0;
41 template <
class Field>
44 uint8_t buf[Field::kBytes];
46 bytes(buf,
sizeof(buf));
47 if (std::optional<typename Field::Elt> maybe = F.of_bytes_field(buf)) {
53 template <
class Field>
54 typename Field::Elt subfield_elt(
const Field& F) {
56 uint8_t buf[Field::kSubFieldBytes];
58 bytes(buf,
sizeof(buf));
59 if (std::optional<typename Field::Elt> maybe = F.of_bytes_subfield(buf)) {
66 template <
class Field>
67 void elt(
typename Field::Elt e[],
size_t n,
const Field& F) {
68 for (
size_t i = 0; i < n; ++i) e[i] = elt(F);
72 size_t mask(
size_t n) {
74 while ((n & mask) != n) {
82 size_t nat(
size_t n) {
83 check(n > 0,
"nat(0)");
92 check(l <=
sizeof(
size_t),
"l <= sizeof(size_t)");
96 uint8_t buf[
sizeof(size_t)];
105 for (
size_t i = l; i-- > 0;) {
106 r = (r << 8) | buf[i];
118 void choose(
size_t res[],
size_t n,
size_t k) {
119 check(n >= k,
"n >= k");
121 std::vector<size_t> A(n);
122 for (
size_t i = 0; i < n; ++i) {
125 for (
size_t i = 0; i < k; ++i) {
126 size_t j = i + nat(n - i);
127 std::swap(A[i], A[j]);