LLVM 20.0.0git
|
A sum type over pointer-like types. More...
#include "llvm/ADT/PointerSumType.h"
Public Member Functions | |
constexpr | PointerSumType ()=default |
template<TagT N> | |
void | set (typename HelperT::template Lookup< N >::PointerT Pointer) |
A typed setter to a given tagged member of the sum type. | |
void | clear () |
Clear the value to null with the min tag type. | |
TagT | getTag () const |
template<TagT N> | |
bool | is () const |
template<TagT N> | |
HelperT::template Lookup< N >::PointerT | get () const |
template<TagT N> | |
HelperT::template Lookup< N >::PointerT | cast () const |
HelperT::template Lookup< HelperT::MinTag >::PointerT const * | getAddrOfZeroTagPointer () const |
If the tag is zero and the pointer's value isn't changed when being stored, get the address of the stored value type-punned to the zero-tag's pointer type. | |
HelperT::template Lookup< HelperT::MinTag >::PointerT * | getAddrOfZeroTagPointer () |
If the tag is zero and the pointer's value isn't changed when being stored, get the address of the stored value type-punned to the zero-tag's pointer type. | |
operator bool () const | |
bool | operator== (const PointerSumType &R) const |
bool | operator!= (const PointerSumType &R) const |
bool | operator< (const PointerSumType &R) const |
bool | operator> (const PointerSumType &R) const |
bool | operator<= (const PointerSumType &R) const |
bool | operator>= (const PointerSumType &R) const |
uintptr_t | getOpaqueValue () const |
Static Public Member Functions | |
template<TagT N> | |
static PointerSumType | create (typename HelperT::template Lookup< N >::PointerT Pointer) |
A typed constructor for a specific tagged member of the sum type. | |
Protected Member Functions | |
void * | getVoidPtr () const |
A sum type over pointer-like types.
This is a normal tagged union across pointer-like types that uses the low bits of the pointers to store the tag.
Each member of the sum type is specified by passing a PointerSumTypeMember
specialization in the variadic member argument list. This allows the user to control the particular tag value associated with a particular type, use the same type for multiple different tags, and customize the pointer-like traits used for a particular member. Note that these must be specializations of PointerSumTypeMember
, no other type will suffice, even if it provides a compatible interface.
This type implements all of the comparison operators and even hash table support by comparing the underlying storage of the pointer values. It doesn't support delegating to particular members for comparisons.
It also default constructs to a zero tag with a null pointer, whatever that would be. This means that the zero value for the tag type is significant and may be desirable to set to a state that is particularly desirable to default construct.
Having a supported zero-valued tag also enables getting the address of a pointer stored with that tag provided it is stored in its natural bit representation. This works because in the case of a zero-valued tag, the pointer's value is directly stored into this object and we can expose the address of that internal storage. This is especially useful when building an ArrayRef
of a single pointer stored in a sum type.
There is no support for constructing or accessing with a dynamic tag as that would fundamentally violate the type safety provided by the sum type.
Definition at line 70 of file PointerSumType.h.
|
constexprdefault |
|
inline |
Definition at line 131 of file PointerSumType.h.
References assert(), and llvm::PointerSumType< TagT, MemberTs >::getVoidPtr().
|
inline |
Clear the value to null with the min tag type.
Definition at line 117 of file PointerSumType.h.
|
inlinestatic |
A typed constructor for a specific tagged member of the sum type.
Definition at line 110 of file PointerSumType.h.
References N.
|
inline |
Definition at line 125 of file PointerSumType.h.
References llvm::PointerSumType< TagT, MemberTs >::getVoidPtr(), and P.
|
inline |
If the tag is zero and the pointer's value isn't changed when being stored, get the address of the stored value type-punned to the zero-tag's pointer type.
Definition at line 149 of file PointerSumType.h.
References assert(), and llvm::detail::PointerSumTypeHelper< TagT, MemberTs >::MinTag.
|
inline |
If the tag is zero and the pointer's value isn't changed when being stored, get the address of the stored value type-punned to the zero-tag's pointer type.
Definition at line 141 of file PointerSumType.h.
References llvm::PointerSumType< TagT, MemberTs >::getAddrOfZeroTagPointer().
Referenced by llvm::PointerSumType< TagT, MemberTs >::getAddrOfZeroTagPointer().
|
inline |
Definition at line 188 of file PointerSumType.h.
Referenced by llvm::PointerSumType< TagT, MemberTs >::getTag(), llvm::PointerSumType< TagT, MemberTs >::getVoidPtr(), llvm::PointerSumType< TagT, MemberTs >::operator bool(), llvm::PointerSumType< TagT, MemberTs >::operator!=(), llvm::PointerSumType< TagT, MemberTs >::operator<(), llvm::PointerSumType< TagT, MemberTs >::operator<=(), llvm::PointerSumType< TagT, MemberTs >::operator==(), llvm::PointerSumType< TagT, MemberTs >::operator>(), and llvm::PointerSumType< TagT, MemberTs >::operator>=().
|
inline |
Definition at line 119 of file PointerSumType.h.
References llvm::PointerSumType< TagT, MemberTs >::getOpaqueValue(), and llvm::detail::PointerSumTypeHelper< TagT, MemberTs >::TagMask.
Referenced by llvm::PointerSumType< TagT, MemberTs >::is().
|
inlineprotected |
Definition at line 195 of file PointerSumType.h.
References llvm::PointerSumType< TagT, MemberTs >::getOpaqueValue(), and llvm::detail::PointerSumTypeHelper< TagT, MemberTs >::PointerMask.
Referenced by llvm::PointerSumType< TagT, MemberTs >::cast(), and llvm::PointerSumType< TagT, MemberTs >::get().
|
inline |
Definition at line 123 of file PointerSumType.h.
References llvm::PointerSumType< TagT, MemberTs >::getTag(), and N.
|
inlineexplicit |
Definition at line 166 of file PointerSumType.h.
References llvm::PointerSumType< TagT, MemberTs >::getOpaqueValue(), and llvm::detail::PointerSumTypeHelper< TagT, MemberTs >::PointerMask.
|
inline |
Definition at line 172 of file PointerSumType.h.
References llvm::PointerSumType< TagT, MemberTs >::getOpaqueValue().
|
inline |
Definition at line 175 of file PointerSumType.h.
References llvm::PointerSumType< TagT, MemberTs >::getOpaqueValue().
|
inline |
Definition at line 181 of file PointerSumType.h.
References llvm::PointerSumType< TagT, MemberTs >::getOpaqueValue().
|
inline |
Definition at line 169 of file PointerSumType.h.
References llvm::PointerSumType< TagT, MemberTs >::getOpaqueValue().
|
inline |
Definition at line 178 of file PointerSumType.h.
References llvm::PointerSumType< TagT, MemberTs >::getOpaqueValue().
|
inline |
Definition at line 184 of file PointerSumType.h.
References llvm::PointerSumType< TagT, MemberTs >::getOpaqueValue().
|
inline |
A typed setter to a given tagged member of the sum type.
Definition at line 100 of file PointerSumType.h.
References assert(), N, and llvm::detail::PointerSumTypeHelper< TagT, MemberTs >::TagMask.