Dillo
Classes | Public Member Functions | Protected Member Functions | Private Attributes | Static Private Attributes | List of all members
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>

Classes

class  Class
 

Public Member Functions

 IdentifiableObject ()
 
void intoStringBuffer (misc::StringBuffer *sb)
 Store a textual representation of the object in a misc::StringBuffer. More...
 
int getClassId ()
 Returns the class identifier. More...
 
const char * getClassName ()
 Return the name, under which the class of this object was registered. More...
 
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. More...
 
- Public Member Functions inherited from lout::object::Object
virtual ~Object ()
 The destructor is defined as virtual (but not abstract), so that destruction of Object's works properly. More...
 
virtual bool equals (Object *other)
 Returns, whether two objects are equal. More...
 
virtual int hashValue ()
 Return a hash value for the object. More...
 
virtual Objectclone ()
 Return an exact copy of the object. More...
 
const char * toString ()
 Use object::Object::intoStringBuffer to return a textual representation of the object. More...
 
virtual size_t sizeOf ()
 Return the number of bytes, this object totally uses. More...
 

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. More...
 

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, class::CLASS_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:

dot_inline_dotgraph_21.png
[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
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 lout::identity::IdentifiableObject::Class::parent.

Referenced by dw::Textblock::addWidget(), dw::oof::OOFPosRelMgr::calcWidgetRefSize(), dw::Table::getCellRef(), and dw::oof::OOFAwareWidget::isOOFContainer().

void lout::identity::IdentifiableObject::intoStringBuffer ( misc::StringBuffer sb)
virtual
void lout::identity::IdentifiableObject::registerName ( const char *  className,
int *  classId 
)
protected

Member Data Documentation

Vector< IdentifiableObject::Class > * lout::identity::IdentifiableObject::classesById
staticprivate
Initial value:
=
new Vector <IdentifiableObject::Class> (16, false)
HashTable< ConstString, IdentifiableObject::Class > * lout::identity::IdentifiableObject::classesByName
staticprivate
Initial value:
=
new HashTable<ConstString, IdentifiableObject::Class> (true, true)
int lout::identity::IdentifiableObject::classId
private

Referenced by getClassId().

IdentifiableObject::Class * lout::identity::IdentifiableObject::currentlyConstructedClass
staticprivate

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