<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>