[llvm] [ADT] Make set_subtract more efficient when subtrahend is larger (NFC) (PR #98702)
Jakub Kuderski via llvm-commits
llvm-commits at lists.llvm.org
Sat Jul 13 11:23:09 PDT 2024
================
@@ -92,9 +92,27 @@ S1Ty set_difference(const S1Ty &S1, const S2Ty &S2) {
return Result;
}
+/// set_subtract_vec(A, B) - Compute A := A - B, where B can be a vector.
+///
+template <class S1Ty, class S2Ty>
+void set_subtract_vec(S1Ty &S1, const S2Ty &S2) {
+ for (typename S2Ty::const_iterator SI = S2.begin(), SE = S2.end(); SI != SE;
+ ++SI)
+ S1.erase(*SI);
+}
+
/// set_subtract(A, B) - Compute A := A - B
///
+/// Selects the set to iterate based on the relative sizes of A and B for better
+/// efficiency.
+///
template <class S1Ty, class S2Ty> void set_subtract(S1Ty &S1, const S2Ty &S2) {
+ if (S1.size() < S2.size()) {
+ for (typename S1Ty::iterator SI = S1.begin(), SE = S1.end(); SI != SE; ++SI)
+ if (S2.count(*SI))
+ S1.erase(SI);
+ return;
+ }
----------------
kuhar wrote:
This makes sense to me in the absence of more standardized type traits we could use.
https://github.com/llvm/llvm-project/pull/98702
More information about the llvm-commits
mailing list