blob: bb1e68e6b299c9cf443831403e4d5e3e8b850012 [file] [log] [blame]
Chris Lattner48486892003-09-30 18:37:50 +00001//===-- Support/SetOperations.h - Generic Set Operations --------*- C++ -*-===//
John Criswellb2109ce2003-10-20 19:46:57 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file was developed by the LLVM research group and is distributed under
6// the University of Illinois Open Source License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
Chris Lattneredcea4b2002-02-05 03:35:10 +00009//
10// This file defines generic set operations that may be used on set's of
11// different types, and different element types.
12//
13//===----------------------------------------------------------------------===//
14
Brian Gaekea9f6e4a2003-06-17 00:35:55 +000015#ifndef SUPPORT_SETOPERATIONS_H
16#define SUPPORT_SETOPERATIONS_H
Chris Lattneredcea4b2002-02-05 03:35:10 +000017
Brian Gaeked0fde302003-11-11 22:41:34 +000018namespace llvm {
19
Chris Lattneredcea4b2002-02-05 03:35:10 +000020// set_union(A, B) - Compute A := A u B, return whether A changed.
21//
22template <class S1Ty, class S2Ty>
23bool set_union(S1Ty &S1, const S2Ty &S2) {
24 bool Changed = false;
25
26 for (typename S2Ty::const_iterator SI = S2.begin(), SE = S2.end();
27 SI != SE; ++SI)
28 if (S1.insert(*SI).second)
29 Changed = true;
30
31 return Changed;
32}
33
34// set_intersect(A, B) - Compute A := A ^ B
35// Identical to set_intersection, except that it works on set<>'s and
36// is nicer to use. Functionally, this iterates through S1, removing
37// elements that are not contained in S2.
38//
39template <template<class S1ElTy> class S1Ty, class ETy, class S2Ty>
40void set_intersect(S1Ty<ETy> &S1, const S2Ty &S2) {
41 for (typename S1Ty<ETy>::iterator I = S1.begin(); I != S1.end();) {
42 const ETy &E = *I;
43 ++I;
44 if (!S2.count(E)) S1.erase(E); // Erase element if not in S2
45 }
46}
47
48// set_difference(A, B) - Return A - B
49//
50template <class S1Ty, class S2Ty>
51S1Ty set_difference(const S1Ty &S1, const S2Ty &S2) {
52 S1Ty Result;
53 for (typename S1Ty::const_iterator SI = S1.begin(), SE = S1.end();
54 SI != SE; ++SI)
55 if (!S2.count(*SI)) // if the element is not in set2
56 Result.insert(*SI);
57 return Result;
58}
59
60// set_subtract(A, B) - Compute A := A - B
61//
62template <class S1Ty, class S2Ty>
63void set_subtract(S1Ty &S1, const S2Ty &S2) {
64 for (typename S2Ty::const_iterator SI = S2.begin(), SE = S2.end();
65 SI != SE; ++SI)
66 S1.erase(*SI);
67}
68
Brian Gaeked0fde302003-11-11 22:41:34 +000069} // End llvm namespace
70
Chris Lattneredcea4b2002-02-05 03:35:10 +000071#endif