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