-
Notifications
You must be signed in to change notification settings - Fork 0
/
Ptr.h
75 lines (60 loc) · 1.77 KB
/
Ptr.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright (C) 1993-2002 David R. Cheriton. All rights reserved.
#ifndef FWK_PTR_H
#define FWK_PTR_H
namespace Fwk {
template <class T>
class Ptr
{
public:
Ptr(T* p = 0) : ptr_(p) { if (ptr_) ptr_->newRef(); }
Ptr(const Ptr<T>& mp) : ptr_(mp.ptr_) { if (ptr_) ptr_->newRef(); }
~Ptr() { if (ptr_) ptr_->deleteRef(); }
Ptr<T>& operator=( const Ptr<T>& mp );
Ptr<T>& operator=( Ptr<T>& mp );
Ptr<T>& operator=( T* p );
bool operator==( const Ptr<T>& mp ) const { return ptr_ == mp.ptr_; }
bool operator!=( const Ptr<T>& mp ) const { return ptr_ != mp.ptr_; }
bool operator==( T* p ) const { return ptr_ == p; }
bool operator!=( T* p ) const { return ptr_ != p; }
const T * operator->() const { return ptr_; }
T * operator->() { return ptr_; }
T * ptr() const { return ptr_; }
template <class OtherType>
operator Ptr<OtherType>() const { return Ptr<OtherType>( ptr_ ); }
struct PointerConversion { int valid; };
operator int PointerConversion::*() const {
return ptr_ ? &PointerConversion::valid : 0;
}
protected:
T *ptr_;
};
template<class T> Ptr<T>&
Ptr<T>::operator=( const Ptr<T>& mp ) {
const T * save = ptr_;
ptr_ = mp.ptr_;
if( ptr_ ) ptr_->newRef();
if( save ) save->deleteRef();
return *this;
}
template<class T> Ptr<T>&
Ptr<T>::operator=( Ptr<T>& mp ) {
T * save = ptr_;
ptr_ = mp.ptr_;
if( ptr_ ) ptr_->newRef();
if( save ) save->deleteRef();
return *this;
}
template<class T> Ptr<T>&
Ptr<T>::operator=( T* p ) {
T * save = ptr_;
ptr_ = p;
if( ptr_ ) ptr_->newRef();
if( save ) save->deleteRef();
return *this;
}
template <class T, class U>
Ptr<T> ptr_cast(Ptr<U> mp) {
return dynamic_cast<T*>(mp.ptr());
}
}
#endif /* FWK_PTR_H */