/* ptrbit.h v1.0 (C) 2000 adolfo@di-mare.com */ #ifndef PTRBIT_H #define PTRBIT_H class ptrbit { public: ptrbit() {} ptrbit( void* x) : _p(x) {} ptrbit(const ptrbit& x) : _p(x._p) {} void* operator=(void* x) { return (_p = x); } void* ai() const { return _p; } // ai() ==> As Is void* vp() const { // vp() ==> Void Pointer return (void*) ((unsigned long)_p & ~1UL); } void set(void* p) { _p = p; } int marked() { return (int)((unsigned long)_p & 1UL); } void mark() { (unsigned long)_p |= 1UL; } void unmark() { (unsigned long)_p &= ~1UL; } static int aligned(const void *p) { return 0 == ((unsigned long)p & 1UL); } private: void operator*() {} // forbid dereferencing operator void*() { return _p; } // forbid conversion private: // ptrbit member fields void *_p; }; // ptrbit inline int operator==(const ptrbit& x, const ptrbit& y) { return x.ai() == y.ai(); } inline int operator!=(const ptrbit& x, const ptrbit& y) { return !(x == y); } // This implementation requires long to hold a pointer class ptrbit_check_that_long_holds_a_void_pointer__ { char _[sizeof(unsigned long) == sizeof(void*)]; }; #endif /* PTRBIT_H */ /* EOF: ptrbit.h */