#ifndef IOS_CHROME_BROWSER_MAIN_BROWSER_IMPL_H_
#define IOS_CHROME_BROWSER_MAIN_BROWSER_IMPL_H_
#include <CoreFoundation/CoreFoundation.h>
#include "base/memory/weak_ptr.h"
#include "base/observer_list.h"
#include "ios/chrome/browser/main/browser.h"
class ChromeBrowserState;
@class SceneState;
class WebStateList;
class WebStateListDelegate;
class BrowserImpl final : public Browser {
public:
BrowserImpl(ChromeBrowserState* browser_state,
BrowserImpl* active_browser = nullptr);
BrowserImpl(const BrowserImpl&) = delete;
BrowserImpl& operator=(const BrowserImpl&) = delete;
~BrowserImpl() final;
ChromeBrowserState* GetBrowserState() final;
WebStateList* GetWebStateList() final;
CommandDispatcher* GetCommandDispatcher() final;
void AddObserver(BrowserObserver* observer) final;
void RemoveObserver(BrowserObserver* observer) final;
base::WeakPtr<Browser> AsWeakPtr() final;
bool IsInactive() const final;
Browser* GetActiveBrowser() final;
Browser* GetInactiveBrowser() final;
Browser* CreateInactiveBrowser() final;
void DestroyInactiveBrowser() final;
private:
ChromeBrowserState* const browser_state_;
std::unique_ptr<WebStateListDelegate> web_state_list_delegate_;
std::unique_ptr<WebStateList> web_state_list_;
__strong CommandDispatcher* command_dispatcher_;
base::ObserverList<BrowserObserver, true> observers_;
Browser* const active_browser_;
std::unique_ptr<Browser> inactive_browser_;
base::WeakPtrFactory<Browser> weak_ptr_factory_{this};
};
#endif