text: #pragma once
  
  #include "Hazel\Events\Event.h"
  
  
  namespace Hazel {
  
  	class KeyEvent : public Event
  	{
  	public:
  		inline int GetKeyCode() const { return m_keyCode; }
  
  		EVENT_CLASS_CATEGORY(EventCategoryKeyboard | EventCategoryInput)
  
  	protected:
  		KeyEvent(int keycode)
  			: m_keyCode(keycode) {}
  
  		~KeyEvent() = default;
  
  		int m_keyCode;
  	};
  
  	class KeyPressedEvent : public KeyEvent
  	{
  	public:
  		KeyPressedEvent(int keycode, int repeatCount)
  			: KeyEvent(keycode), m_repeatCount(repeatCount) {}
  
  		~KeyPressedEvent() = default;
  
  		inline int GetRepeatCount() const { return m_repeatCount; }
  
  		std::string ToString() const override
  		{
  			std::stringstream ss;
  			ss << "KeyPressedEvent: " << m_keyCode << " (" << m_repeatCount << " repeats)";
  			return ss.str();
  		}
  
  		EVENT_CLASS_TYPE(KeyPressed)
  
  	private:
  		int m_repeatCount;
  	};
  
  	class KeyReleasedEvent : public KeyEvent
  	{
  	public:
  		KeyReleasedEvent(int keycode)
  			: KeyEvent(keycode) {}
  
  		~KeyReleasedEvent() = default;
  
  		std::string ToString() const override
  		{
  			std::stringstream ss;
  			ss << "KeyReleasedEvent: " << m_keyCode;
  			return ss.str();
  		}
  
  		EVENT_CLASS_TYPE(KeyReleased)
  	};
  
  	class KeyTypedEvent : public KeyEvent
  	{
  	public:
  		KeyTypedEvent(int keycode)
  			: KeyEvent(keycode) {}
  
  		~KeyTypedEvent() = default;
  
  		std::string ToString() const override
  		{
  			std::stringstream ss;
  			ss << "KeyTypedEvent: " << m_keyCode;
  			return ss.str();
  		}
  
  		EVENT_CLASS_TYPE(KeyTyped)
  	};
  }