00001 #ifndef SEXP_RAWPTR
00002 #define SEXP_RAWPTR
00003
00004 #include <stdint.h>
00005
00006 static inline void *SEXP_rawptr_mask(void *ptr, uintptr_t mask)
00007 {
00008 return (void *)((uintptr_t)(ptr) & mask);
00009 }
00010
00011 #define SEXP_rawptr_maskT(T, ptr, mask) ((T *)SEXP_rawptr_mask((void *)(ptr), mask))
00012
00013 static inline void *SEXP_rawptr_merge(void *ptr, uintptr_t bits)
00014 {
00015 return (void *)(((uintptr_t)(ptr) | bits));
00016 }
00017
00018 #define SEXP_rawptr_mergeT(T, ptr, bits) ((T *)SEXP_rawptr_merge((void *)(ptr), bits))
00019
00020 static inline void *SEXP_rawptr_safemerge(void *ptr, uintptr_t bits, uintptr_t mask)
00021 {
00022 return (void *)(((uintptr_t)SEXP_rawptr_mask(ptr, mask))|(~mask & bits));
00023 }
00024
00025 #define SEXP_rawptr_safemergeT(T, ptr, bits, mask) ((T *)SEXP_rawptr_safemerge((void *)(ptr), bits, mask))
00026
00027 static inline bool SEXP_rawptr_bit(void *ptr, int n)
00028 {
00029 return (bool)(((uintptr_t)(ptr)) & (1 << n));
00030 }
00031
00032 static inline uintptr_t SEXP_rawptr_bitmask(void *ptr, uintptr_t mask)
00033 {
00034 return ((uintptr_t)(ptr)) & mask;
00035 }
00036
00037 #endif