event

#ifndef ODBCLIB_CORE_EVENT_EVENT_H
#define ODBCLIB_CORE_EVENT_EVENT_H

#include "Event.template"
#include "Event.implement"

#endif

 

#ifndef ODBCLIB_CORE_EVENT_EVENT_TEMPLATE
#define ODBCLIB_CORE_EVENT_EVENT_TEMPLATE

#include <vector>

namespace odbclib
{
	namespace core
	{
		namespace event
		{
			template <typename EventArgType> class EventListener;

			template<typename EventArgType>
			class Event
			{
			public:
				typedef std::vector< EventListener<EventArgType>* > ListenerList;

			public:
				virtual ~Event();
				virtual Event & addListener		(EventListener<EventArgType> &);
				virtual Event & removeListener	(EventListener<EventArgType> &);
				virtual Event & removeListeners	();

				virtual void notifyListeners(EventArgType const&);
			private:
				ListenerList m_listeners;
			};
		}
	}
}

#endif

 

#include "EventListener.template"
#include <algorithm>

namespace odbclib
{
	namespace core
	{
		namespace event
		{
			template<typename T>
			Event<T>::~Event()
			{
				removeListeners();
			}

			template<typename T>
			Event<T> & Event<T>::addListener(EventListener<T> &listener)
			{ 
				m_listeners.push_back(&listener);
				listener.m_events.push_back(this);
				return *this;
			}

			template<typename T>
			Event<T> & Event<T>::removeListener(EventListener<T> &listener)
			{
				m_listeners.erase(
					std::remove(
						m_listeners.begin(),
						m_listeners.end(),
						&listener),
					m_listeners.end());
				listener.m_events.erase(
					std::remove(
						listener.m_events.begin(),
						listener.m_events.end(),
						this),
					listener.m_events.end());
				return *this;
			}

			template<typename T>
			Event<T> & Event<T>::removeListeners()
			{
				ListenerList listeners(m_listeners);
				for(typename ListenerList::iterator iter = listeners.begin();
					iter != listeners.end(); ++iter)
					(*iter)->m_events.erase(
						std::remove(
							(*iter)->m_events.begin(),
							(*iter)->m_events.end(),
							this),
						(*iter)->m_events.end());	
				m_listeners.clear();
				return *this;
			}

			template<typename T>
			void Event<T>::notifyListeners(T const& e)
			{
				ListenerList listeners(m_listeners);
				for(typename ListenerList::iterator iter = listeners.begin();
					iter != listeners.end(); ++iter)
					(*iter)->onEvent(e);
			}
		}
	}
}

 

#ifndef ODBCLIB_CORE_EVENT_EVENTLISTENER_H
#define ODBCLIB_CORE_EVENT_EVENTLISTENER_H

#include "EventListener.template"
#include "EventListener.implement"

#endif

 

#ifndef ODBCILB_CORE_EVENT_EVENTLISTENER_TEMPLATE
#define ODBCILB_CORE_EVENT_EVENTLISTENER_TEMPLATE

#include <vector>

namespace odbclib
{
	namespace core
	{
		namespace event
		{
			template<typename EventArgType> class Event;

			template<typename EventArgType>
			class EventListener
			{
			public:
				typedef std::vector< Event<EventArgType>* > EventList;

				virtual ~EventListener();
				virtual void onEvent(EventArgType const&);

			private:
				EventList m_events;

				friend class Event<EventArgType>;
			};
		}
	}
}

#endif

 

#include "Event.template"

#include <algorithm>

namespace odbclib
{
	namespace core
	{
		namespace event
		{
			template<typename T>
			EventListener<T>::~EventListener()
			{
				EventList events(m_events);
				for(typename EventList::iterator iter = events.begin();
					iter != events.end(); ++iter)
					(*iter)->removeListener(*this);
			}

			template<typename T>
			void EventListener<T>::onEvent(T const& e)
			{
	
			}
		}
	}
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值