PointerLikeTypeTraits.h revision 193323
1//===- llvm/Support/PointerLikeTypeTraits.h - Pointer Traits ----*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9// 10// This file defines the PointerLikeTypeTraits class. This allows data 11// structures to reason about pointers and other things that are pointer sized. 12// 13//===----------------------------------------------------------------------===// 14 15#ifndef LLVM_SUPPORT_POINTERLIKETYPETRAITS_H 16#define LLVM_SUPPORT_POINTERLIKETYPETRAITS_H 17 18#include "llvm/Support/DataTypes.h" 19 20namespace llvm { 21 22/// PointerLikeTypeTraits - This is a traits object that is used to handle 23/// pointer types and things that are just wrappers for pointers as a uniform 24/// entity. 25template <typename T> 26class PointerLikeTypeTraits { 27 // getAsVoidPointer 28 // getFromVoidPointer 29 // getNumLowBitsAvailable 30}; 31 32// Provide PointerLikeTypeTraits for non-cvr pointers. 33template<typename T> 34class PointerLikeTypeTraits<T*> { 35public: 36 static inline void *getAsVoidPointer(T* P) { return P; } 37 static inline T *getFromVoidPointer(void *P) { 38 return static_cast<T*>(P); 39 } 40 41 /// Note, we assume here that malloc returns objects at least 8-byte aligned. 42 /// However, this may be wrong, or pointers may be from something other than 43 /// malloc. In this case, you should specialize this template to reduce this. 44 /// 45 /// All clients should use assertions to do a run-time check to ensure that 46 /// this is actually true. 47 enum { NumLowBitsAvailable = 2 }; 48}; 49 50// Provide PointerLikeTypeTraits for const pointers. 51template<typename T> 52class PointerLikeTypeTraits<const T*> { 53public: 54 static inline const void *getAsVoidPointer(const T* P) { return P; } 55 static inline const T *getFromVoidPointer(const void *P) { 56 return static_cast<const T*>(P); 57 } 58 enum { NumLowBitsAvailable = 2 }; 59}; 60 61// Provide PointerLikeTypeTraits for uintptr_t. 62template<> 63class PointerLikeTypeTraits<uintptr_t> { 64public: 65 static inline void *getAsVoidPointer(uintptr_t P) { 66 return reinterpret_cast<void*>(P); 67 } 68 static inline uintptr_t getFromVoidPointer(void *P) { 69 return reinterpret_cast<uintptr_t>(P); 70 } 71 // No bits are available! 72 enum { NumLowBitsAvailable = 0 }; 73}; 74 75} // end namespace llvm 76 77#endif 78