00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef __MARKED_POINTER_HH
00019 # define __MARKED_POINTER_HH
00020
00021 # include <type_traits>
00022 # include <memory>
00023
00024 namespace lockfree {
00025 namespace details {
00026 template <typename T>
00027 void assert_align() {
00028 static_assert(std::alignment_of<T>::value != 1,
00029 "Pointer cannot be marked as its alignment is 1");
00030 }
00031
00032 template <typename T>
00033 bool is_marked(T* p) {
00034 assert_align<T>();
00035 return 0x1 & (size_t)p;
00036 };
00037
00038 template <typename T>
00039 T* unmarked(T* p) {
00040 assert_align<T>();
00041 return (T*)((~0x1) & (size_t)p);
00042 };
00043
00044 template <typename T>
00045 T* marked(T* p) {
00046 assert_align<T>();
00047 return (T*)(0x1 | (size_t)p);
00048 };
00049 }
00050 }
00051
00052 #endif