marked-pointer.hpp
Go to the documentation of this file.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
00029
00030
00031
00032
00033
00034 #include <cstddef>
00035
00036 namespace Gecode { namespace Support {
00037
00039 bool marked(void* p);
00041 void* mark(void* p);
00043 void* unmark(void* p);
00045 void* fmark(void* p);
00047 void* funmark(void* p);
00049 void* ptrsplit(void* p, ptrdiff_t& m);
00051 void* ptrjoin(void* p, ptrdiff_t m);
00052
00053 forceinline bool
00054 marked(void* p) {
00055 return (reinterpret_cast<ptrdiff_t>(p) & 1) != 0;
00056 }
00057 forceinline void*
00058 mark(void* p) {
00059 assert(!marked(p));
00060 return reinterpret_cast<void*>(reinterpret_cast<ptrdiff_t>(p)+1);
00061 }
00062 forceinline void*
00063 unmark(void* p) {
00064 assert(marked(p));
00065 return reinterpret_cast<void*>(reinterpret_cast<ptrdiff_t>(p)-1);
00066 }
00067 forceinline void*
00068 fmark(void* p) {
00069 return reinterpret_cast<void*>(reinterpret_cast<ptrdiff_t>(p)|1);
00070 }
00071 forceinline void*
00072 funmark(void* p) {
00073 return reinterpret_cast<void*>(reinterpret_cast<ptrdiff_t>(p)&
00074 ~static_cast<ptrdiff_t>(1));
00075 }
00076 forceinline void*
00077 ptrsplit(void* p, ptrdiff_t& m) {
00078 ptrdiff_t mp = reinterpret_cast<ptrdiff_t>(p);
00079 m = mp & 1;
00080 return reinterpret_cast<void*>(mp & ~static_cast<ptrdiff_t>(1));
00081 }
00082 forceinline void*
00083 ptrjoin(void* p, ptrdiff_t m) {
00084 return reinterpret_cast<void*>(reinterpret_cast<ptrdiff_t>(p) | m);
00085 }
00086
00087 }}
00088
00089