// 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>

#include "core/fxcrt/fx_memory.h"

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) {}

#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
  ~CFX_UnownedPtr() { Probe(); }
#endif

  CFX_UnownedPtr& operator=(T* that) {
#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
    Probe();
#endif
    m_pObj = that;
    return *this;
  }
  CFX_UnownedPtr& operator=(const CFX_UnownedPtr& that) {
#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
    Probe();
#endif
    if (*this != that)
      m_pObj = that.Get();
    return *this;
  }

  bool operator==(const CFX_UnownedPtr& that) const {
    return Get() == that.Get();
  }
  bool operator==(const T* that) const { return Get() == that; }
  bool operator!=(const CFX_UnownedPtr& that) const { return !(*this == that); }
  bool operator!=(const T* that) const { return !(*this == that); }
  bool operator<(const CFX_UnownedPtr& that) const {
    return std::less<T*>()(Get(), that.Get());
  }

  T* Get() const { return m_pObj; }
  explicit operator bool() const { return !!m_pObj; }
  T& operator*() const { return *m_pObj; }
  T* operator->() const { return m_pObj; }

 private:
#if defined(MEMORY_TOOL_REPLACES_ALLOCATOR)
  void Probe() {
    if (m_pObj)
      reinterpret_cast<const volatile uint8_t*>(m_pObj)[0];
  }
#endif

  T* m_pObj = nullptr;
};

#endif  // CORE_FXCRT_CFX_UNOWNED_PTR_H_
