mirror of https://github.com/CGAL/cgal
Finish the rewrite of the "bit squatting".
This commit is contained in:
parent
3901116641
commit
dfce30f55c
|
|
@ -453,7 +453,7 @@ private:
|
||||||
// ptr is composed of a pointer part and the last 2 bits.
|
// ptr is composed of a pointer part and the last 2 bits.
|
||||||
// Here is the meaning of each of the 8 cases.
|
// Here is the meaning of each of the 8 cases.
|
||||||
//
|
//
|
||||||
// value of the last 2 bits
|
// value of the last 2 bits as "Type"
|
||||||
// pointer part 0 1 2 3
|
// pointer part 0 1 2 3
|
||||||
// NULL user elt unused free_list end start/end
|
// NULL user elt unused free_list end start/end
|
||||||
// != NULL user elt block boundary free elt unused
|
// != NULL user elt block boundary free elt unused
|
||||||
|
|
@ -462,26 +462,16 @@ private:
|
||||||
|
|
||||||
enum Type { USED = 0, BLOCK_BOUNDARY = 1, FREE = 2, START_END = 3 };
|
enum Type { USED = 0, BLOCK_BOUNDARY = 1, FREE = 2, START_END = 3 };
|
||||||
|
|
||||||
// Using a union is clean and should avoid aliasing problems.
|
// The bit squatting is implemented by casting pointers to (char *), then
|
||||||
union menion {
|
// subtracting to NULL, doing bit manipulations on the resulting integer,
|
||||||
void * p;
|
// and converting back.
|
||||||
|
|
||||||
menion(void * ptr)
|
|
||||||
: p(ptr) {}
|
|
||||||
|
|
||||||
menion(void * ptr, Type type)
|
|
||||||
: p((void*) ((clean_pointer((char *) ptr)) + (int) type))
|
|
||||||
{
|
|
||||||
CGAL_precondition(0 <= type && type < 4);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static char * clean_pointer(char * p)
|
static char * clean_pointer(char * p)
|
||||||
{
|
{
|
||||||
return ((p - (char *) NULL) & ~ (std::ptrdiff_t) START_END) + (char *) NULL;
|
return ((p - (char *) NULL) & ~ (std::ptrdiff_t) START_END) + (char *) NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Returns the pointee, cleaned from the squatted bits (the last 2 bits).
|
// Returns the pointee, cleaned up from the squatted bits.
|
||||||
static pointer clean_pointee(const_pointer ptr)
|
static pointer clean_pointee(const_pointer ptr)
|
||||||
{
|
{
|
||||||
return (pointer) clean_pointer((char *) Traits::pointer(*ptr));
|
return (pointer) clean_pointer((char *) Traits::pointer(*ptr));
|
||||||
|
|
@ -497,7 +487,8 @@ private:
|
||||||
// Sets the pointer part and the type of the pointee.
|
// Sets the pointer part and the type of the pointee.
|
||||||
static void set_type(pointer ptr, void * p, Type t)
|
static void set_type(pointer ptr, void * p, Type t)
|
||||||
{
|
{
|
||||||
Traits::pointer(*ptr) = menion(p, t).p;
|
CGAL_precondition(0 <= t && t < 4);
|
||||||
|
Traits::pointer(*ptr) = (void *) ((clean_pointer((char *) p)) + (int) t);
|
||||||
}
|
}
|
||||||
|
|
||||||
// We store a vector of pointers to all allocated blocks and their sizes.
|
// We store a vector of pointers to all allocated blocks and their sizes.
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue