`
chenqi210
  • 浏览: 79187 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

event

    博客分类:
  • c++
 
阅读更多
#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)
			{
	
			}
		}
	}
}
 
分享到:
评论

相关推荐

    FreeSwitch的event_socket模块分析

    FreeSwitch的mod_event_socket模块是其核心组件之一,它提供了通过socket进行远程控制FreeSwitch的能力。这个模块使得管理员或者第三方应用程序能够与FreeSwitch交互,执行API命令,接收和发送事件,进行日志记录...

    keybd_event,mouse_event 模拟产生键盘事件、鼠标事件的使用

    `keybd_event` 和 `mouse_event` 是Windows API(应用程序接口)中两个非常重要的函数,它们允许程序员模拟这些行为。让我们深入探讨这两个函数以及它们如何工作。 **一、`keybd_event` 函数** `keybd_event` 是...

    C#事件(event)使用方法详解

    C#事件(event)使用方法详解 事件(event)是C#中的一种机制,允许对象在发生某些情况时通知其他对象。事件(event)使用方法详解将从概念、使用方法、事件编程的优点、事件与委托的关系、事件的实现等方面进行讲解。 ...

    EventLog Analyzer产品介绍

    EventLog Analyzer产品介绍 EventLog Analyzer是一个全面的日志管理和审计SIEM解决方案,旨在帮助组织对日志进行收集、关联分析、实时告警和审计。该解决方案支持多种日志类型,包括Windows、Linux/Unix服务器日志...

    Event_Log_Explorer_4.3.8.zi

    + Added Custom columns - you can extract information from description and display it in event list. + Added alerts by event type. * NewAPI: Event description could be missing for some events. Fixed. *...

    event和srcElement说明,方法,技巧

    ### event和srcElement详解 #### 一、概述 在Web开发中,事件处理是非常重要的一个环节,它使得页面能够响应用户的交互行为。`event`对象是JavaScript中的一个重要对象,用于捕获用户或浏览器的动作,例如点击按钮...

    visualevent.zip

    Visual Event是一款功能强大的JavaScript事件侦测工具,尤其适用于前端开发者和网页设计师。它是一个插件,可以在多种浏览器上使用,包括但不限于谷歌浏览器,正如描述中所提到的,你也可以在百度或360浏览器上安装...

    V4-终极调试工具Event Recorder

    【Event Recorder:终极调试工具】 在嵌入式系统开发中,调试是不可或缺的一环,而“Event Recorder”作为一款强大的终极调试工具,被广泛应用于实时操作系统(RTOS)如RTT(Real Time ThreadX)中。它能帮助开发者...

    C++Event机制的简单实现

    ### C++ Event 机制的简单实现 #### 一、事件模型概述 在计算机编程领域,事件模型(Event Model)是一种常用的设计模式,它主要用于处理异步事件。尤其在GUI应用程序开发中,事件驱动的架构十分常见。本文将详细...

    mouse_event事件

    ### mouse_event事件详解 在计算机编程领域,尤其是前端开发与动画设计中,`mouse_event`事件扮演着至关重要的角色,它们允许开发者响应用户的鼠标操作,从而实现动态且交互丰富的用户体验。本文将深入探讨`mouse_...

    jquery.event.drag jquery拖动插件

    《jQuery Event Drag 插件深度解析与应用实践》 在Web开发中,用户交互体验的提升是关键之一,其中拖放(Drag and Drop)功能尤为常见,如文件管理、元素布局等。jQuery作为广泛使用的JavaScript库,提供了丰富的...

    C#写入事件查看器、eventLog控件使用DEMO

    在Windows操作系统中,事件查看器(Event Viewer)是一个强大的工具,用于查看系统、应用程序和安全日志中的事件。开发者可以通过编程方式将应用日志写入事件查看器,以供后期分析和故障排查。C#提供了方便的API来...

    eventlog_0.2.12.tar.gz

    《eventlog:解析Windows与UNIX系统日志的关键工具》 在IT系统管理中,日志文件扮演着至关重要的角色,它们记录了系统运行时的各种事件,包括错误、警告、信息和调试数据。对于Windows和UNIX/Linux系统的管理员而言...

    EventLog_Analyzer.zip

    Eventlog Analyzer日志管理系统、日志分析工具、日志服务器的功能及作用  Eventlog Analyzer是用来分析和审计系统及事件日志的管理软件,能够对全网范围内的主机、服务器、网络设备、数据库以及各种应用服务系统等...

    前端项目-event-source-polyfill.zip

    《前端项目:EventSource-Polyfill的深度解析》 在前端开发中,实时通信是不可或缺的一部分,它使得网站能够及时地获取服务器端的更新,无需不断地刷新页面。EventSource,即Server-Sent Events(SSE),是HTML5...

    EVENT TAG EVENT TAG EVENT TAG

    Activity Details独木舟水球同乐日 及 独木舟水球邀请赛 @ 迪欣湖 [2010年7月3,4日...独木舟水球邀请赛将 迪欣湖活动中心举行ㄛ欢迎光临观赛〔详情请 览 http://www.facebook.com/event.php?eid=115015881876447 ...

    timeEvent_demo

    在Qt库中,`timeEvent`是一个用于处理定时事件的机制,它是在窗口系统级别的事件循环中触发的。这个机制允许我们每隔一定时间执行特定的代码,而不依赖于QTimer等用户界面对象。`timeEvent`是QWidget类的一个虚函数...

    Event in gem5

    Event in gem5 gem5 是一个开源的计算机架构模拟器,它可以模拟处理器、存储器、总线、外设等计算机系统的各个组件。gem5 的 Event 机制是其核心组件之一,负责处理模拟器中的事件调度和同步。在本文中,我们将深入...

    使用 kb_event 函数模拟键盘操作...

    ### 使用kb_event函数模拟键盘操作 #### 概述 在编程领域中,有时我们需要通过程序来模拟键盘操作,以实现自动化任务或者测试某些特定的功能。本文将详细介绍如何使用`kb_event`函数(实际上是`keybd_event`)在VB...

    C程序架构之事件调用机制 event

    "C程序架构之事件调用机制 event"的主题着重于如何在C语言环境中实现事件处理机制。事件调用机制允许程序异步地响应外部或内部事件,提高了程序的效率和响应性。 首先,我们来看`list.c`和`list.h`这两个文件。它们...

Global site tag (gtag.js) - Google Analytics