xref: /onnv-gate/usr/src/cmd/man/src/util/nsgmls.src/include/Ptr.h (revision 0:68f95e015346)
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