// Copyright (C) 1993-2002 David R. Cheriton. All rights reserved. #ifndef __PTR_H_ #define __PTR_H_ template class Ptr { public: Ptr(T* rawPtr = 0); Ptr(const Ptr& ptr); ~Ptr(); void operator =(const Ptr& ptr); bool operator ==(const Ptr& ptr) const { return rawPtr_ == ptr.rawPtr_; } bool operator !=(const Ptr& ptr) const { return rawPtr_ != ptr.rawPtr_; } const T* operator ->() const { return rawPtr_; } T* operator ->() { return rawPtr_; } T* value() const { return rawPtr_; } template operator Ptr() const { return Ptr(rawPtr_); } protected: T* rawPtr_; }; template Ptr ptr_cast(Ptr other) { return dynamic_cast(other.value()); } #endif // Copyright (C) 1993-2002 David R. Cheriton. All rights reserved. #ifndef __PTR_IN_ #define __PTR_IN_ #include "Ptr.h" template Ptr::Ptr(T* rawPtr) : rawPtr_(rawPtr) { if (rawPtr != 0) { rawPtr_->newRef(); } } template Ptr::Ptr(const Ptr& ptr) : rawPtr_(ptr.rawPtr_) { if (rawPtr_ != 0) { rawPtr_->newRef(); } } template Ptr::~Ptr() { if (rawPtr_ != 0) { rawPtr_->deleteRef(); } } template void Ptr::operator =(const Ptr& ptr) { const T* save = rawPtr_; rawPtr_ = ptr.rawPtr_; if (rawPtr_ != 0) { rawPtr_->newRef(); } if (save != 0) { save->deleteRef(); } } #endif