#pragma once #include "enchantum.hpp" #include #include namespace enchantum { #if 0 namespace details { template constexpr auto cartesian_product() { constexpr auto size = []() { std::size_t x = range; std::size_t n = sets; while (--n != 0) x *= range; return x; }(); std::array, size> products{}; std::array counter{}; for (auto& product : products) { product = counter; ++counter.back(); for (std::size_t i = counter.size() - 1; i != 0; i--) { if (counter[i] != range) break; counter[i] = 0; ++counter[i - 1]; } } return products; } } // namespace details #endif #if 0 template Func> constexpr auto visit(Func func, E e) noexcept(std::is_nothrow_invocable_v) { using Ret = decltype(func(e)); return [&](std::index_sequence) { if ((values[Idx] == enums)) (func(std::integral_constant[Idx]> {}), ...); }(std::make_index_sequence>()); } template Func> constexpr auto visit(Func func, Enums... enums) noexcept(std::is_nothrow_invocable_v) { using Ret = decltype(func(enums...)); return [&](std::index_sequence) { if ((values[Idx] == enums) && ...) (func(std::integral_constant[Idx]> {}), ...); }(std::make_index_sequence>()...); } #endif namespace details { template constexpr auto for_each(Func& f, std::index_sequence) { (void)(f(std::integral_constant[I]> {}), ...); } } // namespace details template constexpr void for_each(Func f) // intentional not const { details::for_each(f, std::make_index_sequence>{}); } } // namespace enchantum