mirror of
https://github.com/duilib/duilib.git
synced 2026-10-17 06:01:08 +08:00
467cab8148
Duilib暂不会有新特性增加,但已经准备一段时间修改代码目录管理结构,重构Demo 闲置半年多未更新一方面忙于生计,也源于提高内功 感谢Duilib原作者同意迁移SVN官方地址,便于社区维护 最后特别感谢【Duilib官方交流群3】活跃开发者们的帮助指导,为Duilib的重构提供了很多帮助,也为我个人成长提供指导
96 lines
2.0 KiB
C++
96 lines
2.0 KiB
C++
#include "StdAfx.h"
|
|
|
|
namespace DuiLib {
|
|
|
|
CDelegateBase::CDelegateBase(void* pObject, void* pFn)
|
|
{
|
|
m_pObject = pObject;
|
|
m_pFn = pFn;
|
|
}
|
|
|
|
CDelegateBase::CDelegateBase(const CDelegateBase& rhs)
|
|
{
|
|
m_pObject = rhs.m_pObject;
|
|
m_pFn = rhs.m_pFn;
|
|
}
|
|
|
|
CDelegateBase::~CDelegateBase()
|
|
{
|
|
|
|
}
|
|
|
|
bool CDelegateBase::Equals(const CDelegateBase& rhs) const
|
|
{
|
|
return m_pObject == rhs.m_pObject && m_pFn == rhs.m_pFn;
|
|
}
|
|
|
|
bool CDelegateBase::operator() (void* param)
|
|
{
|
|
return Invoke(param);
|
|
}
|
|
|
|
void* CDelegateBase::GetFn()
|
|
{
|
|
return m_pFn;
|
|
}
|
|
|
|
void* CDelegateBase::GetObject()
|
|
{
|
|
return m_pObject;
|
|
}
|
|
|
|
CEventSource::~CEventSource()
|
|
{
|
|
for( int i = 0; i < m_aDelegates.GetSize(); i++ ) {
|
|
CDelegateBase* pObject = static_cast<CDelegateBase*>(m_aDelegates[i]);
|
|
if( pObject) delete pObject;
|
|
}
|
|
}
|
|
|
|
CEventSource::operator bool()
|
|
{
|
|
return m_aDelegates.GetSize() > 0;
|
|
}
|
|
|
|
void CEventSource::operator+= (const CDelegateBase& d)
|
|
{
|
|
for( int i = 0; i < m_aDelegates.GetSize(); i++ ) {
|
|
CDelegateBase* pObject = static_cast<CDelegateBase*>(m_aDelegates[i]);
|
|
if( pObject && pObject->Equals(d) ) return;
|
|
}
|
|
|
|
m_aDelegates.Add(d.Copy());
|
|
}
|
|
|
|
void CEventSource::operator+= (FnType pFn)
|
|
{
|
|
(*this) += MakeDelegate(pFn);
|
|
}
|
|
|
|
void CEventSource::operator-= (const CDelegateBase& d)
|
|
{
|
|
for( int i = 0; i < m_aDelegates.GetSize(); i++ ) {
|
|
CDelegateBase* pObject = static_cast<CDelegateBase*>(m_aDelegates[i]);
|
|
if( pObject && pObject->Equals(d) ) {
|
|
delete pObject;
|
|
m_aDelegates.Remove(i);
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
void CEventSource::operator-= (FnType pFn)
|
|
{
|
|
(*this) -= MakeDelegate(pFn);
|
|
}
|
|
|
|
bool CEventSource::operator() (void* param)
|
|
{
|
|
for( int i = 0; i < m_aDelegates.GetSize(); i++ ) {
|
|
CDelegateBase* pObject = static_cast<CDelegateBase*>(m_aDelegates[i]);
|
|
if( pObject && !(*pObject)(param) ) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
} // namespace DuiLib
|