1 // Copyright (c) 1994 James Clark 2 // See the file COPYING for copying permission. 3 #pragma ident "%Z%%M% %I% %E% SMI" 4 5 #ifndef Ptr_INCLUDED 6 #define Ptr_INCLUDED 1 7 8 #include "Boolean.h" 9 10 // T must have Resource as a public base class 11 // T may be an incomplete type 12 13 #ifdef SP_NAMESPACE 14 namespace SP_NAMESPACE { 15 #endif 16 17 template<class T> 18 class Ptr { 19 public: Ptr()20 Ptr() : ptr_(0) { } 21 Ptr(T *ptr); 22 ~Ptr(); 23 Ptr(const Ptr<T> &); 24 Ptr<T> &operator=(const Ptr<T> &); 25 Ptr<T> &operator=(T *); pointer()26 T *pointer() const { return ptr_; } 27 T *operator->() const { return ptr_; } 28 T &operator*() const { return *ptr_; } swap(Ptr<T> & p)29 void swap(Ptr<T> &p) { 30 T *tem = p.ptr_; 31 p.ptr_ = ptr_; 32 ptr_ = tem; 33 } isNull()34 Boolean isNull() const { return ptr_ == 0; } 35 // operator const void *() const { return ptr_; } 36 void clear(); 37 Boolean operator==(const Ptr<T> &p) const { 38 return ptr_ == p.ptr_; 39 } 40 Boolean operator!=(const Ptr<T> &p) const { 41 return ptr_ != p.ptr_; 42 } 43 Boolean operator==(const T *p) const { 44 return ptr_ == p; 45 } 46 Boolean operator!=(const T *p) const { 47 return ptr_ != p; 48 } 49 private: 50 T *ptr_; 51 }; 52 53 template<class T> 54 class ConstPtr : private Ptr<T> { 55 public: ConstPtr()56 ConstPtr() { } ConstPtr(T * ptr)57 ConstPtr(T *ptr) : Ptr<T>(ptr) { } ConstPtr(const Ptr<T> & p)58 ConstPtr(const Ptr<T> &p) : Ptr<T>(p) { } ConstPtr(const ConstPtr<T> & p)59 ConstPtr(const ConstPtr<T> &p) : Ptr<T>(p) { } 60 ConstPtr<T> &operator=(const Ptr<T> &p) { 61 Ptr<T>::operator=(p); return *this; 62 } 63 ConstPtr<T> &operator=(const ConstPtr<T> &p) { 64 Ptr<T>::operator=(p); return *this; 65 } 66 ConstPtr<T> &operator=(T *p) { 67 Ptr<T>::operator=(p); return *this; 68 } pointer()69 const T *pointer() const { return Ptr<T>::pointer(); } 70 const T *operator->() const { return Ptr<T>::pointer(); } 71 const T &operator*() const { return *Ptr<T>::pointer(); } swap(ConstPtr<T> & p)72 void swap(ConstPtr<T> &p) { Ptr<T>::swap(p); } 73 Ptr<T>::isNull; 74 Ptr<T>::clear; 75 Boolean operator==(const Ptr<T> &p) const { return Ptr<T>::operator==(p); } 76 Boolean operator!=(const Ptr<T> &p) const { return Ptr<T>::operator!=(p); } 77 Boolean operator==(const ConstPtr<T> &p) const { 78 return Ptr<T>::operator==(p); 79 } 80 Boolean operator!=(const ConstPtr<T> &p) const { 81 return Ptr<T>::operator!=(p); 82 } 83 }; 84 85 #ifdef SP_NAMESPACE 86 } 87 #endif 88 89 #endif /* not Ptr_INCLUDED */ 90 91 #ifdef SP_DEFINE_TEMPLATES 92 #include "Ptr.cxx" 93 #endif 94