#ifndef PRIMES_HPP #define PRIMES_HPP #include #include namespace primes_impl { using Integer = std::size_t; template constexpr bool is_prime(Integer candidate) { return candidate % prime; } template constexpr bool is_prime(Integer candidate) { if (candidate % prime == 0) return false; return is_prime(candidate); } template constexpr Integer seek_prime(Integer candidate) { if (is_prime(candidate)) return candidate; return seek_prime(candidate + 1); } template struct sequence { using next = sequence< seek_prime(prime + 1), prime, primes... >; }; template struct gen_sequence { using type = typename gen_sequence::type::next; }; template<> struct gen_sequence<0> { using type = sequence<2>; }; } // namespace primes_impl /* note that this generates a reversed sequence of primes, e.g. make_primes_sequence<3> delivers primes_sequence<5, 3, 2> */ template using make_primes_sequence = typename primes_impl::gen_sequence::type; template using primes_sequence = typename primes_impl::sequence; #endif