Code_TYMPAN  4.2.0
Industrial site acoustic simulation
Classes | Public Member Functions | Static Public Member Functions | Protected Member Functions | Static Private Attributes | List of all members
OPrototype Class Referenceabstract

#include <TYElement.h>

Inheritance diagram for OPrototype:
Inheritance graph
[legend]
Collaboration diagram for OPrototype:
Collaboration graph
[legend]

Classes

class  Factory
 
class  IOProtoFactory
 

Public Member Functions

virtual ~OPrototype ()
 
virtual OPrototypeclone () const =0
 
virtual const char * getClassName () const
 
bool isA (const char *className) const
 

Static Public Member Functions

static OPrototypefindAndClone (const char *className)
 
static int findPrototype (const char *className)
 
static OPrototypesafeDownCast (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
 

Detailed Description

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.

Constructor & Destructor Documentation

◆ ~OPrototype()

OPrototype::~OPrototype ( )
virtual

Destructeur.

Definition at line 35 of file TYElement.cpp.

◆ OPrototype()

OPrototype::OPrototype ( )
protected

Constructeur par defaut.

Definition at line 31 of file TYElement.cpp.

Member Function Documentation

◆ add_factory()

void OPrototype::add_factory ( const char *  classname,
IOProtoFactory::ptr_type  factory 
)
static

Adds the factory "factory" allowing to build the class named "classname"

Definition at line 39 of file TYElement.cpp.

Here is the caller graph for this function:

◆ clone()

virtual OPrototype* OPrototype::clone ( ) const
pure virtual

Instancie un nouvel objet du meme type que cet objet. Il est aussi possible de retourner une copie.

Returns
Une nouvelle instance du type derive.
Here is the caller graph for this function:

◆ findAndClone()

OPrototype * OPrototype::findAndClone ( const char *  className)
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.

Parameters
classNameLe nom de la classe a chercher puis cloner.
Returns
Une nouvelle instance du type recherche ou NULL s'il n'a pas ete trouve.

Definition at line 45 of file TYElement.cpp.

Here is the caller graph for this function:

◆ findPrototype()

int OPrototype::findPrototype ( const char *  className)
static

Recherche une classe par son nom dans le tableau des classes registrees.

Parameters
classNameLe nom de la classe a chercher.
Returns
L'index dans le tableau si la classe a ete registree; -1 sinon.

Definition at line 63 of file TYElement.cpp.

Here is the caller graph for this function:

◆ getClassName()

virtual const char* OPrototype::getClassName ( ) const
inlinevirtual

Retourne le type de la classe sous la forme d'une chaine de caractere.

Returns
Le nom de la classe.

Definition at line 248 of file TYElement.h.

Here is the caller graph for this function:

◆ isA()

bool OPrototype::isA ( const char *  className) const

Compare le type de cet objet avec un nom de classe donne.

Parameters
classNameLe nom de la classe a comparer.
Returns
Retourne true si cet objet est une instance de la classe specifiee, si non false.

Definition at line 70 of file TYElement.cpp.

Here is the call graph for this function:
Here is the caller graph for this function:

◆ safeDownCast()

OPrototype * OPrototype::safeDownCast ( OPrototype pObject)
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.

Parameters
pObjectL'instance a caster.
Returns
L'instance castee dans le bon type ou NULL.

Definition at line 76 of file TYElement.cpp.

Member Data Documentation

◆ _factory_map

std::unordered_map< std::string, OPrototype::IOProtoFactory::ptr_type > OPrototype::_factory_map
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.


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