CrystalSpace

Public API Reference

csutil/scf.h

Go to the documentation of this file.
00001 /*
00002     Crystal Space Shared Class Facility (SCF)
00003     Copyright (C) 1999 by Andrew Zabolotny
00004               (C) 2005 by Marten Svanfeldt
00005               (C) 2005 by Michael Adams
00006 
00007     This library is free software; you can redistribute it and/or
00008     modify it under the terms of the GNU Library General Public
00009     License as published by the Free Software Foundation; either
00010     version 2 of the License, or (at your option) any later version.
00011 
00012     This library is distributed in the hope that it will be useful,
00013     but WITHOUT ANY WARRANTY; without even the implied warranty of
00014     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00015     Library General Public License for more details.
00016 
00017     You should have received a copy of the GNU Library General Public
00018     License along with this library; if not, write to the Free
00019     Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00020 */
00021 
00022 #ifndef __CSSCF_H__
00023 #define __CSSCF_H__
00024 
00025 #include "csextern.h"
00026 
00027 #include "csutil/array.h"
00028 #include "csutil/ref.h"
00029 
00038 class csPathsList;
00039 
00040 #ifndef CS_TYPENAME
00041   #ifdef CS_REF_TRACKER
00042    #include <typeinfo>
00043    #define CS_TYPENAME(x)                   typeid(x).name()
00044   #else
00045    #define CS_TYPENAME(x)                   0
00046   #endif
00047 #endif
00048 
00049 // INTERFACE DEFINITIONS
00050 #include "csutil/scf_interface.h"
00051 // NEW STYLE IMPLEMENTATION
00052 //#include "csutil/scf_implementation.h"
00053 
00054 
00055 //-- Helper macros
00056 
00061 #ifdef SCF_DEBUG
00062 #  define SCF_TRACE(x)                                                  \
00063    {                                                                    \
00064      printf ("SCF [%s:%d]:\n", __FILE__, (int)__LINE__);                \
00065      printf x; SCF_PRINT_CALL_ADDRESS                                   \
00066    }
00067 #else
00068 #  define SCF_TRACE(x)
00069 #endif
00070 
00075 #if (__GNUC__ >= 3) || ((__GNUC__ >= 2) && (__GNUC_MINOR__ >= 8))
00076 #  define SCF_PRINT_CALL_ADDRESS                                        \
00077    printf ("  Called from address %p\n", __builtin_return_address (0));
00078 #else
00079 #  define SCF_PRINT_CALL_ADDRESS
00080 #endif
00081 
00082 
00083 #ifdef CS_REF_TRACKER
00084  /* @@@ HACK: Force an AddAlias() call for every contained interface
00085   * However, when iSCF::SCF == 0, don't call QI to prevent interface ID 
00086   * resolution (which will fail).
00087   */
00088  #define SCF_INIT_TRACKER_ALIASES    \
00089   if (iSCF::SCF != 0) QueryInterface ((scfInterfaceID)-1, -1);
00090 #else
00091  #define SCF_INIT_TRACKER_ALIASES
00092 #endif
00093 
00094 //-- Old style implementation
00099 #define SCF_DECLARE_IBASE                                               \
00100   int scfRefCount;              /* Reference counter */                 \
00101   csArray<void**>* scfWeakRefOwners;                                    \
00102   void scfRemoveRefOwners ();                                           \
00103   SCF_DECLARE_EMBEDDED_IBASE (iBase)
00104 
00109 #define SCF_DECLARE_EMBEDDED_IBASE(OuterClass)                          \
00110 public:                                                                 \
00111   OuterClass *scfParent;        /* The parent object */                 \
00112   virtual void IncRef ();                                               \
00113   virtual void DecRef ();                                               \
00114   virtual int GetRefCount ();                                           \
00115   virtual void AddRefOwner (void** ref_owner);                          \
00116   virtual void RemoveRefOwner (void** ref_owner);                       \
00117   virtual void *QueryInterface (scfInterfaceID iInterfaceID, int iVersion)
00118 
00128 #define SCF_CONSTRUCT_IBASE(Parent)                                     \
00129   csRefTrackerAccess::TrackConstruction (this);                         \
00130   csRefTrackerAccess::SetDescription (this, CS_TYPENAME(*this));        \
00131   scfRefCount = 1;                                                      \
00132   scfWeakRefOwners = 0;                                                 \
00133   scfParent = Parent; if (scfParent) scfParent->IncRef();               \
00134   SCF_INIT_TRACKER_ALIASES                                              
00135 
00145 #define SCF_CONSTRUCT_EMBEDDED_IBASE(Interface)                         \
00146   Interface.scfParent = this;                                           \
00147   csRefTrackerAccess::AddAlias (&Interface, this);
00148 
00154 #define SCF_DESTRUCT_IBASE()                                            \
00155   csRefTrackerAccess::TrackDestruction (this, scfRefCount);             \
00156   scfRemoveRefOwners ();
00157 
00164 #define SCF_DESTRUCT_EMBEDDED_IBASE(Interface)                          \
00165   csRefTrackerAccess::RemoveAlias (&Interface, this);                   \
00166   Interface.scfParent = 0;
00167 
00173 #define SCF_IMPLEMENT_IBASE_INCREF(Class)                               \
00174 void Class::IncRef ()                                                   \
00175 {                                                                       \
00176   SCF_TRACE (("  (%s *)%p->IncRef (%d)\n", #Class, this, scfRefCount + 1));\
00177   csRefTrackerAccess::TrackIncRef (this, scfRefCount);                  \
00178   scfRefCount++;                                                        \
00179 }
00180 
00189 #define SCF_IMPLEMENT_IBASE_DECREF(Class)                               \
00190 void Class::DecRef ()                                                   \
00191 {                                                                       \
00192   csRefTrackerAccess::TrackDecRef (this, scfRefCount);                  \
00193   if (scfRefCount == 1)                                                 \
00194   {                                                                     \
00195     SCF_TRACE ((" delete (%s *)%p\n", #Class, this));                   \
00196     scfRemoveRefOwners ();                                              \
00197     if (scfParent)                                                      \
00198       scfParent->DecRef ();                                             \
00199     delete this;                                                        \
00200     return;                                                             \
00201   }                                                                     \
00202   scfRefCount--;                                                        \
00203 }
00204 
00211 #define SCF_IMPLEMENT_IBASE_REMOVE_REF_OWNERS(Class)                    \
00212 void Class::scfRemoveRefOwners ()                                       \
00213 {                                                                       \
00214   if (!scfWeakRefOwners) return;                                        \
00215   for (size_t i = 0 ; i < scfWeakRefOwners->Length () ; i++)            \
00216   {                                                                     \
00217     void** p = (*scfWeakRefOwners)[i];                                  \
00218     *p = 0;                                                             \
00219   }                                                                     \
00220   delete scfWeakRefOwners;                                              \
00221   scfWeakRefOwners = 0;                                                 \
00222 }
00223 
00228 #define SCF_IMPLEMENT_IBASE_REFOWNER(Class)                             \
00229 void Class::AddRefOwner (void** ref_owner)                              \
00230 {                                                                       \
00231   if (!scfWeakRefOwners)                                                \
00232     scfWeakRefOwners = new csArray<void**> (0, 4);                      \
00233   scfWeakRefOwners->InsertSorted (ref_owner);                           \
00234 }                                                                       \
00235 void Class::RemoveRefOwner (void** ref_owner)                           \
00236 {                                                                       \
00237   if (!scfWeakRefOwners)                                                \
00238     return;                                                             \
00239   size_t index = scfWeakRefOwners->FindSortedKey (                      \
00240     csArrayCmp<void**, void**> (ref_owner));                            \
00241   if (index != csArrayItemNotFound) scfWeakRefOwners->DeleteIndex (     \
00242     index);                                                             \
00243 }
00244 
00249 #define SCF_IMPLEMENT_IBASE_GETREFCOUNT(Class)                          \
00250 int Class::GetRefCount ()                                               \
00251 {                                                                       \
00252   return scfRefCount;                                                   \
00253 }
00254 
00261 #define SCF_IMPLEMENT_IBASE_QUERY(Class)                                \
00262 void *Class::QueryInterface (scfInterfaceID iInterfaceID, int iVersion) \
00263 {                                                                       \
00264   SCF_TRACE (("  (%s *)%p->QueryInterface (%lu, %08X)\n",               \
00265     #Class, this, iInterfaceID, iVersion));
00266 
00273 #define SCF_IMPLEMENT_IBASE_QUERY_END                                   \
00274   return scfParent ?                                                    \
00275     scfParent->QueryInterface (iInterfaceID, iVersion) : 0;             \
00276 }
00277 
00283 #define SCF_IMPLEMENT_IBASE(Class)                                      \
00284   SCF_IMPLEMENT_IBASE_INCREF(Class)                                     \
00285   SCF_IMPLEMENT_IBASE_DECREF(Class)                                     \
00286   SCF_IMPLEMENT_IBASE_GETREFCOUNT(Class)                                \
00287   SCF_IMPLEMENT_IBASE_REFOWNER(Class)                                   \
00288   SCF_IMPLEMENT_IBASE_REMOVE_REF_OWNERS(Class)                          \
00289   SCF_IMPLEMENT_IBASE_QUERY(Class)
00290 
00295 #define SCF_IMPLEMENT_IBASE_END                                         \
00296   SCF_IMPLEMENT_IBASE_QUERY_END
00297 
00304 #define SCF_IMPLEMENT_EMBEDDED_IBASE_INCREF(Class)                      \
00305 void Class::IncRef ()                                                   \
00306 {                                                                       \
00307   SCF_TRACE (("  (%s *)%p->IncRef (%d)\n", #Class, this,                \
00308     scfParent->GetRefCount () + 1));                                    \
00309   scfParent->IncRef ();                                                 \
00310 }
00311 
00318 #define SCF_IMPLEMENT_EMBEDDED_IBASE_DECREF(Class)                      \
00319 void Class::DecRef ()                                                   \
00320 {                                                                       \
00321   SCF_TRACE (("  (%s *)%p->DecRef (%d)\n", #Class, this,                \
00322               scfParent->GetRefCount ()-1));                            \
00323   scfParent->DecRef ();                                                 \
00324 }
00325 
00330 #define SCF_IMPLEMENT_EMBEDDED_IBASE_GETREFCOUNT(Class)                 \
00331 int Class::GetRefCount ()                                               \
00332 {                                                                       \
00333   return scfParent->GetRefCount ();                                     \
00334 }
00335 
00340 #define SCF_IMPLEMENT_EMBEDDED_IBASE_REFOWNER(Class)                    \
00341 void Class::AddRefOwner (void** ref_owner)                              \
00342 {                                                                       \
00343   scfParent->AddRefOwner (ref_owner);                                   \
00344 }                                                                       \
00345 void Class::RemoveRefOwner (void** ref_owner)                           \
00346 {                                                                       \
00347   scfParent->RemoveRefOwner (ref_owner);                                \
00348 }
00349 
00356 #define SCF_IMPLEMENT_EMBEDDED_IBASE_QUERY(Class)                       \
00357 void *Class::QueryInterface (scfInterfaceID iInterfaceID, int iVersion) \
00358 {                                                                       \
00359   SCF_TRACE (("  (%s *)%p->QueryInterface (%lu, %08X)\n",               \
00360     #Class, this, iInterfaceID, iVersion));
00361 
00368 #define SCF_IMPLEMENT_EMBEDDED_IBASE_QUERY_END                          \
00369   return scfParent->QueryInterface (iInterfaceID, iVersion);            \
00370 }
00371 
00378 #define SCF_IMPLEMENT_EMBEDDED_IBASE(Class)                             \
00379   SCF_IMPLEMENT_EMBEDDED_IBASE_INCREF(Class)                            \
00380   SCF_IMPLEMENT_EMBEDDED_IBASE_DECREF(Class)                            \
00381   SCF_IMPLEMENT_EMBEDDED_IBASE_GETREFCOUNT(Class)                       \
00382   SCF_IMPLEMENT_EMBEDDED_IBASE_REFOWNER(Class)                          \
00383   SCF_IMPLEMENT_EMBEDDED_IBASE_QUERY(Class)
00384 
00389 #define SCF_IMPLEMENT_EMBEDDED_IBASE_END                                \
00390   SCF_IMPLEMENT_EMBEDDED_IBASE_QUERY_END
00391 
00398 #define SCF_IMPLEMENTS_INTERFACE(Interface)                             \
00399   csRefTrackerAccess::AddAlias (static_cast<Interface*> (this), this);\
00400   SCF_IMPLEMENTS_INTERFACE_COMMON (Interface, this)
00401 
00406 #define SCF_IMPLEMENTS_EMBEDDED_INTERFACE(Interface)                    \
00407   SCF_IMPLEMENTS_INTERFACE_COMMON (Interface, (&scf##Interface))
00408 
00412 #define SCF_IMPLEMENTS_INTERFACE_COMMON(Interface,Object)               \
00413   if (iInterfaceID == scfInterfaceTraits<Interface>::GetID() &&         \
00414     scfCompatibleVersion (iVersion, scfInterfaceTraits<Interface>::GetVersion())) \
00415   {                                                                     \
00416     (Object)->IncRef ();                                                \
00417     return static_cast<Interface*> (Object);                            \
00418   }
00419 
00430 #define SCF_DECLARE_IBASE_EXT(ParentClass)                              \
00431   typedef ParentClass __scf_superclass;                                 \
00432   virtual void IncRef ();                                               \
00433   virtual void DecRef ();                                               \
00434   virtual int GetRefCount ();                                           \
00435   virtual void AddRefOwner (void** ref_owner);                          \
00436   virtual void RemoveRefOwner (void** ref_owner);                       \
00437   virtual void *QueryInterface (scfInterfaceID iInterfaceID, int iVersion)
00438 
00445 #define SCF_IMPLEMENT_IBASE_EXT_INCREF(Class)                           \
00446 void Class::IncRef ()                                                   \
00447 {                                                                       \
00448   __scf_superclass::IncRef ();                                          \
00449 }
00450 
00457 #define SCF_IMPLEMENT_IBASE_EXT_DECREF(Class)                           \
00458 void Class::DecRef ()                                                   \
00459 {                                                                       \
00460   __scf_superclass::DecRef ();                                          \
00461 }
00462 
00469 #define SCF_IMPLEMENT_IBASE_EXT_GETREFCOUNT(Class)                      \
00470 int Class::GetRefCount ()                                               \
00471 {                                                                       \
00472   return __scf_superclass::GetRefCount ();                              \
00473 }
00474 
00479 #define SCF_IMPLEMENT_IBASE_EXT_REFOWNER(Class)                 \
00480 void Class::AddRefOwner (void** ref_owner)                              \
00481 {                                                                       \
00482   __scf_superclass::AddRefOwner (ref_owner);                            \
00483 }                                                                       \
00484 void Class::RemoveRefOwner (void** ref_owner)                           \
00485 {                                                                       \
00486   __scf_superclass::RemoveRefOwner (ref_owner);                         \
00487 }
00488 
00495 #define SCF_IMPLEMENT_IBASE_EXT_QUERY(Class)                            \
00496 void *Class::QueryInterface (scfInterfaceID iInterfaceID, int iVersion) \
00497 {
00498 
00505 #define SCF_IMPLEMENT_IBASE_EXT_QUERY_END                               \
00506   return __scf_superclass::QueryInterface (iInterfaceID, iVersion);     \
00507 }
00508 
00513 #define SCF_IMPLEMENT_IBASE_EXT(Class)                                  \
00514   SCF_IMPLEMENT_IBASE_EXT_INCREF(Class)                                 \
00515   SCF_IMPLEMENT_IBASE_EXT_DECREF(Class)                                 \
00516   SCF_IMPLEMENT_IBASE_EXT_GETREFCOUNT(Class)                            \
00517   SCF_IMPLEMENT_IBASE_EXT_REFOWNER(Class)                               \
00518   SCF_IMPLEMENT_IBASE_EXT_QUERY(Class)
00519 
00524 #define SCF_IMPLEMENT_IBASE_EXT_END                                     \
00525   SCF_IMPLEMENT_IBASE_EXT_QUERY_END
00526 
00542 #ifdef CS_MEMORY_TRACKER
00543 #include "memdebug.h" // needed for mtiRegisterModule
00544 // This special version of SCF_IMPLEMENT_FACTORY_INIT will make sure that
00545 // the memory tracker for this plugin is implemented.
00546 #define SCF_IMPLEMENT_FACTORY_INIT(Class)                               \
00547 static inline void Class ## _scfUnitInitialize(iSCF* SCF)               \
00548 {                                                                       \
00549   iSCF::SCF = SCF;                                                      \
00550   mtiRegisterModule (#Class);                                           \
00551 }                                                                       \
00552 CS_EXPORTED_FUNCTION                                                    \
00553 void CS_EXPORTED_NAME(Class,_scfInitialize)(iSCF* SCF)                  \
00554 { Class ## _scfUnitInitialize(SCF); }
00555 #else
00556 #define SCF_IMPLEMENT_FACTORY_INIT(Class)                               \
00557 static inline void Class ## _scfUnitInitialize(iSCF* SCF)               \
00558 { iSCF::SCF = SCF; }                                                    \
00559 CS_EXPORTED_FUNCTION                                                    \
00560 void CS_EXPORTED_NAME(Class,_scfInitialize)(iSCF* SCF)                  \
00561 { Class ## _scfUnitInitialize(SCF); }
00562 #endif
00563 
00569 #define SCF_IMPLEMENT_FACTORY_FINIS(Class)                              \
00570 CS_EXPORTED_FUNCTION                                                    \
00571 void CS_EXPORTED_NAME(Class,_scfFinalize)()                             \
00572 {                                                                       \
00573 CS_STATIC_VARIABLE_CLEANUP                                              \
00574 }
00575 
00582 #define SCF_IMPLEMENT_FACTORY_CREATE(Class)                             \
00583 CS_EXPORTED_FUNCTION                                                    \
00584 iBase* CS_EXPORTED_NAME(Class,_Create)(iBase *iParent)                  \
00585 {                                                                       \
00586   iBase *ret = new Class (iParent);                                     \
00587   SCF_TRACE (("  %p = new %s ()\n", ret, #Class));                      \
00588   return ret;                                                           \
00589 }
00590 
00597 #define SCF_IMPLEMENT_FACTORY(Class)                                    \
00598   SCF_IMPLEMENT_FACTORY_INIT(Class)                                     \
00599   SCF_IMPLEMENT_FACTORY_FINIS(Class)                                    \
00600   SCF_IMPLEMENT_FACTORY_CREATE(Class)
00601 
00602 #define SCF_STATIC_CLASS_CONTEXT      "*static*"
00603 
00612 #define SCF_REGISTER_STATIC_CLASS(Class,Ident,Desc,Dep)                 \
00613   CS_EXPORTED_FUNCTION iBase* CS_EXPORTED_NAME(Class,_Create)(iBase*);  \
00614   class Class##_StaticInit__                                            \
00615   {                                                                     \
00616   public:                                                               \
00617     Class##_StaticInit__()                                              \
00618     {                                                                   \
00619       scfRegisterStaticClass(                                           \
00620         CS_EXPORTED_NAME(Class,_Create), Ident, Desc, Dep);             \
00621     }                                                                   \
00622   } Class##_static_init__;
00623 
00628 #define SCF_REGISTER_STATIC_LIBRARY(Module, MetaInfo)                   \
00629   class Module##_StaticInit                                             \
00630   {                                                                     \
00631   public:                                                               \
00632     Module##_StaticInit()                                               \
00633     {                                                                   \
00634       scfRegisterStaticClasses (MetaInfo);                              \
00635     }                                                                   \
00636   } Module##_static_init__;
00637 
00642 #define SCF_DEFINE_FACTORY_FUNC_REGISTRATION(Class)                     \
00643   CS_EXPORTED_FUNCTION iBase* CS_EXPORTED_NAME(Class,_Create)(iBase*);  \
00644   class Class##_StaticInit                                              \
00645   {                                                                     \
00646   public:                                                               \
00647     Class##_StaticInit()                                                \
00648     {                                                                   \
00649       scfRegisterStaticFactoryFunc (CS_EXPORTED_NAME(Class,_Create),    \
00650         #Class);                                                        \
00651     }                                                                   \
00652   };
00653 
00658 #define SCF_USE_STATIC_PLUGIN(Module)                                   \
00659   namespace csStaticPluginInit                                          \
00660   {                                                                     \
00661     class Module { public: Module(); };                                 \
00662     Module Module##_StaticInit;                                         \
00663   }
00664 
00673 #define SCF_REGISTER_FACTORY_FUNC(Class)                                \
00674   SCF_DEFINE_FACTORY_FUNC_REGISTRATION(Class)                           \
00675   Class##_StaticInit Class##_static_init__;
00676 
00677 //--------------------------------------------- Class factory interface -----//
00678 
00692 struct iFactory : public iBase
00693 {
00695   virtual iBase *CreateInstance () = 0;
00697   virtual void TryUnload () = 0;
00699   virtual const char *QueryDescription () = 0;
00701   virtual const char *QueryDependencies () = 0;
00703   virtual const char *QueryClassID () = 0;
00705   virtual const char *QueryModuleName () = 0;
00706 };
00707 
00708 //----------------------------------------------- Client-side functions -----//
00709 
00714 enum
00715 {
00716   SCF_VERBOSE_NONE            = 0,      
00717   SCF_VERBOSE_PLUGIN_SCAN     = 1 << 0, 
00718   SCF_VERBOSE_PLUGIN_LOAD     = 1 << 1, 
00719   SCF_VERBOSE_PLUGIN_REGISTER = 1 << 2, 
00720   SCF_VERBOSE_CLASS_REGISTER  = 1 << 3, 
00721   SCF_VERBOSE_ALL             = ~0      
00722 };
00723 
00739 CS_CRYSTALSPACE_EXPORT void scfInitialize(csPathsList const* pluginPaths,
00740   unsigned int verbose = SCF_VERBOSE_NONE);
00741 
00746 CS_CRYSTALSPACE_EXPORT void scfInitialize(int argc, const char* const argv[]);
00747 
00749 
00755 CS_CRYSTALSPACE_EXPORT void scfRegisterStaticClass (scfFactoryFunc, 
00756   const char *iClassID, const char *Description, 
00757   const char *Dependencies = 0);
00758 CS_CRYSTALSPACE_EXPORT void scfRegisterStaticClasses (char const* xml);
00759 CS_CRYSTALSPACE_EXPORT void scfRegisterStaticFactoryFunc (scfFactoryFunc, 
00760   const char *FactClass);
00762   
00763 //---------- IMPLEMENTATION OF HELPER FUNCTIONS
00764 
00765 
00766 
00770 template<class Interface, class ClassPtr>
00771 inline csPtr<Interface> scfQueryInterface (ClassPtr object)
00772 {
00773   Interface *x = (Interface*)object->QueryInterface (
00774     scfInterfaceTraits<Interface>::GetID (),
00775     scfInterfaceTraits<Interface>::GetVersion ());
00776   return csPtr<Interface> (x);
00777 }
00778 
00779 //Compatibility macro for scfQueryInterface
00780 #define SCF_QUERY_INTERFACE(Object,Interface) \
00781   scfQueryInterface<Interface> (Object)
00782 
00787 template<class Interface, class ClassPtr>
00788 inline csPtr<Interface> scfQueryInterfaceSafe (ClassPtr object)
00789 {
00790   if (object == 0) return csPtr<Interface> (0);
00791 
00792   Interface *x = (Interface*)object->QueryInterface (
00793     scfInterfaceTraits<Interface>::GetID (),
00794     scfInterfaceTraits<Interface>::GetVersion ());
00795   return csPtr<Interface> (x);
00796 }
00797 //Compatibility macro for scfQueryInterfaceSafe
00798 #define SCF_QUERY_INTERFACE_SAFE(Object,Interface) \
00799   scfQueryInterfaceSafe<Interface> (Object)
00800 
00804 template<class Interface>
00805 inline csPtr<Interface> scfCreateInstance (char const * const ClassID)
00806 {
00807   iBase *base = iSCF::SCF->CreateInstance (ClassID);
00808 
00809   if (base == 0) return csPtr<Interface> (0);
00810 
00811   Interface *x = (Interface*)base->QueryInterface (
00812     scfInterfaceTraits<Interface>::GetID (),
00813     scfInterfaceTraits<Interface>::GetVersion ());
00814 
00815   if (x) base->DecRef (); //release our base interface
00816   return csPtr<Interface> (x);
00817 }
00818 
00819 // Compatibility macro for scfCreateInstance function
00820 #define SCF_CREATE_INSTANCE(ClassID,Interface) \
00821   scfCreateInstance<Interface> (ClassID)
00822 
00823 // Give versions to above declared classes.
00824 SCF_VERSION (iFactory, 0, 0, 2);
00825 
00826 // A bit hacky.
00827 #include "csutil/reftrackeraccess.h"
00828 
00831 #endif // __CSSCF_H__

Generated for Crystal Space by doxygen 1.4.7