PIP 5.5.3
Platform-Independent Primitives
Classes | Public Member Functions | Static Public Member Functions | Protected Member Functions | Related Functions | List of all members
PIObject Class Reference

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

#include <piobject.h>

Inheritance diagram for PIObject:
Inheritance graph
[legend]

Classes

class  Connection
 Helper class for obtain info about if connection successful and disconnect single connection. More...
 

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.
 
virtual const char * parentClassName () const
 Returns parent class name.
 
bool debug () const
 Return if piCoutObj of this object is active.
 
void setName (const PIString &name)
 Set object name.
 
void setDebug (bool debug)
 Set object piCoutObj active.
 
PIVariant property (const char *name) const
 Returns property with name "name".
 
void setProperty (const char *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 char *name) const
 Returns if property with name "name" exists.
 
PIStringList scopeList () const
 Returns subclass scope of this object (including this class name)
 
void piDisconnect (const PIString &sig, PIObject *dest, void *ev_h)
 Disconnect object from all connections with event name "sig", connected to destination object "dest" and handler "ev_h".
 
void piDisconnect (const PIString &sig, PIObject *dest)
 Disconnect object from all connections with event name "sig", connected to destination object "dest".
 
void piDisconnect (const PIString &sig)
 Disconnect object from all connections with event name "sig".
 
bool isPIObject () const
 Returns if this is valid PIObject (check signature)
 
template<typename T >
bool isTypeOf () const
 Returns if this is valid PIObject subclass "T" (check signature and classname)
 
template<typename T >
T * cast () const
 Returns cast to T if this is valid subclass "T" (check by isTypeOf()) or "nullptr".
 
void callQueuedEvents ()
 Execute all posted events from CONNECTU_QUEUED connections.
 
bool maybeCallQueuedEvents ()
 Check if any CONNECTU_QUEUED connections to this object and execute them. More...
 
void deleteLater ()
 Mark object to delete. More...
 

Static Public Member Functions

static void piDisconnect (PIObject *src, const PIString &sig, PIObject *dest, void *ev_h)
 Disconnect object "src" from all connections with event name "sig", connected to destination object "dest" and handler "ev_h".
 
static void piDisconnect (PIObject *src, const PIString &sig, PIObject *dest)
 Disconnect object "src" from all connections with event name "sig", connected to destination object "dest".
 
static void piDisconnect (PIObject *src, const PIString &sig)
 Disconnect object "src" from all connections with event name "sig".
 
static PIObjectfindByName (const PIString &name)
 Returns PIObject* with name "name" or 0, if there is no object found.
 
static bool isPIObject (const PIObject *o)
 Returns if "o" is valid PIObject (check signature)
 
template<typename T >
static bool isTypeOf (const PIObject *o)
 Returns if "o" is valid PIObject subclass "T" (check signature and classname)
 

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 char *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 && PIObject::debug()) output to PICout(StdOut) for subclasses of PIObject.
 
#define piCerrObj
 Macro used for conditional (piDebug && PIObject::debug()) output to PICout(StdErr) 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 PIOBJECT_SUBCLASS(name, parent)
 You should use this macro after class declaration to use EVENT and EVENT_HANDLER of parent class, and scopeList()
 
#define EVENT_HANDLER0(ret, name)   ret name()
 Declare event handler with name "name" and return type "ret", ret name()
 
#define EVENT_HANDLER1(ret, name, type0, var0)   ret name(type0 var0)
 Declare event handler 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 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 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 with name "name" and return type "ret", ret name(type0 var0, type1 var1, type2 var2, type3 var3)
 
#define EVENT_HANDLER   EVENT_HANDLER0
 Synonym of EVENT_HANDLER0.
 
#define EVENT_VHANDLER0(ret, name)   virtual ret name()
 Declare virtual event handler 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 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 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 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 with name "name" and return type "ret", virtual ret name(type0 var0, type1 var1, type2 var2, type3 var3)
 
#define EVENT_VHANDLER   EVENT_VHANDLER0
 Synonym of EVENT_VHANDLER0.
 
#define EVENT0(name)   void name();
 Declare event with name "name", void name();.
 
#define EVENT1(name, type0, var0)   void name(type0 var0);
 Declare event with name "name", void name(type0 var0);.
 
