#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)
{
}
}
}
}
分享到:
相关推荐
`keybd_event` 和 `mouse_event` 是Windows API(应用程序接口)中两个非常重要的函数,它们允许程序员模拟这些行为。让我们深入探讨这两个函数以及它们如何工作。 **一、`keybd_event` 函数** `keybd_event` 是...
C#事件(event)使用方法详解 事件(event)是C#中的一种机制,允许对象在发生某些情况时通知其他对象。事件(event)使用方法详解将从概念、使用方法、事件编程的优点、事件与委托的关系、事件的实现等方面进行讲解。 ...
EventLog Analyzer产品介绍 EventLog Analyzer是一个全面的日志管理和审计SIEM解决方案,旨在帮助组织对日志进行收集、关联分析、实时告警和审计。该解决方案支持多种日志类型,包括Windows、Linux/Unix服务器日志...
+ 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详解 #### 一、概述 在Web开发中,事件处理是非常重要的一个环节,它使得页面能够响应用户的交互行为。`event`对象是JavaScript中的一个重要对象,用于捕获用户或浏览器的动作,例如点击按钮...
Visual Event是一款功能强大的JavaScript事件侦测工具,尤其适用于前端开发者和网页设计师。它是一个插件,可以在多种浏览器上使用,包括但不限于谷歌浏览器,正如描述中所提到的,你也可以在百度或360浏览器上安装...
【Event Recorder:终极调试工具】 在嵌入式系统开发中,调试是不可或缺的一环,而“Event Recorder”作为一款强大的终极调试工具,被广泛应用于实时操作系统(RTOS)如RTT(Real Time ThreadX)中。它能帮助开发者...
### C++ Event 机制的简单实现 #### 一、事件模型概述 在计算机编程领域,事件模型(Event Model)是一种常用的设计模式,它主要用于处理异步事件。尤其在GUI应用程序开发中,事件驱动的架构十分常见。本文将详细...
### mouse_event事件详解 在计算机编程领域,尤其是前端开发与动画设计中,`mouse_event`事件扮演着至关重要的角色,它们允许开发者响应用户的鼠标操作,从而实现动态且交互丰富的用户体验。本文将深入探讨`mouse_...
《jQuery Event Drag 插件深度解析与应用实践》 在Web开发中,用户交互体验的提升是关键之一,其中拖放(Drag and Drop)功能尤为常见,如文件管理、元素布局等。jQuery作为广泛使用的JavaScript库,提供了丰富的...
在Windows操作系统中,事件查看器(Event Viewer)是一个强大的工具,用于查看系统、应用程序和安全日志中的事件。开发者可以通过编程方式将应用日志写入事件查看器,以供后期分析和故障排查。C#提供了方便的API来...
《eventlog:解析Windows与UNIX系统日志的关键工具》 在IT系统管理中,日志文件扮演着至关重要的角色,它们记录了系统运行时的各种事件,包括错误、警告、信息和调试数据。对于Windows和UNIX/Linux系统的管理员而言...
Eventlog Analyzer日志管理系统、日志分析工具、日志服务器的功能及作用 Eventlog Analyzer是用来分析和审计系统及事件日志的管理软件,能够对全网范围内的主机、服务器、网络设备、数据库以及各种应用服务系统等...
《前端项目:EventSource-Polyfill的深度解析》 在前端开发中,实时通信是不可或缺的一部分,它使得网站能够及时地获取服务器端的更新,无需不断地刷新页面。EventSource,即Server-Sent Events(SSE),是HTML5...
Activity Details独木舟水球同乐日 及 独木舟水球邀请赛 @ 迪欣湖 [2010年7月3,4日...独木舟水球邀请赛将 迪欣湖活动中心举行ㄛ欢迎光临观赛〔详情请 览 http://www.facebook.com/event.php?eid=115015881876447 ...
在Qt库中,`timeEvent`是一个用于处理定时事件的机制,它是在窗口系统级别的事件循环中触发的。这个机制允许我们每隔一定时间执行特定的代码,而不依赖于QTimer等用户界面对象。`timeEvent`是QWidget类的一个虚函数...
Event in gem5 gem5 是一个开源的计算机架构模拟器,它可以模拟处理器、存储器、总线、外设等计算机系统的各个组件。gem5 的 Event 机制是其核心组件之一,负责处理模拟器中的事件调度和同步。在本文中,我们将深入...
### 使用kb_event函数模拟键盘操作 #### 概述 在编程领域中,有时我们需要通过程序来模拟键盘操作,以实现自动化任务或者测试某些特定的功能。本文将详细介绍如何使用`kb_event`函数(实际上是`keybd_event`)在VB...
"C程序架构之事件调用机制 event"的主题着重于如何在C语言环境中实现事件处理机制。事件调用机制允许程序异步地响应外部或内部事件,提高了程序的效率和响应性。 首先,我们来看`list.c`和`list.h`这两个文件。它们...
【ManageEngine EventLogAnalyzer 12.04】是一款由ManageEngine公司开发的企业级日志管理软件,专门用于收集、分析和报告系统事件日志。该版本提供了强大的日志管理和安全监控功能,帮助企业IT管理员更好地理解和...