File: eventHandler.hpp - Tab length: 1 2 4 8 - Lines: on off - No wrap: on off


#ifndef _PANE_EVENT
#define _PANE_EVENT

#include <vector>

namespace   Pane
{
    /*
    ** EventHandler class (4 parameters)
    */

    template<typename Return, typename Param1 = void, typename Param2 = void, typename Param3 = void, typename Param4 = void>
    class   EventHandler
    {
        public:
            class   EventClass
            {
                public:
                    virtual         ~EventClass ()
                    {
                    }

                    virtual Return  operator () (Param1, Param2, Param3, Param4) = 0;
            };

            template<typename Sender = void>
            class   Event : public EventClass
            {
                public:
                    typedef Return  (Sender::*Method) (Param1, Param2, Param3, Param4);

                    /**/    Event (Sender* sender, Method method) :
                        method (method),
                        sender (sender)
                    {
                    }

                    virtual Return  operator () (Param1 param1, Param2 param2, Param3 param3, Param4 param4)
                    {
                        return (this->sender->*method) (param1, param2, param3, param4);
                    }

                private:
                    Method  method;
                    Sender* sender;
            };

            /**/    ~EventHandler ();

            void    operator += (EventClass*);
            bool    operator () (Param1, Param2, Param3, Param4);

        private:
            typedef std::vector<EventClass*>    Events;

            Events  events;
    };

    /*
    ** EventHandler class (3 parameters)
    */

    template<typename Return, typename Param1, typename Param2, typename Param3>
    class   EventHandler<Return, Param1, Param2, Param3>
    {
        public:
            class   EventClass
            {
                public:
                    virtual         ~EventClass ()
                    {
                    }

                    virtual Return  operator () (Param1, Param2, Param3) = 0;
            };

            template<typename Sender = void>
            class   Event : public EventClass
            {
                public:
                    typedef Return  (Sender::*Method) (Param1, Param2, Param3);

                    /**/    Event (Sender* sender, Method method) :
                        method (method),
                        sender (sender)
                    {
                    }

                    virtual Return  operator () (Param1 param1, Param2 param2, Param3 param3)
                    {
                        return (this->sender->*method) (param1, param2, param3);
                    }

                private:
                    Method  method;
                    Sender* sender;
            };

            /**/    ~EventHandler ();

            void    operator += (EventClass*);
            bool    operator () (Param1, Param2, Param3);

        private:
            typedef std::vector<EventClass*>    Events;

            Events  events;
    };

    /*
    ** EventHandler class (2 parameters)
    */

    template<typename Return, typename Param1, typename Param2>
    class   EventHandler<Return, Param1, Param2>
    {
        public:
            class   EventClass
            {
                public:
                    virtual         ~EventClass ()
                    {
                    }

                    virtual Return  operator () (Param1, Param2) = 0;
            };

            template<typename Sender = void>
            class   Event : public EventClass
            {
                public:
                    typedef Return  (Sender::*Method) (Param1, Param2);

                    /**/    Event (Sender* sender, Method method) :
                        method (method),
                        sender (sender)
                    {
                    }

                    virtual Return  operator () (Param1 param1, Param2 param2)
                    {
                        return (this->sender->*method) (param1, param2);
                    }

                private:
                    Method  method;
                    Sender* sender;
            };

            /**/    ~EventHandler ();

            void    operator += (EventClass*);
            bool    operator () (Param1, Param2);

        private:
            typedef std::vector<EventClass*>    Events;

            Events  events;
    };

    /*
    ** EventHandler class (1 parameter)
    */

    template<typename Return, typename Param1>
    class   EventHandler<Return, Param1>
    {
        public:
            class   EventClass
            {
                public:
                    virtual         ~EventClass ()
                    {
                    }

                    virtual Return  operator () (Param1) = 0;
            };

            template<typename Sender = void>
            class   Event : public EventClass
            {
                public:
                    typedef Return  (Sender::*Method) (Param1);

                    /**/    Event (Sender* sender, Method method) :
                        method (method),
                        sender (sender)
                    {
                    }

                    virtual Return  operator () (Param1 param1)
                    {
                        return (this->sender->*method) (param1);
                    }

                private:
                    Method  method;
                    Sender* sender;
            };

            /**/    ~EventHandler ();

            void    operator += (EventClass*);
            bool    operator () (Param1);

        private:
            typedef std::vector<EventClass*>    Events;

            Events  events;
    };

    /*
    ** EventHandler class (0 parameter)
    */

    template<typename Return>
    class   EventHandler<Return>
    {
        public:
            class   EventClass
            {
                public:
                    virtual         ~EventClass ()
                    {
                    }

                    virtual Return  operator () () = 0;
            };

            template<typename Sender = void>
            class   Event : public EventClass
            {
                public:
                    typedef Return  (Sender::*Method) ();

                    /**/    Event (Sender* sender, Method method) :
                        method (method),
                        sender (sender)
                    {
                    }

                    virtual Return  operator () ()
                    {
                        return (this->sender->*method) ();
                    }

                private:
                    Method  method;
                    Sender* sender;
            };

            /**/    ~EventHandler ();

            void    operator += (EventClass*);
            bool    operator () ();

        private:
            typedef std::vector<EventClass*>    Events;

            Events  events;
    };
}

#include "eventHandler.hxx"

#endif // _PANE_EVENT