MIRA
ChannelPromoteByTypenameRegistration.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2018 by
3  * MetraLabs GmbH (MLAB), GERMANY
4  * and
5  * Neuroinformatics and Cognitive Robotics Labs (NICR) at TU Ilmenau, GERMANY
6  * All rights reserved.
7  *
8  * Contact: info@mira-project.org
9  *
10  * Commercial Usage:
11  * Licensees holding valid commercial licenses may use this file in
12  * accordance with the commercial license agreement provided with the
13  * software or, alternatively, in accordance with the terms contained in
14  * a written agreement between you and MLAB or NICR.
15  *
16  * GNU General Public License Usage:
17  * Alternatively, this file may be used under the terms of the GNU
18  * General Public License version 3.0 as published by the Free Software
19  * Foundation and appearing in the file LICENSE.GPL3 included in the
20  * packaging of this file. Please review the following information to
21  * ensure the GNU General Public License version 3.0 requirements will be
22  * met: http://www.gnu.org/copyleft/gpl.html.
23  * Alternatively you may (at your option) use any later version of the GNU
24  * General Public License if such license has been publicly approved by
25  * MLAB and NICR (or its successors, if any).
26  *
27  * IN NO EVENT SHALL "MLAB" OR "NICR" BE LIABLE TO ANY PARTY FOR DIRECT,
28  * INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES ARISING OUT OF
29  * THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN IF "MLAB" OR
30  * "NICR" HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31  *
32  * "MLAB" AND "NICR" SPECIFICALLY DISCLAIM ANY WARRANTIES, INCLUDING,
33  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
34  * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS
35  * ON AN "AS IS" BASIS, AND "MLAB" AND "NICR" HAVE NO OBLIGATION TO
36  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS OR MODIFICATIONS.
37  */
38 
53 #ifndef _MIRA_CHANNEL_PROMOTE_BY_TYPENAME_REGISTRATION_H_
54 #define _MIRA_CHANNEL_PROMOTE_BY_TYPENAME_REGISTRATION_H_
55 
56 #include <utils/UniqueIdentifier.h>
57 
58 #include <fw/Framework.h>
60 
61 namespace mira {
62 
64 
66 
67 #define COMMA ,
68 
82 template <typename PromoteTo, typename ExtraDiscriminator>
83 class TypedChannelPromoter : public TypedChannelPromoterBase
84 {
85  MIRA_META_OBJECT(TypedChannelPromoter<PromoteTo COMMA ExtraDiscriminator>,
86  ("PromoteTo", typeName() ) )
87 public:
89  void promote(ConcreteChannel<void>* channel) const
90  {
91  channel_cast<PromoteTo>(channel);
92  }
93 
95  static std::string typeName()
96  {
97  return mira::typeName<PromoteTo>();
98  };
99 };
100 
101 #undef COMMA
102 
103 #ifdef MIRA_DISABLE_CHANNELPROMOTERS
104  // #define macro empty to entirely disable registration
105  #define MIRA_REGISTER_CHANNELTYPE(channeltype)
106 #else
107  #ifndef MIRA_UNIQUE_IDENTIFIER_ENABLED
108  #pragma message("UniqueIdentifier not enabled. " \
109  "MIRA_REGISTER_CHANNELTYPE disabled.")
110  #define MIRA_REGISTER_CHANNELTYPE(channeltype)
111  #else
112  // semi-unique identifier __project_path_to_file_line__
113  #define MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME \
114  MIRA_FILE_LINE_IDENTIFIER
115 
116  // Define a unique class and use it as extra template parameter
117  // for the promoter specialization to register.
118  // Using the source file name and line as part of the resulting type name
119  // gives the bonus advantage that its origin can easily be found in the code.
120  #define MIRA_REGISTER_CHANNELTYPE(channeltype) \
121  class MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME{}; \
122  MIRA_VARTEMPLATE_CLASS_REGISTER( \
123  (mira), TypedChannelPromoter, 2, \
124  (channeltype, MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME), \
125  mira::TypedChannelPromoterBase)
126  #endif
127 #endif
128 
130 
132 
133 }
134 
135 #endif
specialize cv::DataType for our ImgPixel and inherit from cv::DataType<Vec>
Definition: IOService.h:67
Determine a unique identifier (or string).
#define MIRA_META_OBJECT(classIdentifier, MetaInfo)
Use this MACRO instead of MIRA_OBJECT if you like to add meta information to your class...
Definition: FactoryMacros.h:204
Infrastructure for promotion of channels from void to typed based on runtime knowledge of the typenam...
The framework that holds all manager classes and provides startup and shutdown of all framework relat...
Typename typeName(bool cvqualify=true)
Returns a compiler and platform independent typename of T.
Definition: Typename.h:103