// SPDX-FileCopyrightText: Copyright 2019 yuzu Emulator Project // SPDX-License-Identifier: GPL-2.0-or-later #pragma once #include #include // Algorithms that operate on iterators, much like the header. // // Note: If the algorithm is not general-purpose and/or doesn't operate on iterators, // it should probably not be placed within this header. namespace Common { template > [[nodiscard]] ForwardIt BinaryFind(ForwardIt first, ForwardIt last, const T& value, Compare comp = {}) { // Note: BOTH type T and the type after ForwardIt is dereferenced // must be implicitly convertible to BOTH Type1 and Type2, used in Compare. // This is stricter than lower_bound requirement (see above) first = std::lower_bound(first, last, value, comp); return first != last && !comp(value, *first) ? first : last; } template T FoldRight(T initial_value, Func&& func, Args&&... args) { T value{initial_value}; const auto high_func = [&value, &func](U x) { value = func(value, x); }; (std::invoke(high_func, std::forward(args)), ...); return value; } } // namespace Common