iLab Neuromorphic Robotics Toolkit  0.1
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
ComponentFactory.H
Go to the documentation of this file.
1 /*! @file
2  @author Laurent Itti
3  @copyright GNU Public License (GPL v3)
4  @section License
5  @verbatim
6  // ////////////////////////////////////////////////////////////////////////
7  // The iLab Neuromorphic Robotics Toolkit (NRT) //
8  // Copyright 2010-2012 by the University of Southern California (USC) //
9  // and the iLab at USC. //
10  // //
11  // iLab - University of Southern California //
12  // Hedco Neurociences Building, Room HNB-10 //
13  // Los Angeles, Ca 90089-2520 - USA //
14  // //
15  // See http://ilab.usc.edu for information about this project. //
16  // ////////////////////////////////////////////////////////////////////////
17  // This file is part of The iLab Neuromorphic Robotics Toolkit. //
18  // //
19  // The iLab Neuromorphic Robotics Toolkit is free software: you can //
20  // redistribute it and/or modify it under the terms of the GNU General //
21  // Public License as published by the Free Software Foundation, either //
22  // version 3 of the License, or (at your option) any later version. //
23  // //
24  // The iLab Neuromorphic Robotics Toolkit is distributed in the hope //
25  // that it will be useful, but WITHOUT ANY WARRANTY; without even the //
26  // implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR //
27  // PURPOSE. See the GNU General Public License for more details. //
28  // //
29  // You should have received a copy of the GNU General Public License //
30  // along with The iLab Neuromorphic Robotics Toolkit. If not, see //
31  // <http://www.gnu.org/licenses/>. //
32  // ////////////////////////////////////////////////////////////////////////
33  @endverbatim */
34 
35 #ifndef INCLUDE_NRT_CORE_MODEL_COMPONENTFACTORY_H
36 #define INCLUDE_NRT_CORE_MODEL_COMPONENTFACTORY_H
37 
39 #include <map>
40 #include <functional>
41 
42 namespace nrt
43 {
44  class Component;
45 
46  /*! \defgroup componentfactory Component Factory related classes and definitions
47  \ingroup component */
48 
49  //! A factory for objects that derive from nrt::Component
50  /*! The factory holds a collection of product creators, and each is given an ID. One can then create products for any
51  of the registered IDs. In addition, one can store and later retrieve some metadata with each product creator.
52 
53  \tparam IDtype type used to represent IDs (typically, std:string)
54  \tparam Creator function that creates the new Component and adds it as a sub-comp of the parent
55  \tparam MetaDataType type used to represent metadata
56 
57  \ingroup componentfactory */
58  template <typename IDtype = std::string,
59  typename Creator = std::function<std::shared_ptr<nrt::Component>(nrt::Component * parent,
60  std::string const & instanceName)>,
61  class MetaDataType = std::map<std::string, std::string> >
63  {
64  public:
65  //! Register a new product creator (and associated meta-data) under a new ID
66  /*! \note A copy of metaData is stored in the factory, so if your meta-data is large, you may want to define
67  MetaDataType as an std::shared_ptr */
68  void registerType(IDtype const & id, Creator creator, MetaDataType const & metaData = MetaDataType());
69 
70  //! Create a product for a given ID
71  typename std::result_of<Creator(nrt::Component *, std::string const &)>::type
72  create(IDtype const & id, nrt::Component * parent, std::string const & instanceName);
73 
74  //! Check whether an ID has been registered
75  bool isRegistered(IDtype const & id);
76 
77  //! Return the metadata for a given ID
78  MetaDataType const & getMetaData(IDtype const & id);
79 
80  //! Return a list of all registered IDs
81  std::vector<IDtype> getIDs();
82 
83  private:
84  typedef std::map<IDtype, std::pair<Creator, MetaDataType> > CallbackMap_t;
85  CallbackMap_t _creatorCallbacks;
86  };
87 
88 } // namespace nrt
89 
90 // Include implementation details of no interest to end users
92 
93 #endif // INCLUDE_NRT_CORE_MODEL_COMPONENTFACTORY_H
94