// Copyright (C) 2020-2024 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the // terms of the GNU General Public License as published by the // Free Software Foundation; either version 3, or (at your option) // any later version. // // This library is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License along // with this library; see the file COPYING3. If not see // . // expensive: * [1-9] * * #include "bits/main.h" template void test() { using M = typename V::mask_type; const M alternating_mask = make_alternating_mask(); COMPARE(alternating_mask[0], false); // assumption below auto&& gen = make_mask; // all_of VERIFY(all_of(M{true})); VERIFY(!all_of(alternating_mask)); VERIFY(!all_of(M{false})); using std::experimental::all_of; VERIFY(all_of(true)); VERIFY(!all_of(false)); VERIFY(sfinae_is_callable( [](auto x) -> decltype(std::experimental::all_of(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::all_of(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::all_of(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::all_of(x)) { return {}; })); // any_of VERIFY(any_of(M{true})); COMPARE(any_of(alternating_mask), M::size() > 1); VERIFY(!any_of(M{false})); using std::experimental::any_of; VERIFY(any_of(true)); VERIFY(!any_of(false)); VERIFY(sfinae_is_callable( [](auto x) -> decltype(std::experimental::any_of(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::any_of(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::any_of(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::any_of(x)) { return {}; })); // none_of VERIFY(!none_of(M{true})); COMPARE(none_of(alternating_mask), M::size() == 1); VERIFY(none_of(M{false})); using std::experimental::none_of; VERIFY(!none_of(true)); VERIFY(none_of(false)); VERIFY(sfinae_is_callable( [](auto x) -> decltype(std::experimental::none_of(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::none_of(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::none_of(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::none_of(x)) { return {}; })); // some_of VERIFY(!some_of(M{true})); VERIFY(!some_of(M{false})); if (M::size() > 1) { VERIFY(some_of(gen({true, false}))); VERIFY(some_of(gen({false, true}))); if (M::size() > 3) { VERIFY(some_of(gen({0, 0, 0, 1}))); } } using std::experimental::some_of; VERIFY(!some_of(true)); VERIFY(!some_of(false)); VERIFY(sfinae_is_callable( [](auto x) -> decltype(std::experimental::some_of(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::some_of(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::some_of(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::some_of(x)) { return {}; })); // popcount COMPARE(popcount(M{true}), int(M::size())); COMPARE(popcount(alternating_mask), int(M::size()) / 2); COMPARE(popcount(M{false}), 0); COMPARE(popcount(gen({0, 0, 1})), int(M::size()) / 3); COMPARE(popcount(gen({0, 0, 0, 1})), int(M::size()) / 4); COMPARE(popcount(gen({0, 0, 0, 0, 1})), int(M::size()) / 5); COMPARE(std::experimental::popcount(true), 1); COMPARE(std::experimental::popcount(false), 0); VERIFY(sfinae_is_callable( [](auto x) -> decltype(std::experimental::popcount(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::popcount(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::popcount(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::popcount(x)) { return {}; })); // find_first_set { M x(false); for (int i = int(M::size() / 2 - 1); i >= 0; --i) { x[i] = true; COMPARE(find_first_set(x), i) << x; } x = M(false); for (int i = int(M::size() - 1); i >= 0; --i) { x[i] = true; COMPARE(find_first_set(x), i) << x; } } COMPARE(find_first_set(M{true}), 0); if (M::size() > 1) { COMPARE(find_first_set(gen({0, 1})), 1); } if (M::size() > 2) { COMPARE(find_first_set(gen({0, 0, 1})), 2); } COMPARE(std::experimental::find_first_set(true), 0); VERIFY(sfinae_is_callable( [](auto x) -> decltype(std::experimental::find_first_set(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::find_first_set(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::find_first_set(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::find_first_set(x)) { return {}; })); // find_last_set { M x(false); for (int i = 0; i < int(M::size()); ++i) { x[i] = true; COMPARE(find_last_set(x), i) << x; } } COMPARE(find_last_set(M{true}), int(M::size()) - 1); if (M::size() > 1) { COMPARE(find_last_set(gen({1, 0})), int(M::size()) - 2 + int(M::size() & 1)); } if (M::size() > 3 && (M::size() & 3) == 0) { COMPARE(find_last_set(gen({1, 0, 0, 0})), int(M::size()) - 4 - int(M::size() & 3)); } COMPARE(std::experimental::find_last_set(true), 0); VERIFY(sfinae_is_callable( [](auto x) -> decltype(std::experimental::find_last_set(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::find_last_set(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::find_last_set(x)) { return {}; })); VERIFY(!sfinae_is_callable( [](auto x) -> decltype(std::experimental::find_last_set(x)) { return {}; })); }