A discriminated union of two or more pointer types, with the discriminator in the low bit of the pointer.
More...
|
| 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. More...
|
|
| operator bool () const |
|
template<typename T > |
bool | is () const |
| Test if the Union currently holds the type matching T. More...
|
|
template<typename T > |
T | get () const |
| Returns the value of the specified pointer type. More...
|
|
template<typename T > |
T | dyn_cast () const |
| Returns the current pointer if it is of the specified pointer type, otherwise returns null. More...
|
|
First const * | getAddrOfPtr1 () const |
| If the union is set to the first pointer type get an address pointing to it. More...
|
|
First * | getAddrOfPtr1 () |
| If the union is set to the first pointer type get an address pointing to it. More...
|
|
const PointerUnion & | operator= (std::nullptr_t) |
| Assignment from nullptr which just clears the union. More...
|
|
void * | getOpaqueValue () const |
|
template<typename... PTs>
class wpi::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.