diff options
author | Dan Sinclair <dsinclair@chromium.org> | 2017-09-21 16:53:58 -0400 |
---|---|---|
committer | Chromium commit bot <commit-bot@chromium.org> | 2017-09-21 21:25:26 +0000 |
commit | aee0db0e6a12bdaacebeb8fb791f4e0d45e18a0d (patch) | |
tree | 1e14d60adcffeb0791a0a6c8792d3e9c0109384e /core/fxcrt/cfx_unowned_ptr.h | |
parent | 8e9e3d8975eeea3429c3b3ea703f04ac34e20e28 (diff) | |
download | pdfium-aee0db0e6a12bdaacebeb8fb791f4e0d45e18a0d.tar.xz |
Move CFX_UnownedPtr to UnownedPtr
This CL moves CFX_UnownedPtr to UnownedPtr and places in the fxcrt
namespace.
Bug: pdfium:898
Change-Id: I6d1fa463f365e5cb3aafa8c8a7a5f7eff62ed8e0
Reviewed-on: https://pdfium-review.googlesource.com/14620
Reviewed-by: Tom Sepez <tsepez@chromium.org>
Commit-Queue: dsinclair <dsinclair@chromium.org>
Diffstat (limited to 'core/fxcrt/cfx_unowned_ptr.h')
-rw-r--r-- | core/fxcrt/cfx_unowned_ptr.h | 117 |
1 files changed, 0 insertions, 117 deletions
diff --git a/core/fxcrt/cfx_unowned_ptr.h b/core/fxcrt/cfx_unowned_ptr.h deleted file mode 100644 index 5376781d6a..0000000000 --- a/core/fxcrt/cfx_unowned_ptr.h +++ /dev/null @@ -1,117 +0,0 @@ -// Copyright 2017 PDFium Authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CORE_FXCRT_CFX_UNOWNED_PTR_H_ -#define CORE_FXCRT_CFX_UNOWNED_PTR_H_ - -#include <functional> -#include <memory> -#include <type_traits> -#include <utility> - -// CFX_UnownedPtr is a smart pointer class that behaves very much like a -// standard C-style pointer. The advantages of using it over raw -// pointers are: -// -// 1. It documents the nature of the pointer with no need to add a comment -// explaining that is it // Not owned. Additionally, an attempt to delete -// an unowned ptr will fail to compile rather than silently succeeding, -// since it is a class and not a raw pointer. -// -// 2. When built for a memory tool like ASAN, the class provides a destructor -// which checks that the object being pointed to is still alive. -// -// Hence, when using UnownedPtr, no dangling pointers are ever permitted, -// even if they are not de-referenced after becoming dangling. The style of -// programming required is that the lifetime an object containing an -// UnownedPtr must be strictly less than the object to which it points. -// -// The same checks are also performed at assignment time to prove that the -// old value was not a dangling pointer, either. -// -// The array indexing operation [] is not supported on an unowned ptr, -// because an unowned ptr expresses a one to one relationship with some -// other heap object. - -template <class T> -class CFX_UnownedPtr { - public: - CFX_UnownedPtr() {} - CFX_UnownedPtr(const CFX_UnownedPtr& that) : CFX_UnownedPtr(that.Get()) {} - - template <typename U> - explicit CFX_UnownedPtr(U* pObj) : m_pObj(pObj) {} - - // Deliberately implicit to allow returning nullptrs. - // NOLINTNEXTLINE(runtime/explicit) - CFX_UnownedPtr(std::nullptr_t ptr) {} - - ~CFX_UnownedPtr() { ProbeForLowSeverityLifetimeIssue(); } - - CFX_UnownedPtr& operator=(T* that) { - ProbeForLowSeverityLifetimeIssue(); - m_pObj = that; - return *this; - } - - CFX_UnownedPtr& operator=(const CFX_UnownedPtr& that) { - ProbeForLowSeverityLifetimeIssue(); - if (*this != that) - m_pObj = that.Get(); - return *this; - } - - bool operator==(const CFX_UnownedPtr& that) const { - return Get() == that.Get(); - } - bool operator!=(const CFX_UnownedPtr& that) const { return !(*this == that); } - bool operator<(const CFX_UnownedPtr& that) const { - return std::less<T*>()(Get(), that.Get()); - } - - template <typename U> - bool operator==(const U* that) const { - return Get() == that; - } - - template <typename U> - bool operator!=(const U* that) const { - return !(*this == that); - } - - T* Get() const { return m_pObj; } - - T* Release() { - ProbeForLowSeverityLifetimeIssue(); - T* pTemp = nullptr; - std::swap(pTemp, m_pObj); - return pTemp; - } - - explicit operator bool() const { return !!m_pObj; } - T& operator*() const { return *m_pObj; } - T* operator->() const { return m_pObj; } - - private: - inline void ProbeForLowSeverityLifetimeIssue() { -#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR) - if (m_pObj) - reinterpret_cast<const volatile uint8_t*>(m_pObj)[0]; -#endif - } - - T* m_pObj = nullptr; -}; - -template <typename T, typename U> -inline bool operator==(const U* lhs, const CFX_UnownedPtr<T>& rhs) { - return rhs == lhs; -} - -template <typename T, typename U> -inline bool operator!=(const U* lhs, const CFX_UnownedPtr<T>& rhs) { - return rhs != lhs; -} - -#endif // CORE_FXCRT_CFX_UNOWNED_PTR_H_ |