text: /*****************************************************************************/
  /*                             Spike SourceCode                              */
  /*                                                                           */
  /* File created by: Fahim Fuad                                               */
  /* Other editors: None                                                       */
  /*                                                                           */
  /*   Licensed under the Apache License, Version 2.0 (the "License");         */
  /*   you may not use this file except in compliance with the License.        */
  /*   You may obtain a copy of the License at                                 */
  /*                                                                           */
  /*       http://www.apache.org/licenses/LICENSE-2.0                          */
  /*                                                                           */
  /*   Unless required by applicable law or agreed to in writing, software     */
  /*   distributed under the License is distributed on an "AS IS" BASIS,       */
  /*   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.*/
  /*   See the License for the specific language governing permissions and     */
  /*   limitations under the License.                                          */
  /*****************************************************************************/
  #pragma once
  #include "Base.h"
  #include "Window.h"
  #include "Spike/Core/LayerStack.h"
  #include "Spike/Events/Event.h"
  #include "Spike/Events/ApplicationEvent.h"
  #include "Spike/ImGui/ImGuiLayer.h"
  #include "Spike/Core/Timestep.h"
  
  namespace Spike
  {
      class Application
      {
      public:
          Application(const std::string& name = "Spike Application");
          virtual ~Application();
          void Run();
          void OnEvent(Event& e);
  
          void PushLayer(Layer* layer);
          void PushOverlay(Layer* layer);
          void SetAppIcon(const std::string& imagePath);
  
          Window& GetWindow() { return *m_Window; }
          void Close();
  
          ImGuiLayer* GetImGuiLayer() { return m_ImGuiLayer; }
          static Application& Get() { return *s_Instance; }
      private:
          bool OnWindowClose(WindowCloseEvent& e);
          bool OnWindowResize(WindowResizeEvent& e);
      private:
          Scope<Window> m_Window;
          ImGuiLayer* m_ImGuiLayer;
          bool m_Running = true;
          bool m_Minimized = false;
          LayerStack m_LayerStack;
          float m_LastFrameTime = 0.0f;
      private:
          static Application* s_Instance;
      };
      // To be defined in CLIENT
      Application* CreateApplication();
  
  }