Мабуть протягну все-таки Boost у Stargazer у 2.408.
"Причесав" і узагальнив попередню реалізацію делегатів
Вибачайте за дещо незвичний coding style, історичний наслідок проекту.
(реалізацію тривіальних методів пропущено)
Потужність C++ вражає. Ще більше вражає його "читабельність".
Upd: забув про #include <list>
Upd2: забув про #include <actions.inl.h>
"Причесав" і узагальнив попередню реалізацію делегатів
Вибачайте за дещо незвичний coding style, історичний наслідок проекту.
#ifndef __ACTIONS_H__
#define __ACTIONS_H__
// Usage:
//
// ACTIONS<CLASS, DATA>::LIST actionsList;
// CLASS myClass;
// DATA myData1;
// DATA myData2;
//
// actionsList.Enqueue(&CLASS::myMethod1, myData1);
// actionsList.Enqueue(&CLASS::myMethod2, myData2);
//
// std::for_each(
// actionsList.begin(),
// actionsList.end(),
// INVOKE_ACTION<CLASS, DATA>(&myClass)
// );
#include <pthread.h>
// Generalized actor type - a method of some class with one argument
template <class ACTIVE_CLASS, typename DATA_TYPE>
struct ACTOR
{
typedef void (ACTIVE_CLASS::*TYPE)(DATA_TYPE);
};
// Generalized action type - an actor with it's data
template <class ACTIVE_CLASS, typename DATA_TYPE>
struct ACTION
{
typename ACTOR<ACTIVE_CLASS, DATA_TYPE>::TYPE actor;
DATA_TYPE data;
ACTION(typename ACTOR<ACTIVE_CLASS, DATA_TYPE>::TYPE a, DATA_TYPE d)
: actor(a), data(d) {};
};
// A list of an actions
// All methods are thread-safe
template <class ACTIVE_CLASS, typename DATA_TYPE>
class ACTIONS_LIST : private std::list<ACTION<ACTIVE_CLASS, DATA_TYPE> >
{
public:
// Just a typedef for parent class
typedef std::list<ACTION<ACTIVE_CLASS, DATA_TYPE> > parent;
// Initialize mutex
ACTIONS_LIST();
// Destroy mutex
~ACTIONS_LIST();
typename parent::iterator begin();
typename parent::iterator end();
typename parent::const_iterator begin() const;
typename parent::const_iterator end() const;
bool empty() const;
size_t size() const;
void swap(ACTIONS_LIST & list);
// Add an action to list
void Enqueue(typename ACTOR<ACTIVE_CLASS, DATA_TYPE>::TYPE a, DATA_TYPE d);
private:
mutable pthread_mutex_t mutex;
};
// Generalized functor for handling actions with std::for_each
template <class ACTIVE_CLASS, typename DATA_TYPE>
class INVOKE_ACTION
: public std::unary_function<const ACTION<ACTIVE_CLASS, DATA_TYPE> &, void>
{
public:
INVOKE_ACTION(ACTIVE_CLASS & as) : activeClass(as) {};
void operator()(const ACTION<ACTIVE_CLASS, DATA_TYPE> & action);
private:
ACTIVE_CLASS & activeClass;
};
#endif
|
| _Winnie C++ Colorizer |
(реалізацію тривіальних методів пропущено)
#ifndef __ACTIONS_INL_H__
#define __ACTIONS_INL_H__
// ...
template <class ACTIVE_CLASS, typename DATA_TYPE>
void ACTIONS_LIST<ACTIVE_CLASS, DATA_TYPE>::Enqueue(typename ACTOR<ACTIVE_CLASS, DATA_TYPE>::TYPE a, DATA_TYPE d)
{
STG_LOCKER lock(&mutex, __FILE__, __LINE__);
push_back(ACTION<ACTIVE_CLASS, DATA_TYPE>(a, d));
};
template <class ACTIVE_CLASS, typename DATA_TYPE>
void INVOKE_ACTION<ACTIVE_CLASS, DATA_TYPE>::operator()(const ACTION<ACTIVE_CLASS, DATA_TYPE> & action)
{
// Call method 'action.actor' of 'activeClass' with data 'action.data'
(activeClass.*action.actor)(action.data);
}
#endif
|
| _Winnie C++ Colorizer |
Потужність C++ вражає. Ще більше вражає його "читабельність".
Upd: забув про #include <list>
Upd2: забув про #include <actions.inl.h>