#ifndef __XMLIO_OBJECT_TEMPLATE__ #define __XMLIO_OBJECT_TEMPLATE__ // Classes utilisées issues de la STL using std::pair; using std::string; using std::ostream; using XMLIOSERVER::StrHashMap; namespace XMLIOSERVER { template class ObjectTemplate : public AbstractObject { public : static T& CreateObject(const string _id) throw (XMLIOUndefinedValueException) { // Si l'identifiant est répertorié, on retourne l'élément existant. if(ObjectTemplate::HasObject(_id)) return (ObjectTemplate::GetObject(_id)); // Ajout d'un nouvel objet si l'identifiant n'est pas répertorié. T identified_object(_id); ObjectTemplate::CurrListObj.addObject(identified_object); ObjectTemplate::GetObject(_id).registerAllAttributes(); return (ObjectTemplate::GetObject(_id)); } static T& CreateObject(void) { ObjectTemplate::CurrListObj.addObject(*(new T)); //<< Perte mémoire ici return (*(ObjectTemplate::CurrListObj.getVector()[ObjectTemplate::CurrListObj.getVectorSize()-1])); } static T& GetObject(const string _id) throw (XMLIOUndefinedValueException) { return (ObjectTemplate::CurrListObj[_id]); } static bool HasObject(const string _id) { return (ObjectTemplate::CurrListObj.hasMappedValue(_id)); } static const StrHashMap GetCurrentListObject(void) { return (CurrListObj); } virtual void registerAllAttributes(void) {}; virtual const char* getName(void) const {return ("ObjectTemplate"); } /// POUR TESTS /// #define OBJECTTEMPLATE_TEST(DESC, SIZE, VECTORSIZE) \ if(ObjectTemplate::CurrListObj.getSize() != SIZE or ObjectTemplate::CurrListObj.getVectorSize() != VECTORSIZE) \ { log << "Test de la classe ObjectTemplate > " << DESC << "... echec !" << std::endl; return (false); } static bool CLASS_TEST(ostream& log = std::clog) { //////////////////////////////////////////////////////////////////// T& obj0= ObjectTemplate::CreateObject("toto"); T& obj1= ObjectTemplate::CreateObject("tata"); OBJECTTEMPLATE_TEST("Ajout d'objets identifiés au conteneur", 2, 2); T& obj2= ObjectTemplate::CreateObject("tata"); OBJECTTEMPLATE_TEST("Ajout d'objets identifiés déjà existants au conteneur", 2, 2); T& obj3= ObjectTemplate::CreateObject(); OBJECTTEMPLATE_TEST("Ajout d'objets non-identifiés au conteneur", 2, 3); //////////////////////////////////////////////////////////////////// log << "Test ObjectTemplate ... ok !" << std::endl; return (true); }; #undef OBJECTTEMPLATE_TEST virtual ~ObjectTemplate(void) {/* Ne rien faire de plus */} protected : ObjectTemplate(void) : AbstractObject() {/* Ne rien faire de plus */} ObjectTemplate(const string& _id) : AbstractObject(_id) {/* Ne rien faire de plus */} private : static StrHashMap CurrListObj; };// class ObjectTemplate template StrHashMap ObjectTemplate::CurrListObj ; }// namespace XMLIOSERVER #endif // __XMLIO_OBJECT_TEMPLATE__