#include "Set.hpp"
#include <iostream> /* template <unsigned int i, unsigned int ...set> struct MexSearch { static constexpr unsigned int value = (IsMemberInSet<i, set...>::is_member) ? MexSearch<i+1,set...>::value : i; }; */ template <unsigned int i, unsigned int ...set> struct MexSearch; template <unsigned int i, bool isMember, unsigned int ...set> struct MexSelect; template <unsigned int i, unsigned int ...set> struct MexSelect<i, true, set...> { static constexpr unsigned int value = MexSearch<i+1, set...>::value; }; template <unsigned int i, unsigned int ...set> struct MexSelect<i, false, set...> { static constexpr unsigned int value = i; }; template <unsigned int i, unsigned int ...set> struct MexSearch { static constexpr bool found = IsMemberInSet<i, set...>::is_member; static constexpr unsigned int value = MexSelect<i, found, set...>::value; }; template <unsigned int ...set> struct Mex { static constexpr unsigned int value = MexSearch<0, set...>::value; }; int main() { std::cout << "Mex<0, 1, 3, 4>::value = " << Mex<0, 1, 3, 4>::value << std::endl; std::cout << "Mex<0, 1, 2, 3, 4>::value = " << Mex<0, 1, 2, 3, 4>::value << std::endl; std::cout << "Mex<>::value = " << Mex<>::value << std::endl; std::cout << Nim<4, 2, 3, 4, 5>::value << std::endl; std::cout << Nim<14, 2, 5, 6>::value << std::endl; } |