#ifndef UI_VIEWS_WIDGET_UNIQUE_WIDGET_PTR_H_
#define UI_VIEWS_WIDGET_UNIQUE_WIDGET_PTR_H_
#include <memory>
#include "base/scoped_observation.h"
#include "ui/views/views_export.h"
#include "ui/views/widget/widget.h"
#include "ui/views/widget/widget_observer.h"
namespace views {
class VIEWS_EXPORT UniqueWidgetPtr {
public:
UniqueWidgetPtr();
UniqueWidgetPtr(std::unique_ptr<Widget> widget);
template <class U>
UniqueWidgetPtr(std::unique_ptr<U> widget) {
Init(std::unique_ptr<Widget>(widget.release()));
}
UniqueWidgetPtr(UniqueWidgetPtr&&);
UniqueWidgetPtr& operator=(UniqueWidgetPtr&&);
~UniqueWidgetPtr();
explicit operator bool() const;
Widget& operator*() const;
Widget* operator->() const;
void reset();
Widget* get() const;
private:
class Impl : public WidgetObserver {
public:
Impl();
explicit Impl(std::unique_ptr<Widget> widget);
Impl(const Impl&) = delete;
Impl& operator=(const Impl&) = delete;
~Impl() override;
Widget* Get() const;
void OnWidgetDestroying(Widget* widget) override;
private:
struct WidgetAutoCloser {
void operator()(Widget* widget);
};
bool received_widget_destruction_signal_ = false;
base::ScopedObservation<Widget, WidgetObserver> widget_observation_{this};
std::unique_ptr<Widget, WidgetAutoCloser> widget_closer_;
};
void Init(std::unique_ptr<Widget> widget);
std::unique_ptr<Impl> unique_widget_ptr_impl_;
};
}
#endif