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 20 namespace 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. 25 template <typename T> 26 class PointerLikeTypeTraits { 27 // getAsVoidPointer 28 // getFromVoidPointer 29 // getNumLowBitsAvailable 30 }; 31 32 // Provide PointerLikeTypeTraits for non-cvr pointers. 33 template<typename T> 34 class PointerLikeTypeTraits<T*> { 35 public: getAsVoidPointer(T * P)36 static inline void *getAsVoidPointer(T *P) { return P; } getFromVoidPointer(void * P)37 static inline T *getFromVoidPointer(void *P) { return static_cast<T *>(P); } 38 39 /// Note, we assume here that malloc returns objects at least 4-byte aligned. 40 /// However, this may be wrong, or pointers may be from something other than 41 /// malloc. In this case, you should specialize this template to reduce this. 42 /// 43 /// All clients should use assertions to do a run-time check to ensure that 44 /// this is actually true. 45 enum { NumLowBitsAvailable = 2 }; 46 }; 47 48 // Provide PointerLikeTypeTraits for const pointers. 49 template<typename T> 50 class PointerLikeTypeTraits<const T*> { 51 typedef PointerLikeTypeTraits<T*> NonConst; 52 53 public: getAsVoidPointer(const T * P)54 static inline const void *getAsVoidPointer(const T* P) { 55 return NonConst::getAsVoidPointer(const_cast<T*>(P)); 56 } getFromVoidPointer(const void * P)57 static inline const T *getFromVoidPointer(const void *P) { 58 return NonConst::getFromVoidPointer(const_cast<void*>(P)); 59 } 60 enum { NumLowBitsAvailable = NonConst::NumLowBitsAvailable }; 61 }; 62 63 // Provide PointerLikeTypeTraits for uintptr_t. 64 template<> 65 class PointerLikeTypeTraits<uintptr_t> { 66 public: getAsVoidPointer(uintptr_t P)67 static inline void *getAsVoidPointer(uintptr_t P) { 68 return reinterpret_cast<void*>(P); 69 } getFromVoidPointer(void * P)70 static inline uintptr_t getFromVoidPointer(void *P) { 71 return reinterpret_cast<uintptr_t>(P); 72 } 73 // No bits are available! 74 enum { NumLowBitsAvailable = 0 }; 75 }; 76 77 } // end namespace llvm 78 79 #endif 80