src/gen/gosper/lib.hpp
| Line | Branch | Exec | Source |
|---|---|---|---|
| 1 | #pragma once | ||
| 2 | |||
| 3 | #include "../../bit/lowbit/lib.hpp" | ||
| 4 | #include "../../util/alias/num/lib.hpp" | ||
| 5 | |||
| 6 | namespace tifa_libs { | ||
| 7 | |||
| 8 | template <u32 = 0> | ||
| 9 | class gosper { | ||
| 10 | static inline u32 n_, k_; | ||
| 11 | u64 now_; | ||
| 12 | |||
| 13 | 196 | static CEXP u64 num_begin() NE { return (1_u64 << k_) - 1; } | |
| 14 | 328576268 | static CEXP u64 num_end() NE { return 1_u64 << n_; } | |
| 15 | |||
| 16 | public: | ||
| 17 | 98 | static CEXP void set(u32 n, u32 k) NE { | |
| 18 |
9/18tifa_libs::gosper<0u>::set(unsigned int, unsigned int):
✓ Branch 0 taken 16 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 16 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 16 times.
✗ Branch 5 not taken.
tifa_libs::gosper<1u>::set(unsigned int, unsigned int):
✓ Branch 0 taken 21 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 21 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 21 times.
✗ Branch 5 not taken.
tifa_libs::gosper<2u>::set(unsigned int, unsigned int):
✓ Branch 0 taken 61 times.
✗ Branch 1 not taken.
✓ Branch 2 taken 61 times.
✗ Branch 3 not taken.
✓ Branch 4 taken 61 times.
✗ Branch 5 not taken.
|
98 | assert(k && k <= n && n < 64); |
| 19 | 98 | n_ = n, k_ = k; | |
| 20 | 98 | } | |
| 21 | 98 | static CEXP gosper begin() NE { return num_begin(); } | |
| 22 | 98 | static CEXP gosper end() NE { return num_end(); } | |
| 23 | |||
| 24 |
9/12tifa_libs::gosper<0u>::gosper(unsigned long):
✓ Branch 3 taken 32 times.
✓ Branch 4 taken 16 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 32 times.
tifa_libs::gosper<1u>::gosper(unsigned long):
✓ Branch 3 taken 42 times.
✓ Branch 4 taken 21 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 42 times.
tifa_libs::gosper<2u>::gosper(unsigned long):
✓ Branch 3 taken 122 times.
✓ Branch 4 taken 61 times.
✗ Branch 6 not taken.
✓ Branch 7 taken 122 times.
|
294 | CEXP gosper(u64 now = num_begin()) NE : now_(min(now, num_end())) { assert(now == num_end() || (u32)std::popcount(now) == k_); } |
| 25 | |||
| 26 | 985726942 | CEXP u64 operator*() CNE { return now_; } | |
| 27 | 328575680 | CEXP bool operator!=(gosper CR x) CNE { return **this != *x; } | |
| 28 | 328575582 | CEXP void operator++() NE { | |
| 29 | 328575582 | u64 c = lowbit(now_), r = now_ + c; | |
| 30 | 328575582 | now_ = min(((r ^ now_) / 4 / c) | r, num_end()); | |
| 31 | 328575582 | } | |
| 32 | }; | ||
| 33 | |||
| 34 | } // namespace tifa_libs | ||
| 35 |