1 /*
2 * Copyright (C) 2006, 2007 Apple Inc. All rights reserved.
3 * Copyright (C) 2008 Collabora Ltd.
4 * Copyright (C) 2010 Company 100, Inc.
5 *
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
10 *
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
15 *
16 * You should have received a copy of the GNU Library General Public License
17 * along with this library; see the file COPYING.LIB. If not, write to
18 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
19 * Boston, MA 02110-1301, USA.
20 *
21 */
22
23 #ifndef OwnPtrBrew_h
24 #define OwnPtrBrew_h
25
26 #include <algorithm>
27 #include <wtf/Assertions.h>
28 #include <wtf/Noncopyable.h>
29
30 // Forward delcarations at this point avoid the need to include BREW includes
31 // in WTF headers.
32 typedef struct _IFileMgr IFileMgr;
33 typedef struct _IFile IFile;
34 typedef struct IBitmap IBitmap;
35
36 namespace WTF {
37
38 template <typename T> void freeOwnedPtrBrew(T* ptr);
39 template<> void freeOwnedPtrBrew<IFileMgr>(IFileMgr*);
40 template<> void freeOwnedPtrBrew<IFile>(IFile*);
41 template<> void freeOwnedPtrBrew<IBitmap>(IBitmap*);
42
43 template <typename T> class OwnPtrBrew : public Noncopyable {
44 public:
m_ptr(ptr)45 explicit OwnPtrBrew(T* ptr = 0) : m_ptr(ptr) { }
~OwnPtrBrew()46 ~OwnPtrBrew() { freeOwnedPtrBrew(m_ptr); }
47
get()48 T* get() const { return m_ptr; }
release()49 T* release()
50 {
51 T* ptr = m_ptr;
52 m_ptr = 0;
53 return ptr;
54 }
55
outPtr()56 T*& outPtr()
57 {
58 ASSERT(!m_ptr);
59 return m_ptr;
60 }
61
set(T * ptr)62 void set(T* ptr)
63 {
64 ASSERT(!ptr || m_ptr != ptr);
65 freeOwnedPtrBrew(m_ptr);
66 m_ptr = ptr;
67 }
68
clear()69 void clear()
70 {
71 freeOwnedPtrBrew(m_ptr);
72 m_ptr = 0;
73 }
74
75 T& operator*() const
76 {
77 ASSERT(m_ptr);
78 return *m_ptr;
79 }
80
81 T* operator->() const
82 {
83 ASSERT(m_ptr);
84 return m_ptr;
85 }
86
87 bool operator!() const { return !m_ptr; }
88
89 // This conversion operator allows implicit conversion to bool but not to other integer types.
90 typedef T* OwnPtrBrew::*UnspecifiedBoolType;
UnspecifiedBoolType()91 operator UnspecifiedBoolType() const { return m_ptr ? &OwnPtrBrew::m_ptr : 0; }
92
swap(OwnPtrBrew & o)93 void swap(OwnPtrBrew& o) { std::swap(m_ptr, o.m_ptr); }
94
95 private:
96 T* m_ptr;
97 };
98
swap(OwnPtrBrew<T> & a,OwnPtrBrew<T> & b)99 template <typename T> inline void swap(OwnPtrBrew<T>& a, OwnPtrBrew<T>& b)
100 {
101 a.swap(b);
102 }
103
104 template <typename T, typename U> inline bool operator==(const OwnPtrBrew<T>& a, U* b)
105 {
106 return a.get() == b;
107 }
108
109 template <typename T, typename U> inline bool operator==(T* a, const OwnPtrBrew<U>& b)
110 {
111 return a == b.get();
112 }
113
114 template <typename T, typename U> inline bool operator!=(const OwnPtrBrew<T>& a, U* b)
115 {
116 return a.get() != b;
117 }
118
119 template <typename T, typename U> inline bool operator!=(T* a, const OwnPtrBrew<U>& b)
120 {
121 return a != b.get();
122 }
123
getPtr(const OwnPtrBrew<T> & p)124 template <typename T> inline typename OwnPtrBrew<T>::PtrType getPtr(const OwnPtrBrew<T>& p)
125 {
126 return p.get();
127 }
128
129 } // namespace WTF
130
131 using WTF::OwnPtrBrew;
132
133 #endif // OwnPtrBrew_h
134