neoWidgets
 All Classes Namespaces Files Functions Variables Enumerations Enumerator Pages
ComPtr.h
1 #ifndef NEO_COMPTR_H
2 #define NEO_COMPTR_H
3 
4 namespace neo
5 {
6 
13 template<typename T>
14 class ComPtr
15 {
16 public:
17  ComPtr()
18  : _ptr(nullptr)
19  {}
20 
21  ComPtr(T* p)
22  : _ptr(p)
23  {}
24 
25  // copy ctor
26  ComPtr(const ComPtr<T>& other)
27  : _ptr(other._ptr)
28  {
29  _ptr->AddRef();
30  }
31 
32  // assignment operator
33  ComPtr& operator= (const ComPtr& other)
34  {
35  _ptr = other._ptr;
36  _ptr->AddRef();
37  return *this;
38  }
39 
40  // move ctor
41  ComPtr(ComPtr&& other)
42  {
43  _ptr = other._ptr;
44  other._ptr = nullptr;
45  }
46 
47  // move operator
48  ComPtr& operator= (ComPtr&& other)
49  {
50  if(this != &other)
51  {
52  _ptr = other._ptr;
53  other._ptr = nullptr;
54  }
55  return *this;
56  }
57 
58  ~ComPtr()
59  {
60  if(_ptr)
61  _ptr->Release();
62  }
63 
64  void Release()
65  {
66  if(_ptr)
67  _ptr->Release();
68  _ptr = nullptr;
69  }
70 
75  T** PtrPtr()
76  {
77  Release();
78  return &_ptr;
79  }
80 
81  operator T* () const { return _ptr; }
82  T* operator -> () const { return _ptr; }
83  T& operator * () const { return *_ptr; }
84 private:
85  T* _ptr;
86 };
87 
88 } // namespace neo
89 
90 #endif
Smart pointer to COM classes.
Definition: ComPtr.h:14
T ** PtrPtr()
Definition: ComPtr.h:75