LLVM 19.0.0git
Public Member Functions | Static Public Member Functions | Friends | List of all members
llvm::PointerUnion< PTs > Class Template Reference

A discriminated union of two or more pointer types, with the discriminator in the low bit of the pointer. More...

#include "llvm/ADT/PointerUnion.h"

Inheritance diagram for llvm::PointerUnion< PTs >:
Inheritance graph
[legend]

Public Member Functions

 PointerUnion ()=default
 
 PointerUnion (std::nullptr_t)
 
bool isNull () const
 Test if the pointer held in the union is null, regardless of which type it is.
 
 operator bool () const
 
template<typename T >
bool is () const
 Test if the Union currently holds the type matching T.
 
template<typename T >
T get () const
 Returns the value of the specified pointer type.
 
template<typename T >
T dyn_cast () const
 Returns the current pointer if it is of the specified pointer type, otherwise returns null.
 
First constgetAddrOfPtr1 () const
 If the union is set to the first pointer type get an address pointing to it.
 
First * getAddrOfPtr1 ()
 If the union is set to the first pointer type get an address pointing to it.
 
const PointerUnionoperator= (std::nullptr_t)
 Assignment from nullptr which just clears the union.
 
void * getOpaqueValue () const
 

Static Public Member Functions

static PointerUnion getFromOpaqueValue (void *VP)
 

Friends

struct CastInfoPointerUnionImpl< PTs... >
 This is needed to give the CastInfo implementation below access to protected members.
 

Detailed Description

template<typename... PTs>
class llvm::PointerUnion< PTs >

A discriminated union of two or more pointer types, with the discriminator in the low bit of the pointer.

This implementation is extremely efficient in space due to leveraging the low bits of the pointer, while exposing a natural and type-safe API.

Common use patterns would be something like this: PointerUnion<int*, float*> P; P = (int*)0; printf("%d %d", P.is<int*>(), P.is<float*>()); // prints "1 0" X = P.get<int*>(); // ok. Y = P.get<float*>(); // runtime assertion failure. Z = P.get<double*>(); // compile time failure. P = (float*)0; Y = P.get<float*>(); // ok. X = P.get<int*>(); // runtime assertion failure. PointerUnion<int*, int*> Q; // compile time failure.

Definition at line 112 of file PointerUnion.h.

Constructor & Destructor Documentation

◆ PointerUnion() [1/2]

template<typename... PTs>
llvm::PointerUnion< PTs >::PointerUnion ( )
default

◆ PointerUnion() [2/2]

template<typename... PTs>
llvm::PointerUnion< PTs >::PointerUnion ( std::nullptr_t  )
inline

Definition at line 137 of file PointerUnion.h.

Member Function Documentation

◆ dyn_cast()

template<typename... PTs>
template<typename T >
T llvm::PointerUnion< PTs >::dyn_cast ( ) const
inline

Returns the current pointer if it is of the specified pointer type, otherwise returns null.

Definition at line 162 of file PointerUnion.h.

Referenced by llvm::SIRegisterInfo::getConstrainedRegClassForOperand(), and selectDebugInstr().

◆ get()

template<typename... PTs>
template<typename T >
T llvm::PointerUnion< PTs >::get ( ) const
inline

Returns the value of the specified pointer type.

If the specified pointer type is incorrect, assert.

Definition at line 155 of file PointerUnion.h.

References assert().

Referenced by llvm::DIBuilder::insertDbgValueIntrinsic(), insertDbgValueOrDbgVariableRecord(), insertDbgValueOrDbgVariableRecordAfter(), llvm::ReplaceableMetadataImpl::replaceAllUsesWith(), and selectDebugInstr().

◆ getAddrOfPtr1() [1/2]

template<typename... PTs>
First * llvm::PointerUnion< PTs >::getAddrOfPtr1 ( )
inline

If the union is set to the first pointer type get an address pointing to it.

Definition at line 174 of file PointerUnion.h.

References assert().

◆ getAddrOfPtr1() [2/2]

template<typename... PTs>
First const * llvm::PointerUnion< PTs >::getAddrOfPtr1 ( ) const
inline

◆ getFromOpaqueValue()

template<typename... PTs>
static PointerUnion llvm::PointerUnion< PTs >::getFromOpaqueValue ( void *  VP)
inlinestatic

◆ getOpaqueValue()

template<typename... PTs>
void * llvm::PointerUnion< PTs >::getOpaqueValue ( ) const
inline

◆ is()

template<typename... PTs>
template<typename T >
bool llvm::PointerUnion< PTs >::is ( ) const
inline

◆ isNull()

template<typename... PTs>
bool llvm::PointerUnion< PTs >::isNull ( ) const
inline

◆ operator bool()

template<typename... PTs>
llvm::PointerUnion< PTs >::operator bool ( ) const
inlineexplicit

Definition at line 144 of file PointerUnion.h.

References llvm::PointerUnion< PTs >::isNull().

◆ operator=()

template<typename... PTs>
const PointerUnion & llvm::PointerUnion< PTs >::operator= ( std::nullptr_t  )
inline

Assignment from nullptr which just clears the union.

Definition at line 185 of file PointerUnion.h.

Friends And Related Function Documentation

◆ CastInfoPointerUnionImpl< PTs... >

template<typename... PTs>
friend struct CastInfoPointerUnionImpl< PTs... >
friend

This is needed to give the CastInfo implementation below access to protected members.

Refer to its definition for further details.

Definition at line 119 of file PointerUnion.h.


The documentation for this class was generated from the following file: