X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FADT%2FSetOperations.h;h=7c9f2fbe066e2b9516518b2ddb29b9690406312a;hb=44fb5881d8edf448d6231a5b8df583aecd6bcd42;hp=3a5e6f2bd46f12d6f51cadaa7e189ce89aaa41de;hpb=a9f6e4ae0eaea69949755807b7207177f256eace;p=oota-llvm.git diff --git a/include/llvm/ADT/SetOperations.h b/include/llvm/ADT/SetOperations.h index 3a5e6f2bd46..7c9f2fbe066 100644 --- a/include/llvm/ADT/SetOperations.h +++ b/include/llvm/ADT/SetOperations.h @@ -1,17 +1,26 @@ -//===-- Support/SetOperations.h - Generic Set Operations ---------*- C++ -*--=// +//===-- llvm/ADT/SetOperations.h - Generic Set Operations -------*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// // // This file defines generic set operations that may be used on set's of // different types, and different element types. // //===----------------------------------------------------------------------===// -#ifndef SUPPORT_SETOPERATIONS_H -#define SUPPORT_SETOPERATIONS_H +#ifndef LLVM_ADT_SETOPERATIONS_H +#define LLVM_ADT_SETOPERATIONS_H -// set_union(A, B) - Compute A := A u B, return whether A changed. -// +namespace llvm { + +/// set_union(A, B) - Compute A := A u B, return whether A changed. +/// template -bool set_union(S1Ty &S1, const S2Ty &S2) { +bool set_union(S1Ty &S1, const S2Ty &S2) { bool Changed = false; for (typename S2Ty::const_iterator SI = S2.begin(), SE = S2.end(); @@ -22,22 +31,22 @@ bool set_union(S1Ty &S1, const S2Ty &S2) { return Changed; } -// set_intersect(A, B) - Compute A := A ^ B -// Identical to set_intersection, except that it works on set<>'s and -// is nicer to use. Functionally, this iterates through S1, removing -// elements that are not contained in S2. -// -template class S1Ty, class ETy, class S2Ty> -void set_intersect(S1Ty &S1, const S2Ty &S2) { - for (typename S1Ty::iterator I = S1.begin(); I != S1.end();) { - const ETy &E = *I; - ++I; - if (!S2.count(E)) S1.erase(E); // Erase element if not in S2 - } +/// set_intersect(A, B) - Compute A := A ^ B +/// Identical to set_intersection, except that it works on set<>'s and +/// is nicer to use. Functionally, this iterates through S1, removing +/// elements that are not contained in S2. +/// +template +void set_intersect(S1Ty &S1, const S2Ty &S2) { + for (typename S1Ty::iterator I = S1.begin(); I != S1.end();) { + const auto &E = *I; + ++I; + if (!S2.count(E)) S1.erase(E); // Erase element if not in S2 + } } -// set_difference(A, B) - Return A - B -// +/// set_difference(A, B) - Return A - B +/// template S1Ty set_difference(const S1Ty &S1, const S2Ty &S2) { S1Ty Result; @@ -48,13 +57,15 @@ S1Ty set_difference(const S1Ty &S1, const S2Ty &S2) { return Result; } -// set_subtract(A, B) - Compute A := A - B -// +/// set_subtract(A, B) - Compute A := A - B +/// template -void set_subtract(S1Ty &S1, const S2Ty &S2) { +void set_subtract(S1Ty &S1, const S2Ty &S2) { for (typename S2Ty::const_iterator SI = S2.begin(), SE = S2.end(); - SI != SE; ++SI) + SI != SE; ++SI) S1.erase(*SI); } +} // End llvm namespace + #endif