xref: /onnv-gate/usr/src/cmd/man/src/util/nsgmls.src/include/Owner.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 Owner_INCLUDED
6 #define Owner_INCLUDED 1
7 
8 // A pointer that owns the object pointed to.
9 // T must be of class type.
10 // This is coded so that T need not yet have been defined.
11 
12 #ifdef SP_NAMESPACE
13 namespace SP_NAMESPACE {
14 #endif
15 
16 template<class T>
17 class Owner {
18 public:
Owner()19   Owner() : p_(0) { }
Owner(T * p)20   Owner(T *p) : p_(p) { }
21   ~Owner();
22   void operator=(T *p) {
23     if (p_) del();
24     p_ = p;
25   }
26   operator int() const { return p_ != 0; }
pointer()27   T *pointer() const { return p_; }
28   T *operator->() const { return p_; }
29   T &operator*() const { return *p_; }
swap(Owner<T> & x)30   void swap(Owner<T> &x) {
31     T *tem = p_;
32     p_ = x.p_;
33     x.p_ = tem;
34   }
extract()35   T *extract() {
36     T *tem = p_;
37     p_ = 0;
38     return tem;
39   }
clear()40   void clear() {
41     if (p_) {
42       del();
43       p_ = 0;
44     }
45   }
46 private:
47   Owner(const Owner<T> &);	// undefined
48   void operator=(const Owner<T> &o); // undefined
49   void del();
50   T *p_;
51 };
52 
53 #ifdef SP_NAMESPACE
54 }
55 #endif
56 
57 #endif /* not Owner_INCLUDED */
58 
59 #ifdef SP_DEFINE_TEMPLATES
60 #include "Owner.cxx"
61 #endif
62