[llvm-commits] [llvm] r165076 - /llvm/trunk/include/llvm/ADT/SetVector.h
Sean Silva
silvas at purdue.edu
Tue Oct 2 20:22:18 PDT 2012
Not to beat a dead horse, but another alternative here which could be
more straightforward (I'll leave it to your taste) is to use
remove_copy_if() with an output "/dev/null" iterator that deletes the
element from the set.
-- Sean Silva
On Tue, Oct 2, 2012 at 9:04 PM, Chandler Carruth <chandlerc at gmail.com> wrote:
> Author: chandlerc
> Date: Tue Oct 2 20:04:07 2012
> New Revision: 165076
>
> URL: http://llvm.org/viewvc/llvm-project?rev=165076&view=rev
> Log:
> Third try at fixing this. ;] Go back to using std::remove_if, which has
> most of the behavior we want, but wrap the predicate in one which erases
> elements from the set if they pass the predicate. Oh what I wouldn't
> give for a lambda here.
>
> Let me know if the predicate wrapping is too much magic. ;]
>
> Modified:
> llvm/trunk/include/llvm/ADT/SetVector.h
>
> Modified: llvm/trunk/include/llvm/ADT/SetVector.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/SetVector.h?rev=165076&r1=165075&r2=165076&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/ADT/SetVector.h (original)
> +++ llvm/trunk/include/llvm/ADT/SetVector.h Tue Oct 2 20:04:07 2012
> @@ -141,15 +141,12 @@
> /// \returns true if any element is removed.
> template <typename UnaryPredicate>
> bool remove_if(UnaryPredicate P) {
> - typename vector_type::iterator B = std::partition(vector_.begin(),
> - vector_.end(),
> - std::not1(P)),
> - E = vector_.end();
> - if (B == E)
> + typename vector_type::iterator I
> + = std::remove_if(vector_.begin(), vector_.end(),
> + TestAndEraseFromSet<UnaryPredicate>(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;
> }
>
> @@ -188,6 +185,29 @@
> }
>
> 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 <typename UnaryPredicate>
> + class TestAndEraseFromSet {
> + UnaryPredicate P;
> + set_type &set_;
> +
> + public:
> + typedef typename UnaryPredicate::argument_type argument_type;
> +
> + TestAndEraseFromSet(UnaryPredicate P, set_type &set_) : P(P), set_(set_) {}
> +
> + bool operator()(argument_type Arg) {
> + if (P(Arg)) {
> + set_.erase(Arg);
> + return true;
> + }
> + return false;
> + }
> + };
> +
> set_type set_; ///< The set.
> vector_type vector_; ///< The vector.
> };
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
More information about the llvm-commits
mailing list