#define EVENT2(name, type0, var0, type1, var1)   void name(type0 var0, type1 var1);
 Declare 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 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 with name "name", void name(type0 var0, type1 var1, type2 var2, type3 var3);.
 
#define EVENT   EVENT0
 Synonym of EVENT0.
 
#define CONNECTU(src, event, dest, handler)
 Connect event "event" from object "src" to event handler or event "handler" of object "dest". More...
 
#define CONNECTU_QUEUED(src, event, dest, handler, performer)
 Connect event "event" from object "src" to event handler or event "handler" of object "dest". More...
 
#define CONNECTL(src, event, functor)
 Connect event "event" from object "src" to lambda-expression "functor". More...
 
#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. More...
 
#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. More...
 
#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. More...
 
#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. More...
 
#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. More...
 
#define CONNECT   CONNECT0
 Synonym of CONNECT0. More...
 
#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. More...
 
#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. More...
 
#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. More...
 
#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. More...
 
#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. More...
 
#define WEAK_CONNECT   WEAK_CONNECT0
 Synonym of WEAK_CONNECT0. More...
 
#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
 Synonym of DISCONNECT0.
 
#define HANDLER(handler)
 Returns pointer to events handler "handler".
 

Events

void deleted (PIObject *o)
 Raise before object delete. More...
 

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 as common method. Event is a function but declared with special macro EVENT() and don`t need definition. To raise event simply execute event function.

Event handler is a function but declared with special macro EVENT_HANDLER(). It need definition as common method. 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(), CONNECTU() and CONNECTL() 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.

Example:

class ObjectA: public PIObject {
PIOBJECT(ObjectA)
public:
EVENT_HANDLER1(void, handlerA, const PIString & , str) {piCoutObj << "handler A:" << str;}
EVENT1(eventA1, const PIString & , str);
EVENT2(eventA2, int, i, float, f);
};
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");
CONNECTU(&obj_a, eventA1, &obj_b, eventB);
obj_a.eventA1("event to event");
obj_a.piDisconnect("eventA1");
CONNECTL(&obj_a, eventA1, ([](const PIString & str){piCout << str;}));
obj_a.eventA1("event to lambda");
};
This is base class for any classes which use events -> handlers mechanism.
Definition: piobject.h:41
#define CONNECT1(ret, type0, src, event, dest, handler)
Connect event "event" from object "src" to event handler "handler" with return type "ret" from object...
Definition: piobject_macros.h:244
#define EVENT_HANDLER1(ret, name, type0, var0)
Declare event handler with name "name" and return type "ret", ret name(type0 var0)
Definition: piobject_macros.h:57
#define EVENT1(name, type0, var0)
Declare event with name "name", void name(type0 var0);.
Definition: piobject_macros.h:138
#define piCoutObj
Macro used for conditional (piDebug && PIObject::debug()) output to PICout(StdOut) for subclasses of ...
Definition: picout.h:44
#define CONNECTL(src, event, functor)
Connect event "event" from object "src" to lambda-expression "functor".
Definition: piobject_macros.h:218
#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...
Definition: piobject_macros.h:257
#define EVENT2(name, type0, var0, type1, var1)
Declare event with name "name", void name(type0 var0, type1 var1);.
Definition: piobject_macros.h:144
#define EVENT_HANDLER2(ret, name, type0, var0, type1, var1)
Declare event handler with name "name" and return type "ret", ret name(type0 var0,...
Definition: piobject_macros.h:63
#define CONNECTU(src, event, dest, handler)
Connect event "event" from object "src" to event handler or event "handler" of object "dest".
Definition: piobject_macros.h:184
#define PIOBJECT(name)
You should use this macro after class declaration to use EVENT and EVENT_HANDLER and correct piCoutOb...
Definition: piobject_macros.h:38
String class.
Definition: pistring.h:42
#define piCout
Macro used for conditional (piDebug) output to PICout(StdOut)
Definition: picout.h:35

Result:

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

Member Function Documentation

◆ maybeCallQueuedEvents()

bool PIObject::maybeCallQueuedEvents ( )
inline

Check if any CONNECTU_QUEUED connections to this object and execute them.

This function is more optimized than callQueuedEvents() for objects that doesn`t appears as "performer" target at CONNECTU_QUEUED

