<div class="gmail_quote">2009/7/29 Douglas Gregor <span dir="ltr"><<a href="mailto:dgregor@apple.com">dgregor@apple.com</a>></span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

Author: dgregor<br>
Date: Wed Jul 29 13:19:47 2009<br>
New Revision: 77487<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=77487&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=77487&view=rev</a><br>
Log:<br>
Implement PointerUnion4.<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/ADT/PointerUnion.h<br>
<br>
Modified: llvm/trunk/include/llvm/ADT/PointerUnion.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/PointerUnion.h?rev=77487&r1=77486&r2=77487&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/ADT/PointerUnion.h?rev=77487&r1=77486&r2=77487&view=diff</a><br>


<br>
==============================================================================<br>
--- llvm/trunk/include/llvm/ADT/PointerUnion.h (original)<br>
+++ llvm/trunk/include/llvm/ADT/PointerUnion.h Wed Jul 29 13:19:47 2009<br>
@@ -254,6 +254,115 @@<br>
           ::NumLowBitsAvailable<br>
     };<br>
   };<br>
+<br>
+  /// PointerUnion4 - This is a pointer union of four pointer types.  See<br>
+  /// documentation for PointerUnion for usage.<br>
+  template <typename PT1, typename PT2, typename PT3, typename PT4><br>
+  class PointerUnion4 {<br>
+  public:<br>
+    typedef PointerUnion<PT1, PT2> InnerUnion1;<br>
+    typedef PointerUnion<PT3, PT4> InnerUnion2;<br>
+    typedef PointerUnion<InnerUnion1, InnerUnion2> ValTy;<br>
+  private:<br>
+    ValTy Val;<br>
+  public:<br>
+    PointerUnion4() {}<br>
+<br>
+    PointerUnion4(PT1 V) {<br>
+      Val = InnerUnion1(V);<br>
+    }<br>
+    PointerUnion4(PT2 V) {<br>
+      Val = InnerUnion1(V);<br>
+    }<br>
+    PointerUnion4(PT3 V) {<br>
+      Val = InnerUnion2(V);<br>
+    }<br>
+    PointerUnion4(PT4 V) {<br>
+      Val = InnerUnion2(V);<br>
+    }<br>
+<br>
+    /// isNull - Return true if the pointer help in the union is null,</blockquote><div><br>pointer help? Perhaps it should read "held"?<br><br>Nick<br> </div><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">


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