first_unsatisfied_index.cpp 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // Copyright Louis Dionne 2013-2017
  2. // Distributed under the Boost Software License, Version 1.0.
  3. // (See accompanying file LICENSE.md or copy at http://boost.org/LICENSE_1_0.txt)
  4. #include <boost/hana/detail/first_unsatisfied_index.hpp>
  5. #include <boost/hana/not_equal.hpp>
  6. #include <laws/base.hpp>
  7. #include <type_traits>
  8. namespace hana = boost::hana;
  9. using hana::test::ct_eq;
  10. struct poison {
  11. poison() = default;
  12. poison(poison const&) = delete;
  13. };
  14. int main() {
  15. auto predicate = [](auto x) {
  16. static_assert(!std::is_same<poison, decltype(x)>::value, "");
  17. return hana::not_equal(x, ct_eq<9>{});
  18. };
  19. using Find = hana::detail::first_unsatisfied_index<decltype(predicate)>;
  20. static_assert(decltype(Find{}())::value == 0, "");
  21. static_assert(decltype(Find{}(ct_eq<9>{}))::value == 0, "");
  22. static_assert(decltype(Find{}(ct_eq<0>{}))::value == 1, "");
  23. static_assert(decltype(Find{}(ct_eq<9>{}, poison{}))::value == 0, "");
  24. static_assert(decltype(Find{}(ct_eq<0>{}, ct_eq<9>{}))::value == 1, "");
  25. static_assert(decltype(Find{}(ct_eq<0>{}, ct_eq<1>{}))::value == 2, "");
  26. static_assert(decltype(Find{}(ct_eq<9>{}, poison{}, poison{}))::value == 0, "");
  27. static_assert(decltype(Find{}(ct_eq<0>{}, ct_eq<9>{}, poison{}))::value == 1, "");
  28. static_assert(decltype(Find{}(ct_eq<0>{}, ct_eq<1>{}, ct_eq<9>{}))::value == 2, "");
  29. static_assert(decltype(Find{}(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}))::value == 3, "");
  30. static_assert(decltype(Find{}(ct_eq<9>{}, poison{}, poison{}, poison{}))::value == 0, "");
  31. static_assert(decltype(Find{}(ct_eq<0>{}, ct_eq<9>{}, poison{}, poison{}))::value == 1, "");
  32. static_assert(decltype(Find{}(ct_eq<0>{}, ct_eq<1>{}, ct_eq<9>{}, poison{}))::value == 2, "");
  33. static_assert(decltype(Find{}(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<9>{}))::value == 3, "");
  34. static_assert(decltype(Find{}(ct_eq<0>{}, ct_eq<1>{}, ct_eq<2>{}, ct_eq<3>{}))::value == 4, "");
  35. }