lout::identity::IdentifiableObject Class Reference

Instances of classes, which are sub classes of this class, may be identified at run-time. More...

#include <identity.hh>

List of all members.

Classes

class  Class

Public Member Functions

 IdentifiableObject ()
virtual void intoStringBuffer (misc::StringBuffer *sb)
 Store a textual representation of the object in a misc::StringBuffer.
int getClassId ()
 Returns the class identifier.
const char * getClassName ()
 Return the name, under which the class of this object was registered.
bool instanceOf (int otherClassId)
 Returns, whether this class is an instance of the class, given by otherClassId, or of a sub class of this class.

Protected Member Functions

void registerName (const char *className, int *classId)
 This method must be called in the constructor for the sub class. See class comment for details.

Private Attributes

int classId

Static Private Attributes

static
container::typed::HashTable
< object::ConstString, Class > * 
classesByName
static
container::typed::Vector
< Class > * 
classesById
static ClasscurrentlyConstructedClass


Detailed Description

Instances of classes, which are sub classes of this class, may be identified at run-time.

Testing the class

Since e.g. dw::Textblock is a sub class of IdentifiableObject, and implemented in the correct way (as described below), for any given IdentifiableObject the following test can be done:

 identity::IdentifiableObject *o;
 // ...
 bool isATextblock = o->instanceOf(dw::Textblock::CLASS_ID);

isATextblock is true, when o is an instance of dw::Textblock, or of a sub class of dw::Textblock. Otherwise, isATextblock is false.

It is also possible to get the class identifier of an identity::IdentifiableObject, e.g.

 bool isOnlyATextblock = o->getClassId() == dw::Textblock::CLASS_ID;

would result in true, if o is an instance of dw::Textblock, but not an instance of a sub class of dw::Textblock.

Defining Sub Classes

Each direct or indirect sub class of IdentifiableObject must

After this, classCLASS_ID refers to a number, which denotes the class. (If this is still -1, since the class has not yet been instantiated, any test will fail, which is correct.)

Notes on implementation

If there are some classes like this:

inline_dotgraph_21.dot

[legend]

and first, an instance of A, and then an instance of C is created, there will be the following calls of functions and constructors:

  1. IdentifiableObject ();
  2. registerName ("A", &A::CLASS_ID);
  3. IdentifiableObject ();
  4. registerName ("B", &B::CLASS_ID);
  5. registerName ("C", &C::CLASS_ID);

From this, the class hierarchy above can easily constructed, and stored in identity::IdentifiableObject::classesByName and in identity::IdentifiableObject::classesById. See the code for details.

N.b. Multiple inheritance is not supported, the construction of the tree would become confused.


Constructor & Destructor Documentation

lout::identity::IdentifiableObject::IdentifiableObject (  ) 


Member Function Documentation

int lout::identity::IdentifiableObject::getClassId (  )  [inline]

Returns the class identifier.

This is rarely used, rather, tests with identity::IdentifiableObject::instanceOf are done.

References classId.

const char* lout::identity::IdentifiableObject::getClassName (  )  [inline]

Return the name, under which the class of this object was registered.

References classesById, classId, lout::identity::IdentifiableObject::Class::className, and lout::container::typed::Vector< T >::get().

Referenced by intoStringBuffer().

bool lout::identity::IdentifiableObject::instanceOf ( int  otherClassId  ) 

Returns, whether this class is an instance of the class, given by otherClassId, or of a sub class of this class.

References classesById, classId, lout::container::typed::Vector< T >::get(), and lout::identity::IdentifiableObject::Class::parent.

Referenced by dw::Table::getCellRef().

void lout::identity::IdentifiableObject::intoStringBuffer ( misc::StringBuffer sb  )  [virtual]

Store a textual representation of the object in a misc::StringBuffer.

This is used by object::Object::toString.

Reimplemented from lout::object::Object.

References lout::misc::StringBuffer::append(), and getClassName().

void lout::identity::IdentifiableObject::registerName ( const char *  className,
int *  classId 
) [protected]


Member Data Documentation

Initial value:

   new Vector <IdentifiableObject::Class> (16, false)

Referenced by getClassName(), instanceOf(), and registerName().

Initial value:

      new HashTable<ConstString, IdentifiableObject::Class> (true, true)

Referenced by registerName().

Referenced by IdentifiableObject(), and registerName().


The documentation for this class was generated from the following files:

Generated on Wed Sep 7 02:00:38 2011 for Dillo by  doxygen 1.5.9