// Copyright 2016 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.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_FXCRT_INCLUDE_CFX_WEAK_PTR_H_
#define CORE_FXCRT_INCLUDE_CFX_WEAK_PTR_H_

#include <memory>

#include "core/fxcrt/include/cfx_retain_ptr.h"
#include "core/fxcrt/include/fx_system.h"

template <class T, class D = std::default_delete<T>>
class CFX_WeakPtr {
 public:
  CFX_WeakPtr() {}
  CFX_WeakPtr(const CFX_WeakPtr& that) : m_pHandle(that.m_pHandle) {}
  CFX_WeakPtr(CFX_WeakPtr&& that) { Swap(that); }
  CFX_WeakPtr(std::unique_ptr<T, D> pObj)
      : m_pHandle(new Handle(std::move(pObj))) {}

  explicit operator bool() const { return m_pHandle && !!m_pHandle->Get(); }
  bool HasOneRef() const { return m_pHandle && m_pHandle->HasOneRef(); }
  T* operator->() { return m_pHandle->Get(); }
  const T* operator->() const { return m_pHandle->Get(); }
  CFX_WeakPtr& operator=(const CFX_WeakPtr& that) {
    m_pHandle = that.m_pHandle;
    return *this;
  }
  bool operator==(const CFX_WeakPtr& that) const {
    return m_pHandle == that.m_pHandle;
  }
  bool operator!=(const CFX_WeakPtr& that) const { return !(*this == that); }

  T* Get() const { return m_pHandle ? m_pHandle->Get() : nullptr; }
  void Clear() {
    if (m_pHandle) {
      m_pHandle->Clear();
      m_pHandle.Reset();
    }
  }
  void Reset() { m_pHandle.Reset(); }
  void Reset(std::unique_ptr<T, D> pObj) {
    m_pHandle.Reset(new Handle(std::move(pObj)));
  }
  void Swap(CFX_WeakPtr& that) { m_pHandle.Swap(that.m_pHandle); }

 private:
  class Handle {
   public:
    explicit Handle(std::unique_ptr<T, D> ptr)
        : m_nCount(0), m_pObj(std::move(ptr)) {}
    void Reset(std::unique_ptr<T, D> ptr) { m_pObj = std::move(ptr); }
    void Clear() {     // Now you're all weak ptrs ...
      m_pObj.reset();  // unique_ptr nulls first before invoking delete.
    }
    T* Get() const { return m_pObj.get(); }
    T* Retain() {
      ++m_nCount;
      return m_pObj.get();
    }
    void Release() {
      if (--m_nCount == 0)
        delete this;
    }
    bool HasOneRef() const { return m_nCount == 1; }

   private:
    ~Handle() {}

    intptr_t m_nCount;
    std::unique_ptr<T, D> m_pObj;
  };

  CFX_RetainPtr<Handle> m_pHandle;
};

#endif  // CORE_FXCRT_INCLUDE_CFX_WEAK_PTR_H_
