PIP  0.4.0_beta2
Platform-Independent Primitives
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
PIObject Class Reference

This is base class for any classes which use events -> handlers mechanism. More...

+ Inheritance diagram for PIObject:

Public Member Functions

 PIObject (const PIString &name=PIString())
 Contructs PIObject with name "name".
 
PIString name () const
 Returns object name.
 
virtual const char * className () const
 Returns object class name.
 
bool debug () const
 Return if debug of this object is active.
 
void setName (const PIString &name)
 Set object name.
 
void setDebug (bool debug)
 Set object debug active.
 
const PIMap< PIString,
PIVariant > & 
properties () const
 Returns properties of the object.
 
int propertiesCount () const
 Returns properties count of the object.
 
PIVariant property (const PIString &name) const
 Returns property with name "name".
 
void setProperty (const PIString &name, const PIVariant &value)
 Set property with name "name" to "value". If there is no such property in object it will be added.
 
bool isPropertyExists (const PIString &name) const
 Returns if property with name "name" exists.
 

Static Public Member Functions

static void piDisconnect (PIObject *src, const PIString &sig)
 Disconnect object "src" from all connections with event name "sig".
 
static void piDisconnect (PIObject *src)
 Disconnect object "src" from all connections, i.e. all connections where object "src" is emitter.
 
static PIObjectfindByName (const PIString &name)
 Returns PIObject* with name "name" or 0, if there is no object found.
 

Protected Member Functions

PIObjectemitter () const
 Returns PIObject* which has raised an event. This value is correct only in definition of some event handler.
 
virtual void propertyChanged (const PIString &name)
 Virtual function executes after property with name "name" has been changed.
 

Related Functions

(Note that these are not member functions.)

#define piCoutObj
 Macro used for conditional (piDebug and PIObject::debug()) output to PICout for subclasses of PIObject.
 
#define PIOBJECT(name)
 you should use this macro after class declaration to use EVENT and EVENT_HANDLER and correct piCoutObj output
 
#define EVENT_HANDLER0(ret, name)   ret name()
 declare event handler "event" with name "name" and return type "ret", ret name()
 
#define EVENT_HANDLER1(ret, name, type0, var0)   ret name(type0 var0)
 declare event handler "event" with name "name" and return type "ret", ret name(type0 var0)
 
#define EVENT_HANDLER2(ret, name, type0, var0, type1, var1)   ret name(type0 var0, type1 var1)
 declare event handler "event" with name "name" and return type "ret", ret name(type0 var0, type1 var1)
 
#define EVENT_HANDLER3(ret, name, type0, var0, type1, var1, type2, var2)   ret name(type0 var0, type1 var1, type2 var2)
 declare event handler "event" with name "name" and return type "ret", ret name(type0 var0, type1 var1, type2 var2)
 
#define EVENT_HANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3)   ret name(type0 var0, type1 var1, type2 var2, type3 var3)
 declare event handler "event" with name "name" and return type "ret", ret name(type0 var0, type1 var1, type2 var2, type3 var3)
 
#define EVENT_HANDLER   EVENT_HANDLER0
 EVENT_HANDLER is synonym of EVENT_HANDLER0.
 
#define EVENT_VHANDLER0(ret, name)   virtual ret name()
 declare virtual event handler "event" with name "name" and return type "ret", virtual ret name()
 
#define EVENT_VHANDLER1(ret, name, type0, var0)   virtual ret name(type0 var0)
 declare virtual event handler "event" with name "name" and return type "ret", virtual ret name(type0 var0)
 
#define EVENT_VHANDLER2(ret, name, type0, var0, type1, var1)   virtual ret name(type0 var0, type1 var1)
 declare virtual event handler "event" with name "name" and return type "ret", virtual ret name(type0 var0, type1 var1)
 
#define EVENT_VHANDLER3(ret, name, type0, var0, type1, var1, type2, var2)   virtual ret name(type0 var0, type1 var1, type2 var2)
 declare virtual event handler "event" with name "name" and return type "ret", virtual ret name(type0 var0, type1 var1, type2 var2)
 
#define EVENT_VHANDLER4(ret, name, type0, var0, type1, var1, type2, var2, type3, var3)   virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3)
 declare virtual event handler "event" with name "name" and return type "ret", virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3)
 
#define EVENT_VHANDLER   EVENT_VHANDLER0
 EVENT_VHANDLER is synonym of EVENT_VHANDLER0.
 
#define EVENT0(name)   void name();
 declare event "event" with name "name", void name();
 
