// Copyright (c) 1994 James Clark // See the file COPYING for copying permission. #ifndef Ptr_INCLUDED #define Ptr_INCLUDED 1 #include "Boolean.h" // T must have Resource as a public base class // T may be an incomplete type #ifdef SP_NAMESPACE namespace SP_NAMESPACE { #endif template class Ptr { public: Ptr() : ptr_(0) { } Ptr(T *ptr); ~Ptr(); Ptr(const Ptr &); Ptr &operator=(const Ptr &); Ptr &operator=(T *); T *pointer() const { return ptr_; } T *operator->() const { return ptr_; } T &operator*() const { return *ptr_; } void swap(Ptr &p) { T *tem = p.ptr_; p.ptr_ = ptr_; ptr_ = tem; } Boolean isNull() const { return ptr_ == 0; } // operator const void *() const { return ptr_; } void clear(); Boolean operator==(const Ptr &p) const { return ptr_ == p.ptr_; } Boolean operator!=(const Ptr &p) const { return ptr_ != p.ptr_; } Boolean operator==(const T *p) const { return ptr_ == p; } Boolean operator!=(const T *p) const { return ptr_ != p; } private: T *ptr_; }; template class ConstPtr : private Ptr { public: ConstPtr() { } ConstPtr(T *ptr) : Ptr(ptr) { } ConstPtr(const Ptr &p) : Ptr(p) { } ConstPtr(const ConstPtr &p) : Ptr(p) { } ConstPtr &operator=(const Ptr &p) { Ptr::operator=(p); return *this; } ConstPtr &operator=(const ConstPtr &p) { Ptr::operator=(p); return *this; } ConstPtr &operator=(T *p) { Ptr::operator=(p); return *this; } const T *pointer() const { return Ptr::pointer(); } const T *operator->() const { return Ptr::pointer(); } const T &operator*() const { return *Ptr::pointer(); } void swap(ConstPtr &p) { Ptr::swap(p); } using Ptr::isNull; using Ptr::clear; Boolean operator==(const Ptr &p) const { return Ptr::operator==(p); } Boolean operator!=(const Ptr &p) const { return Ptr::operator!=(p); } Boolean operator==(const ConstPtr &p) const { return Ptr::operator==(p); } Boolean operator!=(const ConstPtr &p) const { return Ptr::operator!=(p); } }; #ifdef SP_NAMESPACE } #endif #endif /* not Ptr_INCLUDED */ #ifdef SP_DEFINE_TEMPLATES #include "Ptr.cxx" #endif