◆ deleteLater()

void PIObject::deleteLater ( )

Mark object to delete.

On first call background thread started to delete objects. Each object deletes when it`s outside from any events and hadlers.

◆ deleted()

void PIObject::deleted ( PIObject o)

Raise before object delete.

Warning

This event raised from destructor, so use only "o" numeric value, don`t try to cast deleted object to some subclass!

Friends And Related Function Documentation

◆ CONNECTU

#define CONNECTU (   src,
  event,
  dest,
  handler 
)
related

Connect event "event" from object "src" to event handler or event "handler" of object "dest".

"handler" can handle subset arguments of "event". Returns PIObject::Connection

◆ CONNECTU_QUEUED

#define CONNECTU_QUEUED (   src,
  event,
  dest,
  handler,
  performer 
)
related

Connect event "event" from object "src" to event handler or event "handler" of object "dest".

"handler" can handle subset arguments of "event". Event handler will be executed by "performer" when PIObject::callQueuedEvents() called. All argument types should be registered by REGISTER_VARIANT() macro, but many common and PIP types already done. Returns PIObject::Connection

◆ CONNECTL

#define CONNECTL (   src,
  event,
  functor 
)
related

Connect event "event" from object "src" to lambda-expression "functor".

"event" and "functor" must has equal argument lists. You should parentness "functor" with () if this is complex lambda. Returns PIObject::Connection

◆ CONNECT0

#define CONNECT0 (   ret,
  src,
  event,
  dest,
  handler 
)
related

Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists.

Deprecated:
Use CONNECTU() instead

Returns PIObject::Connection

◆ CONNECT1

#define CONNECT1 (   ret,
  type0,
  src,
  event,
  dest,
  handler 
)
related

Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists.

Deprecated:
Use CONNECTU() instead

Returns PIObject::Connection

◆ CONNECT2

#define CONNECT2 (   ret,
  type0,
  type1,
  src,
  event,
  dest,
  handler 
)
related

Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists.

Deprecated:
Use CONNECTU() instead

Returns PIObject::Connection

◆ CONNECT3

#define CONNECT3 (   ret,
  type0,
  type1,
  type2,
  src,
  event,
  dest,
  handler 
)
related

Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists.

Deprecated:
Use CONNECTU() instead

Returns PIObject::Connection

◆ CONNECT4

#define CONNECT4 (   ret,
  type0,
  type1,
  type2,
  type3,
  src,
  event,
  dest,
  handler 
)
related

Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" with check of event and handler exists.

Deprecated:
Use CONNECTU() instead

Returns PIObject::Connection

◆ CONNECT

#define CONNECT   CONNECT0
related

Synonym of CONNECT0.

Deprecated:
Use CONNECTU() instead

◆ WEAK_CONNECT0

#define WEAK_CONNECT0 (   ret,
  src,
  event,
  dest,
  handler 
)
related

Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists.

Deprecated:
Use CONNECTU() instead

◆ WEAK_CONNECT1

#define WEAK_CONNECT1 (   ret,
  type0,
  src,
  event,
  dest,
  handler 
)
related

Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists.

Deprecated:
Use CONNECTU() instead

◆ WEAK_CONNECT2

#define WEAK_CONNECT2 (   ret,
  type0,
  type1,
  src,
  event,
  dest,
  handler 
)
related

Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists.

Deprecated:
Use CONNECTU() instead

◆ WEAK_CONNECT3

#define WEAK_CONNECT3 (   ret,
  type0,
  type1,
  type2,
  src,
  event,
  dest,
  handler 
)
related

Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists.

Deprecated:
Use CONNECTU() instead

◆ WEAK_CONNECT4

#define WEAK_CONNECT4 (   ret,
  type0,
  type1,
  type2,
  type3,
  src,
  event,
  dest,
  handler 
)
related

Connect event "event" from object "src" to event handler "handler" with return type "ret" from object "dest" without check of event exists.

Deprecated:
Use CONNECTU() instead

◆ WEAK_CONNECT

#define WEAK_CONNECT   WEAK_CONNECT0
related

Synonym of WEAK_CONNECT0.

Deprecated:
Use CONNECTU() instead