#define EVENT1(name, type0, var0)   void name(type0 var0);
 declare event "event" with name "name", void name(type0 var0);
 
#define EVENT2(name, type0, var0, type1, var1)   void name(type0 var0, type1 var1);
 declare event "event" with name "name", void name(type0 var0, type1 var1);
 
#define EVENT3(name, type0, var0, type1, var1, type2, var2)   void name(type0 var0, type1 var1, type2 var2);
 declare event "event" with name "name", void name(type0 var0, type1 var1, type2 var2);
 
#define EVENT4(name, type0, var0, type1, var1, type2, var2, type3, var3)   void name(type0 var0, type1 var1, type2 var2, type3 var3);
 declare event "event" with name "name", void name(type0 var0, type1 var1, type2 var2, type3 var3);
 
#define EVENT   EVENT0
 EVENT is synonym of EVENT0.
 
#define CONNECT0(ret, src, event, dest, handler)
 connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists
 
#define CONNECT1(ret, type0, src, event, dest, handler)
 connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists
 
#define CONNECT2(ret, type0, type1, src, event, dest, handler)
 connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists
 
#define CONNECT3(ret, type0, type1, type2, src, event, dest, handler)
 connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists
 
#define CONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler)
 connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists
 
#define CONNECT   CONNECT0
 CONNECT is synonym of CONNECT0.
 
#define WEAK_CONNECT0(ret, src, event, dest, handler)
 connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists
 
#define WEAK_CONNECT1(ret, type0, src, event, dest, handler)
 connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists
 
#define WEAK_CONNECT2(ret, type0, type1, src, event, dest, handler)
 connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists
 
#define WEAK_CONNECT3(ret, type0, type1, type2, src, event, dest, handler)
 connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists
 
#define WEAK_CONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler)
 connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists
 
#define WEAK_CONNECT   WEAK_CONNECT0
 WEAK_CONNECT is synonym of WEAK_CONNECT0.
 
#define DISCONNECT0(ret, src, event, dest, handler)
 piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest"
 
#define DISCONNECT1(ret, type0, src, event, dest, handler)
 piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest"
 
#define DISCONNECT2(ret, type0, type1, src, event, dest, handler)
 piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest"
 
#define DISCONNECT3(ret, type0, type1, type2, src, event, dest, handler)
 piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest"
 
#define DISCONNECT4(ret, type0, type1, type2, type3, src, event, dest, handler)
 piDisconnect event "event" from object "src" from event handler "handler" with return type "ret" from object "dest"
 
#define DISCONNECT   DISCONNECT0
 DISCONNECT is synonym of DISCONNECT0.
 
#define HANDLER(handler)
 Returns pointer to events handler "handler".
 

Detailed Description

This is base class for any classes which use events -> handlers mechanism.

Events and Event handlers

PIObject provide notification mechanism similar Qt but implemented on language capabilities without any special preprocessors or compilers. Any class inherits PIObject should use macro PIOBJECT() immediate after declaration to proper compile.

Event is a some abstract event that can be raised at any time. Event is a function but declared with special macro EVENT(). To raise event simply execute event function.

Event handler is a function but declared with special macro EVENT_HANDLER(). You can use event handlers as ordinary functions.

Main goal of this mechanism is perform abstract connections between various objects. This functionality provide macro CONNECT() which connect some event of first object to some event handler or event of second object. Each event can be connected any times to any event handlers.

events_handlers.png

Example:

class ObjectA: public PIObject {
PIOBJECT(ObjectA)
public:
EVENT_HANDLER1(void, handlerA, const PIString & , str) {piCoutObj << "handler A:" << str;}
EVENT2(eventA2, int, i, float, f);
EVENT1(eventA1, const PIString & , str);
};
class ObjectB: public PIObject {
PIOBJECT(ObjectB)
public:
EVENT_HANDLER2(void, handlerB, int, i, float, f) {piCoutObj << "handler B:" << i << "," << f;}
EVENT1(eventB, PIString, str);
};
int main(int argc, char * argv[]) {
ObjectA obj_a;
ObjectB obj_b;
CONNECT2(void, int, float, &obj_a, eventA2, &obj_b, handlerB);
obj_a.eventA2(2, 0.5);
CONNECT1(void, PIString, &obj_b, eventB, &obj_a, handlerA);
obj_b.eventB("event to handler");
CONNECT1(void, PIString, &obj_a, eventA1, &obj_b, eventB);
obj_a.eventA1("event to event");
};

Result:

handler B: 2 , 0.5
handler A: event to handler
handler A: event to event