Planet
navi homePPSaboutscreenshotsdownloaddevelopmentforum

Ignore:
Timestamp:
Oct 13, 2009, 5:05:17 PM (15 years ago)
Author:
dafrick
Message:

Hopefully merged trunk successfully into pickup branch.

Location:
code/branches/pickup
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • code/branches/pickup

  • code/branches/pickup/src/libraries/core/EventIncludes.h

    r5781 r5935  
    3232#include "CorePrereqs.h"
    3333#include "Executor.h"
     34#include "XMLPort.h"
    3435
    35 #define ORXONOX_SET_EVENT(classname, eventname, functionname, event) \
    36     ORXONOX_SET_EVENT_GENERIC(eventcontainer##classname##functionname, classname, eventname, functionname, event, BaseObject)
     36/**
     37    @brief Defines a new event state (a state of the object which can be changed by events).
     38   
     39    @param classname    The name of this class
     40    @param subclassname Usually BaseObject - if different, only instances of this class can send events to this object
     41    @param statename    The name (string) of this state
     42    @param function     The function which should be used to set the state
     43    @param xmlelement   Argument for XMLPort
     44    @param mode         Argument for XMLPort
     45*/
     46#define XMLPortEventState(classname, subclassname, statename, function, xmlelement, mode) \
     47    orxonox::EventState* containername##function = this->getEventState(statename); \
     48    if (!containername##function) \
     49    { \
     50        containername##function = new orxonox::EventState(orxonox::createFunctor(&classname::function, this), orxonox::ClassIdentifier<subclassname>::getIdentifier()); \
     51        this->addEventState(statename, containername##function); \
     52    } \
     53    XMLPortEventStateIntern(xmlportevent##function, classname, statename, xmlelement, mode)
    3754
    38 #define ORXONOX_SET_EVENT_TEMPLATE(classname, eventname, functionname, event, ...) \
    39     ORXONOX_SET_EVENT_GENERIC_TEMPLATE(eventcontainer##classname##functionname, classname, eventname, functionname, event, BaseObject, __VA_ARGS__)
     55/**
     56    @brief Like XMLPortEventState but with additional template arguments to identify the function of the state (if ambiguous).
     57*/
     58#define XMLPortEventStateTemplate(classname, subclassname, statename, function, xmlelement, mode, ...) \
     59    orxonox::EventState* containername##function = this->getEventState(statename); \
     60    if (!containername##function) \
     61    { \
     62        containername##function = new orxonox::EventState(orxonox::createFunctor<classname, __VA_ARGS__ >(&classname::function, this), orxonox::ClassIdentifier<subclassname>::getIdentifier()); \
     63        this->addEventState(statename, containername##function); \
     64    } \
     65    XMLPortEventStateIntern(xmlportevent##function, classname, statename, xmlelement, mode)
    4066
    41 #define ORXONOX_SET_SUBCLASS_EVENT(classname, eventname, functionname, event, subclassname) \
    42     ORXONOX_SET_EVENT_GENERIC(eventcontainer##classname##functionname, classname, eventname, functionname, event, subclassname)
     67#define XMLPortEventStateIntern(name, classname, statename, xmlelement, mode) \
     68    static orxonox::ExecutorMember<classname>* xmlsetfunctor##name = (orxonox::ExecutorMember<classname>*)&orxonox::createExecutor(orxonox::createFunctor(&classname::addEventSource), std::string( #classname ) + "::" + "addEventSource" + "(" + statename + ")")->setDefaultValue(1, statename); \
     69    static orxonox::ExecutorMember<classname>* xmlgetfunctor##name = (orxonox::ExecutorMember<classname>*)&orxonox::createExecutor(orxonox::createFunctor(&classname::getEventSource), std::string( #classname ) + "::" + "getEventSource" + "(" + statename + ")")->setDefaultValue(1, statename); \
     70    XMLPortObjectGeneric(xmlport##name, classname, orxonox::BaseObject, statename, xmlsetfunctor##name, xmlgetfunctor##name, xmlelement, mode, false, true)
     71   
    4372
    44 #define ORXONOX_SET_SUBCLASS_EVENT_TEMPLATE(classname, eventname, functionname, event, subclassname, ...) \
    45     ORXONOX_SET_EVENT_GENERIC_TEMPLATE(eventcontainer##classname##functionname, classname, eventname, functionname, event, subclassname, __VA_ARGS__)
     73/**
     74    @brief Defines a new event name for a class. Named events can only have names which were defined with this macro.
     75   
     76    @param classname The name of the class
     77    @param name      The name of the event
     78*/
     79#define CreateEventName(classname, name) \
     80    static std::string eventname##classname##name = #name
    4681
    47 #define ORXONOX_SET_EVENT_GENERIC(containername, classname, eventname, functionname, event, subclassname) \
    48     orxonox::EventContainer* containername = this->getEventContainer(eventname); \
    49     if (!containername) \
    50     { \
    51         ExecutorMember<classname>* executor = orxonox::createExecutor(orxonox::createFunctor(&classname::functionname), std::string( #classname ) + "::" + #functionname); \
    52         executor->setObject(this); \
    53         containername = new orxonox::EventContainer(std::string(eventname), executor, orxonox::ClassIdentifier<subclassname>::getIdentifier()); \
    54         this->addEventContainer(eventname, containername); \
    55     } \
    56     event.castedOriginator_ = orxonox::orxonox_cast<subclassname*>(event.originator_); \
    57     containername->process(this, event)
    58 
    59 #define ORXONOX_SET_EVENT_GENERIC_TEMPLATE(containername, classname, eventname, functionname, event, subclassname, ...) \
    60     orxonox::EventContainer* containername = this->getEventContainer(eventname); \
    61     if (!containername) \
    62     { \
    63         ExecutorMember<classname>* executor = orxonox::createExecutor(orxonox::createFunctor<classname, __VA_ARGS__ >(&classname::functionname), std::string( #classname ) + "::" + #functionname); \
    64         executor->setObject(this); \
    65         containername = new orxonox::EventContainer(std::string(eventname), executor, orxonox::ClassIdentifier<subclassname>::getIdentifier()); \
    66         this->addEventContainer(eventname, containername); \
    67     } \
    68     event.castedOriginator_ = orxonox::orxonox_cast<subclassname*>(event.originator_); \
    69     containername->process(this, event)
    70 
     82/**
     83    @brief This macro is needed to fire an event with this name. The event name must previously be declared with @ref CreateEventName.
     84*/   
     85#define FireEventName(classname, name) \
     86    eventname##classname##name
     87 
    7188#endif /* _EventIncludes_H__ */
Note: See TracChangeset for help on using the changeset viewer.