blob: dc6e0d6029efa6e75857ddd5c1d75fa570879697 [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
18// set_union(A, B) - Compute A := A u B, return whether A changed.
19//
20template <class S1Ty, class S2Ty>
21bool set_union(S1Ty &S1, const S2Ty &S2) {
22 bool Changed = false;
23
24 for (typename S2Ty::const_iterator SI = S2.begin(), SE = S2.end();
25 SI != SE; ++SI)
26 if (S1.insert(*SI).second)
27 Changed = true;
28
29 return Changed;
30}
31
32// set_intersect(A, B) - Compute A := A ^ B
33// Identical to set_intersection, except that it works on set<>'s and
34// is nicer to use. Functionally, this iterates through S1, removing
35// elements that are not contained in S2.
36//
37template <template<class S1ElTy> class S1Ty, class ETy, class S2Ty>
38void set_intersect(S1Ty<ETy> &S1, const S2Ty &S2) {
39 for (typename S1Ty<ETy>::iterator I = S1.begin(); I != S1.end();) {
40 const ETy &E = *I;
41 ++I;
42 if (!S2.count(E)) S1.erase(E); // Erase element if not in S2
43 }
44}
45
46// set_difference(A, B) - Return A - B
47//
48template <class S1Ty, class S2Ty>
49S1Ty set_difference(const S1Ty &S1, const S2Ty &S2) {
50 S1Ty Result;
51 for (typename S1Ty::const_iterator SI = S1.begin(), SE = S1.end();
52 SI != SE; ++SI)
53 if (!S2.count(*SI)) // if the element is not in set2
54 Result.insert(*SI);
55 return Result;
56}
57
58// set_subtract(A, B) - Compute A := A - B
59//
60template <class S1Ty, class S2Ty>
61void set_subtract(S1Ty &S1, const S2Ty &S2) {
62 for (typename S2Ty::const_iterator SI = S2.begin(), SE = S2.end();
63 SI != SE; ++SI)
64 S1.erase(*SI);
65}
66
67#endif