sigslot.h

来自「本人收集整理的一份c/c++跨平台网络库」· C头文件 代码 · 共 2,564 行 · 第 1/5 页

H
2,564
字号
			lock_block<mt_policy> lock(this);			typename connections_list::const_iterator it = m_connected_slots.begin();			typename connections_list::const_iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				(*it)->getdest()->signal_disconnect(this);				delete *it;				++it;			}			m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());		}#ifdef _DEBUG			bool connected(has_slots<mt_policy>* pclass)		{			lock_block<mt_policy> lock(this);			typename connections_list::const_iterator itNext, it = m_connected_slots.begin();			typename connections_list::const_iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				itNext = it;				++itNext;				if ((*it)->getdest() == pclass)					return true;				it = itNext;			}			return false;		}#endif		void disconnect(has_slots<mt_policy>* pclass)		{			lock_block<mt_policy> lock(this);			typename connections_list::iterator it = m_connected_slots.begin();			typename connections_list::iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				if((*it)->getdest() == pclass)				{					delete *it;					m_connected_slots.erase(it);					pclass->signal_disconnect(this);					return;				}				++it;			}		}		void slot_disconnect(has_slots<mt_policy>* pslot)		{			lock_block<mt_policy> lock(this);			typename connections_list::iterator it = m_connected_slots.begin();			typename connections_list::iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				typename connections_list::iterator itNext = it;				++itNext;				if((*it)->getdest() == pslot)				{					m_connected_slots.erase(it);					//			delete *it;				}				it = itNext;			}		}		void slot_duplicate(const has_slots<mt_policy>* oldtarget, has_slots<mt_policy>* newtarget)		{			lock_block<mt_policy> lock(this);			typename connections_list::iterator it = m_connected_slots.begin();			typename connections_list::iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				if((*it)->getdest() == oldtarget)				{					m_connected_slots.push_back((*it)->duplicate(newtarget));				}				++it;			}		}	protected:		connections_list m_connected_slots;   	};	template<class arg1_type, class mt_policy>	class _signal_base1 : public _signal_base<mt_policy>	{	public:		typedef std::list<_connection_base1<arg1_type, mt_policy> *>  connections_list;		_signal_base1()		{			;		}		_signal_base1(const _signal_base1<arg1_type, mt_policy>& s)			: _signal_base<mt_policy>(s)		{			lock_block<mt_policy> lock(this);			typename connections_list::const_iterator it = s.m_connected_slots.begin();			typename connections_list::const_iterator itEnd = s.m_connected_slots.end();			while(it != itEnd)			{				(*it)->getdest()->signal_connect(this);				m_connected_slots.push_back((*it)->clone());				++it;			}		}		void slot_duplicate(const has_slots<mt_policy>* oldtarget, has_slots<mt_policy>* newtarget)		{			lock_block<mt_policy> lock(this);			typename connections_list::iterator it = m_connected_slots.begin();			typename connections_list::iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				if((*it)->getdest() == oldtarget)				{					m_connected_slots.push_back((*it)->duplicate(newtarget));				}				++it;			}		}		~_signal_base1()		{			disconnect_all();		}		void disconnect_all()		{			lock_block<mt_policy> lock(this);			typename connections_list::const_iterator it = m_connected_slots.begin();			typename connections_list::const_iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				(*it)->getdest()->signal_disconnect(this);				delete *it;				++it;			}			m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());		}#ifdef _DEBUG			bool connected(has_slots<mt_policy>* pclass)		{			lock_block<mt_policy> lock(this);			typename connections_list::const_iterator itNext, it = m_connected_slots.begin();			typename connections_list::const_iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				itNext = it;				++itNext;				if ((*it)->getdest() == pclass)					return true;				it = itNext;			}			return false;		}#endif		void disconnect(has_slots<mt_policy>* pclass)		{			lock_block<mt_policy> lock(this);			typename connections_list::iterator it = m_connected_slots.begin();			typename connections_list::iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				if((*it)->getdest() == pclass)				{					delete *it;					m_connected_slots.erase(it);					pclass->signal_disconnect(this);					return;				}				++it;			}		}		void slot_disconnect(has_slots<mt_policy>* pslot)		{			lock_block<mt_policy> lock(this);			typename connections_list::iterator it = m_connected_slots.begin();			typename connections_list::iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				typename connections_list::iterator itNext = it;				++itNext;				if((*it)->getdest() == pslot)				{					m_connected_slots.erase(it);					//			delete *it;				}				it = itNext;			}		}	protected:		connections_list m_connected_slots;   	};	template<class arg1_type, class arg2_type, class mt_policy>	class _signal_base2 : public _signal_base<mt_policy>	{	public:		typedef std::list<_connection_base2<arg1_type, arg2_type, mt_policy> *>			connections_list;		_signal_base2()		{			;		}		_signal_base2(const _signal_base2<arg1_type, arg2_type, mt_policy>& s)			: _signal_base<mt_policy>(s)		{			lock_block<mt_policy> lock(this);			typename connections_list::const_iterator it = s.m_connected_slots.begin();			typename connections_list::const_iterator itEnd = s.m_connected_slots.end();			while(it != itEnd)			{				(*it)->getdest()->signal_connect(this);				m_connected_slots.push_back((*it)->clone());				++it;			}		}		void slot_duplicate(const has_slots<mt_policy>* oldtarget, has_slots<mt_policy>* newtarget)		{			lock_block<mt_policy> lock(this);			typename connections_list::iterator it = m_connected_slots.begin();			typename connections_list::iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				if((*it)->getdest() == oldtarget)				{					m_connected_slots.push_back((*it)->duplicate(newtarget));				}				++it;			}		}		~_signal_base2()		{			disconnect_all();		}		void disconnect_all()		{			lock_block<mt_policy> lock(this);			typename connections_list::const_iterator it = m_connected_slots.begin();			typename connections_list::const_iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				(*it)->getdest()->signal_disconnect(this);				delete *it;				++it;			}			m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());		}#ifdef _DEBUG			bool connected(has_slots<mt_policy>* pclass)		{			lock_block<mt_policy> lock(this);			typename connections_list::const_iterator itNext, it = m_connected_slots.begin();			typename connections_list::const_iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				itNext = it;				++itNext;				if ((*it)->getdest() == pclass)					return true;				it = itNext;			}			return false;		}#endif		void disconnect(has_slots<mt_policy>* pclass)		{			lock_block<mt_policy> lock(this);			typename connections_list::iterator it = m_connected_slots.begin();			typename connections_list::iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				if((*it)->getdest() == pclass)				{					delete *it;					m_connected_slots.erase(it);					pclass->signal_disconnect(this);					return;				}				++it;			}		}		void slot_disconnect(has_slots<mt_policy>* pslot)		{			lock_block<mt_policy> lock(this);			typename connections_list::iterator it = m_connected_slots.begin();			typename connections_list::iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				typename connections_list::iterator itNext = it;				++itNext;				if((*it)->getdest() == pslot)				{					m_connected_slots.erase(it);					//			delete *it;				}				it = itNext;			}		}	protected:		connections_list m_connected_slots;   	};	template<class arg1_type, class arg2_type, class arg3_type, class mt_policy>	class _signal_base3 : public _signal_base<mt_policy>	{	public:		typedef std::list<_connection_base3<arg1_type, arg2_type, arg3_type, mt_policy> *>			connections_list;		_signal_base3()		{			;		}		_signal_base3(const _signal_base3<arg1_type, arg2_type, arg3_type, mt_policy>& s)			: _signal_base<mt_policy>(s)		{			lock_block<mt_policy> lock(this);			typename connections_list::const_iterator it = s.m_connected_slots.begin();			typename connections_list::const_iterator itEnd = s.m_connected_slots.end();			while(it != itEnd)			{				(*it)->getdest()->signal_connect(this);				m_connected_slots.push_back((*it)->clone());				++it;			}		}		void slot_duplicate(const has_slots<mt_policy>* oldtarget, has_slots<mt_policy>* newtarget)		{			lock_block<mt_policy> lock(this);			typename connections_list::iterator it = m_connected_slots.begin();			typename connections_list::iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				if((*it)->getdest() == oldtarget)				{					m_connected_slots.push_back((*it)->duplicate(newtarget));				}				++it;			}		}		~_signal_base3()		{			disconnect_all();		}		void disconnect_all()		{			lock_block<mt_policy> lock(this);			typename connections_list::const_iterator it = m_connected_slots.begin();			typename connections_list::const_iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				(*it)->getdest()->signal_disconnect(this);				delete *it;				++it;			}			m_connected_slots.erase(m_connected_slots.begin(), m_connected_slots.end());		}#ifdef _DEBUG			bool connected(has_slots<mt_policy>* pclass)		{			lock_block<mt_policy> lock(this);			typename connections_list::const_iterator itNext, it = m_connected_slots.begin();			typename connections_list::const_iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				itNext = it;				++itNext;				if ((*it)->getdest() == pclass)					return true;				it = itNext;			}			return false;		}#endif		void disconnect(has_slots<mt_policy>* pclass)		{			lock_block<mt_policy> lock(this);			typename connections_list::iterator it = m_connected_slots.begin();			typename connections_list::iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				if((*it)->getdest() == pclass)				{					delete *it;					m_connected_slots.erase(it);					pclass->signal_disconnect(this);					return;				}				++it;			}		}		void slot_disconnect(has_slots<mt_policy>* pslot)		{			lock_block<mt_policy> lock(this);			typename connections_list::iterator it = m_connected_slots.begin();			typename connections_list::iterator itEnd = m_connected_slots.end();			while(it != itEnd)			{				typename connections_list::iterator itNext = it;				++itNext;				if((*it)->getdest() == pslot)				{					m_connected_slots.erase(it);					//			delete *it;				}				it = itNext;			}		}	protected:		connections_list m_connected_slots;   	};	template<class arg1_type, class arg2_type, class arg3_type, class arg4_type, class mt_policy>	class _signal_base4 : public _signal_base<mt_policy>	{	public:		typedef std::list<_connection_base4<arg1_type, arg2_type, arg3_type,			arg4_type, mt_policy> *>  connections_list;		_signal_base4()		{			;		}		_signal_base4(const _signal_base4<arg1_type, arg2_type, arg3_type, arg4_type, mt_policy>& s)			: _signal_base<mt_policy>(s)		{			lock_block<mt_policy> lock(this);			typename connections_list::const_iterator it = s.m_connected_slots.begin();			typename connections_list::const_iterator itEnd = s.m_connected_slots.end();			while(it != itEnd)			{				(*it)->getdest()->signal_connect(this);				m_connected_slots.push_back((*it)->clone());				++it;			}		}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?