#pragma once
#include <strstream>
#include <FastDelegate.h>

//  {29A32703-A3DB-4E7C-B275-3FBA7F78FE51}
//  DEFINE_GUID(<< name >> ,
//	0x29a32703, 0xa3db, 0x4e7c, 0xb2, 0x75, 0x3f, 0xba, 0x7f, 0x78, 0xfe, 0x51);

class IEventData;

typedef unsigned long EventType;
typedef std::shared_ptr<IEventData> IEventDataPtr;
typedef fastdelegate::FastDelegate1<IEventDataPtr> EventListenerDelegate;

class IEventData
{
public:
	virtual const EventType& VGetEventType(void) const = 0;
	virtual float VGetTimeStamp(void) const = 0;
	virtual void VSerialize(std::ostrstream& out) const = 0;
	virtual IEventDataPtr VCopy(void) = 0;
	virtual const char* GetName(void) = 0;
};

class BaseEventData : public IEventData
{
	const float m_TimeStamp;

public:
	explicit BaseEventData(const float timeStamp = 0.0f) :
		m_TimeStamp(timeStamp) {}
	virtual ~BaseEventData(void) {}

	// Returns the type of the event
	virtual const EventType& VGetEventType(void) const = 0;
	
	float VGetTimeStamp(void) const { return m_TimeStamp; }

	// Serializing for network out
	virtual void VSerialized(std::ostrstream& out) const {}
};