<p>The source has to be configured with <em>configure --enable-gcov</em>. <em>make coverage-html</em> creates the converage reports then.</p>
<p>The source has to be configured with <code>configure --enable-gcov</code>. <code>make coverage-html</code> creates the converage reports then.</p>
<h2id="usage">USAGE</h2>
<h2id="usage">USAGE</h2>
<h3id="api">API</h3>
<h3id="api">API</h3>
<p>The public API consists of several preprocessor macros and some functions. When you look through the code you will find other symbols (functions or macros) which might seem useful. Here I try to focus on the neccessaties for using the library.</p>
<h4id="function-like-macros---class-creation">function-like macros - class creation</h4>
<h4id="function-like-macros---class-creation">function-like macros - class creation</h4>
<ul>
<ul>
<li><strong>TR_CLASS(name):</strong> Declare a new class.</li>
<li><strong>TR_CREATE_CLASS(name, parent, ...):</strong> Create a new class.</li>
<li><strong>TR_EXTENDS(parent):</strong> Extend another class</li>
<li><code>TR_CLASS(name)</code>: Declare a new class.</li>
<li><code>TR_CREATE_CLASS(name, parent, ...)</code>: Create a new class.</li>
<li><code>TR_EXTENDS(parent)</code>: Extend another class</li>
</ul>
</ul>
<h4id="function-like-macros---class-information">function-like macros - class information</h4>
<h4id="function-like-macros---class-information">function-like macros - class information</h4>
<ul>
<ul>
<li><strong>TR_GET_CLASS(object):</strong> Get the class of the given object.</li>
<li><strong>TR_HAS_PARENT(class):</strong> Check if the class extends another class.</li>
<li><strong>TR_IS_OBJECT(obj):</strong> Check that the given pointer is really an instance of a class.</li>
<li><strong>TR_INSTANCE_OF(class, obj):</strong> Check that the given obj is an instance of class.</li>
<li><code>TR_GET_CLASS(object)</code>: Get the class of the given object.</li>
<li><code>TR_HAS_PARENT(class)</code>: Check if the class extends another class.</li>
<li><code>TR_IS_OBJECT(obj)</code>: Check that the given pointer is really an instance of a class.</li>
<li><code>TR_INSTANCE_OF(class, obj)</code>: Check that the given obj is an instance of class.</li>
<li><code>TR_INTERFACE(name)</code>: Declare a new inerface.</li>
<li><code>TR_CREATE_INTERFACE(name, nfunc)</code>: Create the new interface.</li>
<li><code>TR_INIT_IFACE(name, ...)</code>: Create an interface implementation and assign functions to it.</li>
<li><code>TR_IF(name)</code>: Convenience for getting an interface implementation by name. Used when assigning an interface to a class.</li>
</ul>
<h4id="function-like-macros-for-the-class-interface">function-like macros for the class interface</h4>
<p>The valious constructor and destructors are also assigned to an interface. The is the only interface every class MUST have so that instances can be created and destroyed. At least a constructor and a destructor must be assigned to this interface. The following selectors then utilize the interface to create and destroy instances.</p>
<ul>
<li><code>TR_new(class, ...)</code>: Create a new instance of a class with a variable argument list for the constructor interface.</li>
<li><code>TR_newv(class, args)</code>: Same as <em>TR_new</em> but accepts a va_list* for the constructor arguments.</li>
<li><code>TR_delete(object)</code>: Destroy an instance.</li>
<li><code>TR_clone(object)</code>: Call an constructor that accepts another instance to create a clone from this instance.</li>
<p>These are in fact two interfaces that can be used to implement the subject/observer design pattern.</p>
<ul>
<li><code>TR_subjectAttach(Subject, Observer)</code>: Add an observer to a subject. The concrete implementation has to take care of memory management etc.</li>
<li><code>TR_subjectDetach(Subject, Observer)</code>: Remove an observer from a subject.</li>
<li>`TR_notify(Subject):* Notify all registered observer of an event.</li>
<li><code>TR_observerUpdate(Observer, Subject)</code>: This must be called in TR_subjectNotify to inform a registered observer of an event.</li>
<li><code>TR_serializedSize(Serializable)</code>: Get the size of the serialized instance.</li>
<li><code>TR_serialize(Serializable, unsigned char * serialized)</code>: Serialize the instance into the serialized buffer. The buffer has to be large enough to hold the serialized instance.</li>
<li><code>TR_unserialize(Serializable, const unsigned char * serialized, size_t ssize)</code>: Initialize the instance with the serialized data stored in serialized.</li>