00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #ifndef U_POINTER_H
00029 #define U_POINTER_H
00030
00031 #include "pipe/p_compiler.h"
00032
00033 #ifdef __cplusplus
00034 extern "C" {
00035 #endif
00036
00037 static INLINE intptr_t
00038 pointer_to_intptr( const void *p )
00039 {
00040 union {
00041 const void *p;
00042 intptr_t i;
00043 } pi;
00044 pi.p = p;
00045 return pi.i;
00046 }
00047
00048 static INLINE void *
00049 intptr_to_pointer( intptr_t i )
00050 {
00051 union {
00052 void *p;
00053 intptr_t i;
00054 } pi;
00055 pi.i = i;
00056 return pi.p;
00057 }
00058
00059 static INLINE uintptr_t
00060 pointer_to_uintptr( const void *ptr )
00061 {
00062 union {
00063 const void *p;
00064 uintptr_t u;
00065 } pu;
00066 pu.p = ptr;
00067 return pu.u;
00068 }
00069
00070 static INLINE void *
00071 uintptr_to_pointer( uintptr_t u )
00072 {
00073 union {
00074 void *p;
00075 uintptr_t u;
00076 } pu;
00077 pu.u = u;
00078 return pu.p;
00079 }
00080
00084 static INLINE void *
00085 align_pointer( const void *unaligned, uintptr_t alignment )
00086 {
00087 uintptr_t aligned = (pointer_to_uintptr( unaligned ) + alignment - 1) & ~(alignment - 1);
00088 return uintptr_to_pointer( aligned );
00089 }
00090
00091
00095 static INLINE void *
00096 align16( void *unaligned )
00097 {
00098 return align_pointer( unaligned, 16 );
00099 }
00100
00101
00102
00103 #ifdef __cplusplus
00104 }
00105 #endif
00106
00107 #endif