#include <range/v3/view/cartesian_product.hpp>
#include <range/v3/view/transform.hpp>
#include <range/v3/view/enumerate.hpp>
import std;
#define FWD(x) std::forward<decltype(x)>(x)
#define INDEX_SEQUENCE(Is, N, Expression) [&]<std::size_t... Is>(std::index_sequence<Is...>){ Expression }(std::make_index_sequence<N>{})
template <std::size_t N>
void binary1(){
static constexpr std::array bit { '0', '1' };
#pragma clang diagnostic ignored "-Wunused-value"
auto binaries = INDEX_SEQUENCE(Is, N, return ranges::views::cartesian_product((Is, bit)... /* cause of -Wunused-value warning */); )
| ranges::views::transform([](auto &&bit_tuple) {
return INDEX_SEQUENCE(Is, N, return std::string { ranges::get<Is>(bit_tuple)... }; );
})
| ranges::views::enumerate;
for (auto &&[n, binary] : binaries){
std::println("{} = 0b{}", n, binary);
}
}
template <std::size_t N>
void binary2(){
auto binaries = std::views::iota(0UZ, 1UZ << N)
| std::views::transform([](std::size_t n){
auto binary = INDEX_SEQUENCE(Is, N, return std::string { ((n >> (N - Is - 1UZ)) & 1UZ ? '1' : '0')... }; );
return std::make_pair(n, binary);
});
for (auto &&[n, binary] : binaries){
std::println("{} = 0b{}", n, binary);
}
}
template <std::size_t N>
void binary3(){
for (std::size_t n : std::views::iota(0UZ, 1UZ << N)){
std::println("{0} = 0b{0:0>{1}b}", n, N);
}
}
int main() {
constexpr std::size_t N = 4;
binary1<N>();
binary2<N>();
binary3<N>();
}
Compiler: Clang 17
External libraries: range-v3