Code_TYMPAN
4.2.0
Industrial site acoustic simulation
|
#include <TYElement.h>
Classes | |
class | Factory |
class | IOProtoFactory |
Public Member Functions | |
virtual | ~OPrototype () |
virtual OPrototype * | clone () const =0 |
virtual const char * | getClassName () const |
bool | isA (const char *className) const |
Static Public Member Functions | |
static OPrototype * | findAndClone (const char *className) |
static int | findPrototype (const char *className) |
static OPrototype * | safeDownCast (OPrototype *pObject) |
static void | add_factory (const char *, IOProtoFactory::ptr_type factory) |
Protected Member Functions | |
OPrototype () | |
Static Private Attributes | |
static std::unordered_map< std::string, IOProtoFactory::ptr_type > | _factory_map |
Classe abstraite Prototype du pattern Prototype Factory. Les classes derivees de Prototype peuvent etre instanciees a partir seulement du nom de la classe (chaine de caracteres).
Pour cela, la map statique _factory_map associe a une chaine de caracteres representant le nom de la classe la factory permettant de construire une instance de ce type
La methode public static 'findAndClone()' est l'interface principale de ce mecanisme, elle permet d'instancier un nouvel objet a partir de son nom (a condition que le type correspondant existe et soit deja enregistre dans Prototype au moment de l'appel). Si le nom n'est pas connu au moment de l'appel, elle leve une exception 'tympan::invalid_data'.
La methode 'findPrototype()' cherche si une classe est enregistree aupres de OPrototype.
Enfin, la methode virtuelle pure 'clone()' permet aux classes derivees de retourner une nouvelle instance du type derive correspondant.
De plus, la methode 'isA()' permet de verifier le type d'une instance.
L'exemple suivant presente le squelette a reprendre pour creer des classe derivees de Prototype, c'est-a-dire de nouveaux composants. La classe derivee pour cet exemple se nomme 'ConcretePrototype'.
// Declaration (ConcretePrototype.h)
class ConcretePrototype : public Prototype {
public: // Constructeur par defaut. ConcretePrototype();
//...//
// Permet de creer une nouvelle instance de type ConcretePrototype. virtual Prototype* clone() const { return new ConcretePrototype(); }
// Retourne le nom de la classe. virtual char* getClassName() { return "ConcretePrototype"; }
};
La macro OPROTODECL a ete concue pour reprendre ces declarations comme suit:
#define OPROTODECL(classname) \ friend register##classname(); \ public: \ virtual OPrototype* clone(bool andCopy = false) const { \ if (andCopy) return new classname(*this); \ else return new classname(); \ } \ virtual char* getClassName() { return #classname; }
La declaration d'une nouvelle classe s'en trouve alors simplifiee, il suffit de faire appel a la macro. L'exemple precedent devient donc :
class ConcretePrototype : public Prototype { OPROTODECL(ConcretePrototype)
public: // Constructeur par defaut. ConcretePrototype();
//...// };
// Implementation (ConcretePrototype.cpp)
#include "ConcretePrototype.h"
ConcretePrototype::ConcretePrototype() { }
Cette technique d'enregistrement n'est donc pas autonome puisqu'il est necessaire de reprendre le modele ci-dessus pour chaque nouvelle classe derivee de Prototype.
ATTENTION: en complement des declarations des classes via la macro OPROTODECL, il faut egalement enregistrer celles-ci aupres de OProrotype. Cette action doit etre effectuee avant toute utilisation des methodes de creation d'instances et de recherche de classes definies par OPrototype ('findPrototype()', 'clone()' et 'findAndClone()'). Cet enregistrement s'effectue au moyen de la methode statique 'add_factory()', qui permet d'enregistrer les differentes classes ainsi que leurs fabriques (utiliser la fonction 'build_factory<T>()' pour la fabrique). Exemple d'utilisation: OPrototype::add_factory("TYTopographie", move(build_factory<TYTopographie>()));
(voir Tympan/models/business/init_registry.{h,cpp})
Definition at line 201 of file TYElement.h.
|
virtual |
Destructeur.
Definition at line 35 of file TYElement.cpp.
|
protected |
Constructeur par defaut.
Definition at line 31 of file TYElement.cpp.
|
static |
Adds the factory "factory" allowing to build the class named "classname"
Definition at line 39 of file TYElement.cpp.
|
pure virtual |
Instancie un nouvel objet du meme type que cet objet. Il est aussi possible de retourner une copie.
|
static |
Recherche une classe par son nom dans le tableau des classes registrees, une nouvelle instance est creee et retournee si le type a ete trouvee.
className | Le nom de la classe a chercher puis cloner. |
Definition at line 45 of file TYElement.cpp.
|
static |
Recherche une classe par son nom dans le tableau des classes registrees.
className | Le nom de la classe a chercher. |
Definition at line 63 of file TYElement.cpp.
|
inlinevirtual |
Retourne le type de la classe sous la forme d'une chaine de caractere.
Definition at line 248 of file TYElement.h.
bool OPrototype::isA | ( | const char * | className | ) | const |
Compare le type de cet objet avec un nom de classe donne.
className | Le nom de la classe a comparer. |
true
si cet objet est une instance de la classe specifiee, si non false
. Definition at line 70 of file TYElement.cpp.
|
static |
Effectue un cast sur l'objet passe si cela est possible, sinon retourne NULL. Cette methode statique est reimplementee dans toutes les classes derivees a OPrototype par la macro OPROTODECL.
pObject | L'instance a caster. |
Definition at line 76 of file TYElement.cpp.
|
staticprivate |
maps a class name (key) to the corresponding factory (value) that can build it through its "make()" method
Definition at line 324 of file TYElement.h.