//===- llvm/ADT/PointerEmbeddedInt.h ----------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef LLVM_ADT_POINTEREMBEDDEDINT_H #define LLVM_ADT_POINTEREMBEDDEDINT_H #include "llvm/ADT/DenseMapInfo.h" #include "llvm/Support/MathExtras.h" #include "llvm/Support/PointerLikeTypeTraits.h" #include <cassert> #include <climits> #include <cstdint> #include <type_traits> namespace llvm { /// Utility to embed an integer into a pointer-like type. This is specifically /// intended to allow embedding integers where fewer bits are required than /// exist in a pointer, and the integer can participate in abstractions along /// side other pointer-like types. For example it can be placed into a \c /// PointerSumType or \c PointerUnion. /// /// Note that much like pointers, an integer value of zero has special utility /// due to boolean conversions. For example, a non-null value can be tested for /// in the above abstractions without testing the particular active member. /// Also, the default constructed value zero initializes the integer. template <typename IntT, int Bits = sizeof(IntT) * CHAR_BIT> class PointerEmbeddedInt { … }; // Provide pointer like traits to support use with pointer unions and sum // types. PointerLikeTypeTraits<PointerEmbeddedInt<IntT, Bits>>; // Teach DenseMap how to use PointerEmbeddedInt objects as keys if the Int type // itself can be a key. DenseMapInfo<PointerEmbeddedInt<IntT, Bits>>; } // end namespace llvm #endif // LLVM_ADT_POINTEREMBEDDEDINT_H