[llvm] [llvm][ADT] Add wrappers to `std::includes` (PR #143297)
Rahul Joshi via llvm-commits
llvm-commits at lists.llvm.org
Tue Jun 10 08:23:19 PDT 2025
================
@@ -1940,6 +1940,28 @@ template <typename R> bool is_sorted(R &&Range) {
return std::is_sorted(adl_begin(Range), adl_end(Range));
}
+/// Provide wrappers to std::includes which take ranges instead of having to
+/// pass begin/end explicitly.
+/// This function checks if the sorted range \p R2 is a subsequence of the
+/// sorted range \p R1. The ranges must be sorted in non-descending order.
+template <typename R1, typename R2> bool includes(R1 &&Range1, R2 &&Range2) {
+ assert(is_sorted(Range1) && "Range1 must be sorted in non-descending order");
+ assert(is_sorted(Range2) && "Range2 must be sorted in non-descending order");
+ return std::includes(adl_begin(Range1), adl_end(Range1), adl_begin(Range2),
+ adl_end(Range2));
+}
+
+/// This function checks if the sorted range \p R2 is a subsequence of the
+/// sorted range \p R1. The ranges must be sorted with respect to a comparator
+/// \p C.
+template <typename R1, typename R2, typename Compare>
+bool includes(R1 &&Range1, R2 &&Range2, Compare &&C) {
+ assert(is_sorted(Range1, C) && "Range1 must be sorted with respect to C");
----------------
jurahul wrote:
Thanks. I was thinking of the random shuffle in llvm::sort that is guarded by expensive checks even though it is also O(n) I believe. But I agree, this is needed only if it's used frequently enough in places where this consumes noticeable compile time.
https://github.com/llvm/llvm-project/pull/143297
More information about the llvm-commits
mailing list