[llvm-commits] [llvm] r77487 - /llvm/trunk/include/llvm/ADT/PointerUnion.h

Nick Lewycky nlewycky at google.com
Wed Jul 29 11:23:00 PDT 2009


2009/7/29 Douglas Gregor <dgregor at apple.com>

> Author: dgregor
> Date: Wed Jul 29 13:19:47 2009
> New Revision: 77487
>
> URL: http://llvm.org/viewvc/llvm-project?rev=77487&view=rev
> Log:
> Implement PointerUnion4.
>
> Modified:
>    llvm/trunk/include/llvm/ADT/PointerUnion.h
>
> Modified: llvm/trunk/include/llvm/ADT/PointerUnion.h
> URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/PointerUnion.h?rev=77487&r1=77486&r2=77487&view=diff
>
>
> ==============================================================================
> --- llvm/trunk/include/llvm/ADT/PointerUnion.h (original)
> +++ llvm/trunk/include/llvm/ADT/PointerUnion.h Wed Jul 29 13:19:47 2009
> @@ -254,6 +254,115 @@
>           ::NumLowBitsAvailable
>     };
>   };
> +
> +  /// PointerUnion4 - This is a pointer union of four pointer types.  See
> +  /// documentation for PointerUnion for usage.
> +  template <typename PT1, typename PT2, typename PT3, typename PT4>
> +  class PointerUnion4 {
> +  public:
> +    typedef PointerUnion<PT1, PT2> InnerUnion1;
> +    typedef PointerUnion<PT3, PT4> InnerUnion2;
> +    typedef PointerUnion<InnerUnion1, InnerUnion2> ValTy;
> +  private:
> +    ValTy Val;
> +  public:
> +    PointerUnion4() {}
> +
> +    PointerUnion4(PT1 V) {
> +      Val = InnerUnion1(V);
> +    }
> +    PointerUnion4(PT2 V) {
> +      Val = InnerUnion1(V);
> +    }
> +    PointerUnion4(PT3 V) {
> +      Val = InnerUnion2(V);
> +    }
> +    PointerUnion4(PT4 V) {
> +      Val = InnerUnion2(V);
> +    }
> +
> +    /// isNull - Return true if the pointer help in the union is null,


pointer help? Perhaps it should read "held"?

Nick


> +    /// regardless of which type it is.
> +    bool isNull() const { return Val.isNull(); }
> +    operator bool() const { return !isNull(); }
> +
> +    /// is<T>() return true if the Union currently holds the type matching
> T.
> +    template<typename T>
> +    int is() const {
> +      // Is it PT1/PT2?
> +      if (::llvm::getPointerUnionTypeNum<PT1, PT2>((T*)0) != -1)
> +        return Val.is<InnerUnion1>() && Val.get<InnerUnion1>().is<T>();
> +      return Val.is<InnerUnion2>() && Val.get<InnerUnion2>().is<T>();
> +    }
> +
> +    /// get<T>() - Return the value of the specified pointer type. If the
> +    /// specified pointer type is incorrect, assert.
> +    template<typename T>
> +    T get() const {
> +      assert(is<T>() && "Invalid accessor called");
> +      // Is it PT1/PT2?
> +      if (::llvm::getPointerUnionTypeNum<PT1, PT2>((T*)0) != -1)
> +        return Val.get<InnerUnion1>().get<T>();
> +
> +      return Val.get<InnerUnion2>().get<T>();
> +    }
> +
> +    /// dyn_cast<T>() - If the current value is of the specified pointer
> type,
> +    /// return it, otherwise return null.
> +    template<typename T>
> +    T dyn_cast() const {
> +      if (is<T>()) return get<T>();
> +      return T();
> +    }
> +
> +    /// Assignment operators - Allow assigning into this union from either
> +    /// pointer type, setting the discriminator to remember what it came
> from.
> +    const PointerUnion4 &operator=(const PT1 &RHS) {
> +      Val = InnerUnion1(RHS);
> +      return *this;
> +    }
> +    const PointerUnion4 &operator=(const PT2 &RHS) {
> +      Val = InnerUnion1(RHS);
> +      return *this;
> +    }
> +    const PointerUnion4 &operator=(const PT3 &RHS) {
> +      Val = InnerUnion2(RHS);
> +      return *this;
> +    }
> +    const PointerUnion4 &operator=(const PT4 &RHS) {
> +      Val = InnerUnion2(RHS);
> +      return *this;
> +    }
> +
> +    void *getOpaqueValue() const { return Val.getOpaqueValue(); }
> +    static PointerUnion4 getFromOpaqueValue(void *VP) {
> +      PointerUnion4 V;
> +      V.Val = ValTy::getFromOpaqueValue(VP);
> +      return V;
> +    }
> +  };
> +
> +  // Teach SmallPtrSet that PointerUnion4 is "basically a pointer", that
> has
> +  // # low bits available = min(PT1bits,PT2bits,PT2bits)-2.
> +  template<typename PT1, typename PT2, typename PT3, typename PT4>
> +  class PointerLikeTypeTraits<PointerUnion4<PT1, PT2, PT3, PT4> > {
> +  public:
> +    static inline void *
> +    getAsVoidPointer(const PointerUnion4<PT1, PT2, PT3, PT4> &P) {
> +      return P.getOpaqueValue();
> +    }
> +    static inline PointerUnion4<PT1, PT2, PT3, PT4>
> +    getFromVoidPointer(void *P) {
> +      return PointerUnion4<PT1, PT2, PT3, PT4>::getFromOpaqueValue(P);
> +    }
> +
> +    // The number of bits available are the min of the two pointer types.
> +    enum {
> +      NumLowBitsAvailable =
> +        PointerLikeTypeTraits<typename PointerUnion4<PT1, PT2, PT3,
> PT4>::ValTy>
> +          ::NumLowBitsAvailable
> +    };
> +  };
>  }
>
>  #endif
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20090729/d05a16ba/attachment.html>


More information about the llvm-commits mailing list