X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FADT%2FSetVector.h;h=a7fd408c854a743db3d320d4ac467fc305add151;hb=00552e3875ee5f382db6c98286a241a7d0efe1b8;hp=e8d63edf9e5c02f14d530ff64f9d140b3acbfb17;hpb=5c5b3cf5b8af06b8e9347f3f45e8c67438ffd446;p=oota-llvm.git diff --git a/include/llvm/ADT/SetVector.h b/include/llvm/ADT/SetVector.h index e8d63edf9e5..a7fd408c854 100644 --- a/include/llvm/ADT/SetVector.h +++ b/include/llvm/ADT/SetVector.h @@ -100,7 +100,7 @@ public: /// \brief Insert a new element into the SetVector. /// \returns true iff the element was inserted into the SetVector. bool insert(const value_type &X) { - bool result = set_.insert(X); + bool result = set_.insert(X).second; if (result) vector_.push_back(X); return result; @@ -110,7 +110,7 @@ public: template void insert(It Start, It End) { for (; Start != End; ++Start) - if (set_.insert(*Start)) + if (set_.insert(*Start).second) vector_.push_back(*Start); } @@ -141,14 +141,12 @@ public: /// \returns true if any element is removed. template bool remove_if(UnaryPredicate P) { - typename vector_type::iterator B = std::remove_if(vector_.begin(), - vector_.end(), P), - E = vector_.end(); - if (B == E) + typename vector_type::iterator I + = std::remove_if(vector_.begin(), vector_.end(), + TestAndEraseFromSet(P, set_)); + if (I == vector_.end()) return false; - for (typename vector_type::iterator I = B; I != E; ++I) - set_.erase(*I); - vector_.erase(B, E); + vector_.erase(I, vector_.end()); return true; } @@ -172,7 +170,7 @@ public: vector_.pop_back(); } - T pop_back_val() { + T LLVM_ATTRIBUTE_UNUSED_RESULT pop_back_val() { T Ret = back(); pop_back(); return Ret; @@ -187,6 +185,28 @@ public: } private: + /// \brief A wrapper predicate designed for use with std::remove_if. + /// + /// This predicate wraps a predicate suitable for use with std::remove_if to + /// call set_.erase(x) on each element which is slated for removal. + template + class TestAndEraseFromSet { + UnaryPredicate P; + set_type &set_; + + public: + TestAndEraseFromSet(UnaryPredicate P, set_type &set_) : P(P), set_(set_) {} + + template + bool operator()(const ArgumentT &Arg) { + if (P(Arg)) { + set_.erase(Arg); + return true; + } + return false; + } + }; + set_type set_; ///< The set. vector_type vector_; ///< The vector. };