[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