Replace the PointerLikeTypeTraits::getNumLowBitsAvailable
[oota-llvm.git] / include / llvm / Support / PointerLikeTypeTraits.h
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 namespace llvm {
19   
20 /// PointerLikeTypeTraits - This is a traits object that is used to handle
21 /// pointer types and things that are just wrappers for pointers as a uniform
22 /// entity.
23 template <typename T>
24 class PointerLikeTypeTraits {
25   // getAsVoidPointer
26   // getFromVoidPointer
27   // getNumLowBitsAvailable
28 };
29
30 // Provide PointerLikeTypeTraits for non-cvr pointers.
31 template<typename T>
32 class PointerLikeTypeTraits<T*> {
33 public:
34   static inline void *getAsVoidPointer(T* P) { return P; }
35   static inline T *getFromVoidPointer(void *P) {
36     return static_cast<T*>(P);
37   }
38   
39   /// Note, we assume here that malloc returns objects at least 8-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 = 3 };
46 };
47   
48 // Provide PointerLikeTypeTraits for const pointers.
49 template<typename T>
50 class PointerLikeTypeTraits<const T*> {
51 public:
52   static inline const void *getAsVoidPointer(const T* P) { return P; }
53   static inline const T *getFromVoidPointer(const void *P) {
54     return static_cast<const T*>(P);
55   }
56   enum { NumLowBitsAvailable = 3 };
57 };
58   
59 } // end namespace llvm
60
61 #endif