madf: (Default)
[personal profile] madf
Мабуть протягну все-таки Boost у Stargazer у 2.408.
"Причесав" і узагальнив попередню реалізацію делегатів

Вибачайте за дещо незвичний 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>
This account has disabled anonymous posting.
If you don't have an account you can create one now.
HTML doesn't work in the subject.
More info about formatting

Profile

madf: (Default)
madf

April 2018

S M T W T F S
1234567
891011121314
15161718192021
22232425262728
2930     

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Jun. 8th, 2026 06:31 pm
Powered by Dreamwidth Studios