Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(118)

Side by Side Diff: third_party/base/nonstd_unique_ptr.h

Issue 1545183002: Merge to XFA: Switch from nonstd::unique_ptr to std::unique_ptr. (Closed) Base URL: https://pdfium.googlesource.com/pdfium.git@xfa
Patch Set: xfa Created 4 years, 12 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2013 Google Inc. All Rights Reserved.
2 //
3 // Redistribution and use in source and binary forms, with or without
4 // modification, are permitted provided that the following conditions are
5 // met:
6 //
7 // * Redistributions of source code must retain the above copyright
8 // notice, this list of conditions and the following disclaimer.
9 // * Redistributions in binary form must reproduce the above
10 // copyright notice, this list of conditions and the following disclaimer
11 // in the documentation and/or other materials provided with the
12 // distribution.
13 // * Neither the name of Google Inc. nor the names of its
14 // contributors may be used to endorse or promote products derived from
15 // this software without specific prior written permission.
16 //
17 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
18 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
19 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
20 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
21 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
22 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
23 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
27 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
29 // This is a copy of breakpad's standalone scoped_ptr, which has been
30 // renamed to nonstd::unique_ptr, and from which more complicated classes
31 // have been removed. The reset() method has also been tweaked to more
32 // closely match c++11, and an implicit conversion to bool has been added.
33
34 // Scopers help you manage ownership of a pointer, helping you easily manage the
35 // a pointer within a scope, and automatically destroying the pointer at the
36 // end of a scope.
37 //
38 // A unique_ptr<T> is like a T*, except that the destructor of unique_ptr<T>
39 // automatically deletes the pointer it holds (if any).
40 // That is, unique_ptr<T> owns the T object that it points to.
41 // Like a T*, a unique_ptr<T> may hold either NULL or a pointer to a T object.
42 // Also like T*, unique_ptr<T> is thread-compatible, and once you
43 // dereference it, you get the thread safety guarantees of T.
44 //
45 // Example usage (unique_ptr):
46 // {
47 // unique_ptr<Foo> foo(new Foo("wee"));
48 // } // foo goes out of scope, releasing the pointer with it.
49 //
50 // {
51 // unique_ptr<Foo> foo; // No pointer managed.
52 // foo.reset(new Foo("wee")); // Now a pointer is managed.
53 // foo.reset(new Foo("wee2")); // Foo("wee") was destroyed.
54 // foo.reset(new Foo("wee3")); // Foo("wee2") was destroyed.
55 // foo->Method(); // Foo::Method() called.
56 // foo.get()->Method(); // Foo::Method() called.
57 // SomeFunc(foo.release()); // SomeFunc takes ownership, foo no longer
58 // // manages a pointer.
59 // foo.reset(new Foo("wee4")); // foo manages a pointer again.
60 // foo.reset(); // Foo("wee4") destroyed, foo no longer
61 // // manages a pointer.
62 // } // foo wasn't managing a pointer, so nothing was destroyed.
63 //
64 // The size of a unique_ptr is small: sizeof(unique_ptr<C>) == sizeof(C*)
65
66 #ifndef NONSTD_UNIQUE_PTR_H_
67 #define NONSTD_UNIQUE_PTR_H_
68
69 // This is an implementation designed to match the anticipated future C++11
70 // implementation of the unique_ptr class.
71
72 #include <assert.h>
73 #include <stddef.h>
74 #include <stdlib.h>
75
76 #include <ostream>
77 #include <utility>
78
79 #include "template_util.h"
80
81 namespace nonstd {
82
83 // Function object which deletes its parameter, which must be a pointer.
84 // If C is an array type, invokes 'delete[]' on the parameter; otherwise,
85 // invokes 'delete'. The default deleter for unique_ptr<T>.
86 template <class T>
87 struct DefaultDeleter {
88 DefaultDeleter() {}
89 template <typename U>
90 DefaultDeleter(const DefaultDeleter<U>& other) {
91 // IMPLEMENTATION NOTE: C++11 20.7.1.1.2p2 only provides this constructor
92 // if U* is implicitly convertible to T* and U is not an array type.
93 //
94 // Correct implementation should use SFINAE to disable this
95 // constructor. However, since there are no other 1-argument constructors,
96 // using a static_assert() based on is_convertible<> and requiring
97 // complete types is simpler and will cause compile failures for equivalent
98 // misuses.
99 //
100 // Note, the is_convertible<U*, T*> check also ensures that U is not an
101 // array. T is guaranteed to be a non-array, so any U* where U is an array
102 // cannot convert to T*.
103 enum { T_must_be_complete = sizeof(T) };
104 enum { U_must_be_complete = sizeof(U) };
105 static_assert((pdfium::base::is_convertible<U*, T*>::value),
106 "U_ptr_must_implicitly_convert_to_T_ptr");
107 }
108 inline void operator()(T* ptr) const {
109 enum { type_must_be_complete = sizeof(T) };
110 delete ptr;
111 }
112 };
113
114 // Specialization of DefaultDeleter for array types.
115 template <class T>
116 struct DefaultDeleter<T[]> {
117 inline void operator()(T* ptr) const {
118 enum { type_must_be_complete = sizeof(T) };
119 delete[] ptr;
120 }
121
122 private:
123 // Disable this operator for any U != T because it is undefined to execute
124 // an array delete when the static type of the array mismatches the dynamic
125 // type.
126 //
127 // References:
128 // C++98 [expr.delete]p3
129 // http://cplusplus.github.com/LWG/lwg-defects.html#938
130 template <typename U>
131 void operator()(U* array) const;
132 };
133
134 template <class T, int n>
135 struct DefaultDeleter<T[n]> {
136 // Never allow someone to declare something like unique_ptr<int[10]>.
137 static_assert(sizeof(T) == -1, "do_not_use_array_with_size_as_type");
138 };
139
140 namespace internal {
141
142 // Common implementation for both pointers to elements and pointers to
143 // arrays. These are differentiated below based on the need to invoke
144 // delete vs. delete[] as appropriate.
145 template <class C, class D>
146 class unique_ptr_base {
147 public:
148 // The element type
149 typedef C element_type;
150
151 explicit unique_ptr_base(C* p) : data_(p) {}
152
153 // Initializer for deleters that have data parameters.
154 unique_ptr_base(C* p, const D& d) : data_(p, d) {}
155
156 // Move constructor.
157 unique_ptr_base(unique_ptr_base<C, D>&& that)
158 : data_(that.release(), that.get_deleter()) {}
159
160 ~unique_ptr_base() {
161 enum { type_must_be_complete = sizeof(C) };
162 if (data_.ptr != nullptr) {
163 // Not using get_deleter() saves one function call in non-optimized
164 // builds.
165 static_cast<D&>(data_)(data_.ptr);
166 }
167 }
168
169 void reset(C* p = nullptr) {
170 C* old = data_.ptr;
171 data_.ptr = p;
172 if (old != nullptr)
173 static_cast<D&>(data_)(old);
174 }
175
176 C* get() const { return data_.ptr; }
177 D& get_deleter() { return data_; }
178 const D& get_deleter() const { return data_; }
179
180 // Comparison operators.
181 // These return whether two unique_ptr refer to the same object, not just to
182 // two different but equal objects.
183 bool operator==(C* p) const { return data_.ptr == p; }
184 bool operator!=(C* p) const { return data_.ptr != p; }
185
186 // Swap two unique pointers.
187 void swap(unique_ptr_base& p2) {
188 Data tmp = data_;
189 data_ = p2.data_;
190 p2.data_ = tmp;
191 }
192
193 // Release a pointer.
194 // The return value is the current pointer held by this object.
195 // If this object holds a NULL pointer, the return value is NULL.
196 // After this operation, this object will hold a NULL pointer,
197 // and will not own the object any more.
198 C* release() {
199 C* ptr = data_.ptr;
200 data_.ptr = nullptr;
201 return ptr;
202 }
203
204 // Allow promotion to bool for conditional statements.
205 explicit operator bool() const { return data_.ptr != nullptr; }
206
207 protected:
208 // Use the empty base class optimization to allow us to have a D
209 // member, while avoiding any space overhead for it when D is an
210 // empty class. See e.g. http://www.cantrip.org/emptyopt.html for a good
211 // discussion of this technique.
212 struct Data : public D {
213 explicit Data(C* ptr_in) : ptr(ptr_in) {}
214 Data(C* ptr_in, const D& other) : D(other), ptr(ptr_in) {}
215 C* ptr;
216 };
217
218 Data data_;
219 };
220
221 } // namespace internal
222
223 // Implementation for ordinary pointers using delete.
224 template <class C, class D = DefaultDeleter<C>>
225 class unique_ptr : public internal::unique_ptr_base<C, D> {
226 public:
227 // Constructor. Defaults to initializing with nullptr.
228 unique_ptr() : internal::unique_ptr_base<C, D>(nullptr) {}
229
230 // Constructor. Takes ownership of p.
231 explicit unique_ptr(C* p) : internal::unique_ptr_base<C, D>(p) {}
232
233 // Constructor. Allows initialization of a stateful deleter.
234 unique_ptr(C* p, const D& d) : internal::unique_ptr_base<C, D>(p, d) {}
235
236 // Constructor. Allows construction from a nullptr.
237 unique_ptr(decltype(nullptr)) : internal::unique_ptr_base<C, D>(nullptr) {}
238
239 // Move constructor.
240 unique_ptr(unique_ptr&& that)
241 : internal::unique_ptr_base<C, D>(std::move(that)) {}
242
243 // operator=. Allows assignment from a nullptr. Deletes the currently owned
244 // object, if any.
245 unique_ptr& operator=(decltype(nullptr)) {
246 this->reset();
247 return *this;
248 }
249
250 // Move assignment.
251 unique_ptr<C>& operator=(unique_ptr<C>&& that) {
252 this->reset(that.release());
253 return *this;
254 }
255
256 // Accessors to get the owned object.
257 // operator* and operator-> will assert() if there is no current object.
258 C& operator*() const {
259 assert(this->data_.ptr != nullptr);
260 return *this->data_.ptr;
261 }
262 C* operator->() const {
263 assert(this->data_.ptr != nullptr);
264 return this->data_.ptr;
265 }
266
267 // Comparison operators.
268 // These return whether two unique_ptr refer to the same object, not just to
269 // two different but equal objects.
270 bool operator==(const C* p) const { return this->get() == p; }
271 bool operator!=(const C* p) const { return this->get() != p; }
272
273 private:
274 // Disallow evil constructors. It doesn't make sense to make a copy of
275 // something that's allegedly unique.
276 unique_ptr(const unique_ptr&) = delete;
277 void operator=(const unique_ptr&) = delete;
278
279 // Forbid comparison of unique_ptr types. If U != C, it totally
280 // doesn't make sense, and if U == C, it still doesn't make sense
281 // because you should never have the same object owned by two different
282 // unique_ptrs.
283 template <class U>
284 bool operator==(unique_ptr<U> const& p2) const;
285 template <class U>
286 bool operator!=(unique_ptr<U> const& p2) const;
287 };
288
289 // Specialization for arrays using delete[].
290 template <class C, class D>
291 class unique_ptr<C[], D> : public internal::unique_ptr_base<C, D> {
292 public:
293 // Constructor. Defaults to initializing with nullptr.
294 unique_ptr() : internal::unique_ptr_base<C, D>(nullptr) {}
295
296 // Constructor. Stores the given array. Note that the argument's type
297 // must exactly match T*. In particular:
298 // - it cannot be a pointer to a type derived from T, because it is
299 // inherently unsafe in the general case to access an array through a
300 // pointer whose dynamic type does not match its static type (eg., if
301 // T and the derived types had different sizes access would be
302 // incorrectly calculated). Deletion is also always undefined
303 // (C++98 [expr.delete]p3). If you're doing this, fix your code.
304 // - it cannot be const-qualified differently from T per unique_ptr spec
305 // (http://cplusplus.github.com/LWG/lwg-active.html#2118). Users wanting
306 // to work around this may use const_cast<const T*>().
307 explicit unique_ptr(C* p) : internal::unique_ptr_base<C, D>(p) {}
308
309 // Constructor. Allows construction from a nullptr.
310 unique_ptr(decltype(nullptr)) : internal::unique_ptr_base<C, D>(nullptr) {}
311
312 // Move constructor.
313 unique_ptr(unique_ptr&& that)
314 : internal::unique_ptr_base<C, D>(std::move(that)) {}
315
316 // operator=. Allows assignment from a nullptr. Deletes the currently owned
317 // array, if any.
318 unique_ptr& operator=(decltype(nullptr)) {
319 this->reset();
320 return *this;
321 }
322
323 // Move assignment.
324 unique_ptr<C>& operator=(unique_ptr<C>&& that) {
325 this->reset(that.release());
326 return *this;
327 }
328
329 // Reset. Deletes the currently owned array, if any.
330 // Then takes ownership of a new object, if given.
331 void reset(C* array = nullptr) {
332 static_cast<internal::unique_ptr_base<C, D>*>(this)->reset(array);
333 }
334
335 // Support indexing since it is holding array.
336 C& operator[](size_t i) { return this->data_.ptr[i]; }
337
338 // Comparison operators.
339 // These return whether two unique_ptr refer to the same object, not just to
340 // two different but equal objects.
341 bool operator==(C* array) const { return this->get() == array; }
342 bool operator!=(C* array) const { return this->get() != array; }
343
344 private:
345 // Disable initialization from any type other than element_type*, by
346 // providing a constructor that matches such an initialization, but is
347 // private and has no definition. This is disabled because it is not safe to
348 // call delete[] on an array whose static type does not match its dynamic
349 // type.
350 template <typename U>
351 explicit unique_ptr(U* array);
352 explicit unique_ptr(int disallow_construction_from_null);
353
354 // Disable reset() from any type other than element_type*, for the same
355 // reasons as the constructor above.
356 template <typename U>
357 void reset(U* array);
358 void reset(int disallow_reset_from_null);
359
360 // Disallow evil constructors. It doesn't make sense to make a copy of
361 // something that's allegedly unique.
362 unique_ptr(const unique_ptr&) = delete;
363 void operator=(const unique_ptr&) = delete;
364
365 // Forbid comparison of unique_ptr types. If U != C, it totally
366 // doesn't make sense, and if U == C, it still doesn't make sense
367 // because you should never have the same object owned by two different
368 // unique_ptrs.
369 template <class U>
370 bool operator==(unique_ptr<U> const& p2) const;
371 template <class U>
372 bool operator!=(unique_ptr<U> const& p2) const;
373 };
374
375 // Free functions
376 template <class C>
377 void swap(unique_ptr<C>& p1, unique_ptr<C>& p2) {
378 p1.swap(p2);
379 }
380
381 template <class C>
382 bool operator==(C* p1, const unique_ptr<C>& p2) {
383 return p1 == p2.get();
384 }
385
386 template <class C>
387 bool operator!=(C* p1, const unique_ptr<C>& p2) {
388 return p1 != p2.get();
389 }
390
391 template <typename T>
392 std::ostream& operator<<(std::ostream& out, const unique_ptr<T>& p) {
393 return out << p.get();
394 }
395
396 } // namespace nonstd
397
398 #endif // NONSTD_UNIQUE_PTR_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698