1193323Sed//===-- llvm/ADT/SetOperations.h - Generic Set Operations -------*- C++ -*-===// 2193323Sed// 3193323Sed// The LLVM Compiler Infrastructure 4193323Sed// 5193323Sed// This file is distributed under the University of Illinois Open Source 6193323Sed// License. See LICENSE.TXT for details. 7193323Sed// 8193323Sed//===----------------------------------------------------------------------===// 9193323Sed// 10193323Sed// This file defines generic set operations that may be used on set's of 11193323Sed// different types, and different element types. 12193323Sed// 13193323Sed//===----------------------------------------------------------------------===// 14193323Sed 15193323Sed#ifndef LLVM_ADT_SETOPERATIONS_H 16193323Sed#define LLVM_ADT_SETOPERATIONS_H 17193323Sed 18193323Sednamespace llvm { 19193323Sed 20193323Sed/// set_union(A, B) - Compute A := A u B, return whether A changed. 21193323Sed/// 22193323Sedtemplate <class S1Ty, class S2Ty> 23193323Sedbool set_union(S1Ty &S1, const S2Ty &S2) { 24193323Sed bool Changed = false; 25193323Sed 26193323Sed for (typename S2Ty::const_iterator SI = S2.begin(), SE = S2.end(); 27193323Sed SI != SE; ++SI) 28193323Sed if (S1.insert(*SI).second) 29193323Sed Changed = true; 30193323Sed 31193323Sed return Changed; 32193323Sed} 33193323Sed 34193323Sed/// set_intersect(A, B) - Compute A := A ^ B 35193323Sed/// Identical to set_intersection, except that it works on set<>'s and 36193323Sed/// is nicer to use. Functionally, this iterates through S1, removing 37193323Sed/// elements that are not contained in S2. 38193323Sed/// 39193323Sedtemplate <class S1Ty, class S2Ty> 40193323Sedvoid set_intersect(S1Ty &S1, const S2Ty &S2) { 41193323Sed for (typename S1Ty::iterator I = S1.begin(); I != S1.end();) { 42193323Sed const typename S1Ty::key_type &E = *I; 43193323Sed ++I; 44193323Sed if (!S2.count(E)) S1.erase(E); // Erase element if not in S2 45193323Sed } 46193323Sed} 47193323Sed 48193323Sed/// set_difference(A, B) - Return A - B 49193323Sed/// 50193323Sedtemplate <class S1Ty, class S2Ty> 51193323SedS1Ty set_difference(const S1Ty &S1, const S2Ty &S2) { 52193323Sed S1Ty Result; 53193323Sed for (typename S1Ty::const_iterator SI = S1.begin(), SE = S1.end(); 54193323Sed SI != SE; ++SI) 55193323Sed if (!S2.count(*SI)) // if the element is not in set2 56193323Sed Result.insert(*SI); 57193323Sed return Result; 58193323Sed} 59193323Sed 60193323Sed/// set_subtract(A, B) - Compute A := A - B 61193323Sed/// 62193323Sedtemplate <class S1Ty, class S2Ty> 63193323Sedvoid set_subtract(S1Ty &S1, const S2Ty &S2) { 64193323Sed for (typename S2Ty::const_iterator SI = S2.begin(), SE = S2.end(); 65193323Sed SI != SE; ++SI) 66193323Sed S1.erase(*SI); 67193323Sed} 68193323Sed 69193323Sed} // End llvm namespace 70193323Sed 71193323Sed#endif 72