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 namespace detail {
68 
70 
71 template <typename PromoteTo, typename T>
72 struct PromoteHelperCheckFundamental
73 {
74  static void promote(ConcreteChannel<void>* channel)
75  {
76  // if T is fundamental, promote() is a no-op (there cannot be a channel of type PromoteTo!)
77  if constexpr(!boost::is_fundamental<T>::value)
78  channel_cast<PromoteTo>(channel);
79  }
80 };
81 
82 template <typename PromoteTo>
83 struct PromoteHelper
84 {
85  static void promote(ConcreteChannel<void>* channel)
86  {
87  channel_cast<PromoteTo>(channel);
88  }
89 };
90 
95 template <typename T>
96 struct PromoteHelper<boost::shared_ptr<T>>
97  : public PromoteHelperCheckFundamental<boost::shared_ptr<T>, T> {};
98 
103 template <typename T>
104 struct PromoteHelper<std::vector<boost::shared_ptr<T>>>
105  : public PromoteHelperCheckFundamental<std::vector<boost::shared_ptr<T>>, T> {};
106 
108 
109 }
110 
111 #define COMMA ,
112 
126 template <typename PromoteTo, typename ExtraDiscriminator>
127 class TypedChannelPromoter : public TypedChannelPromoterBase
128 {
129  MIRA_META_OBJECT(TypedChannelPromoter<PromoteTo COMMA ExtraDiscriminator>,
130  ("PromoteTo", typeName() ) )
131 public:
133  void promote(ConcreteChannel<void>* channel) const
134  {
135  detail::PromoteHelper<PromoteTo>::promote(channel);
136  }
137 
139  static std::string typeName()
140  {
141  return mira::typeName<PromoteTo>();
142  };
143 };
144 
145 #undef COMMA
146 
147 #ifdef MIRA_DISABLE_CHANNELPROMOTERS
148  // #define macro empty to entirely disable registration
149  #define MIRA_REGISTER_CHANNELTYPE(channeltype)
150 #else
151  #ifndef MIRA_UNIQUE_IDENTIFIER_ENABLED
152  #pragma message("UniqueIdentifier not enabled. " \
153  "MIRA_REGISTER_CHANNELTYPE disabled.")
154  #define MIRA_REGISTER_CHANNELTYPE(channeltype)
155  #else
156  // semi-unique identifier __project_path_to_file_line__
157  #define MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME \
158  MIRA_FILE_LINE_IDENTIFIER
159 
160  // Define a unique class and use it as extra template parameter
161  // for the promoter specialization to register.
162  // Using the source file name and line as part of the resulting type name
163  // gives the bonus advantage that its origin can easily be found in the code.
164  #define MIRA_REGISTER_CHANNELTYPE(channeltype) \
165  namespace MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME { \
166  class plain{}; \
167  } \
168  MIRA_VARTEMPLATE_CLASS_REGISTER( \
169  (mira), TypedChannelPromoter, 2, \
170  (channeltype, \
171  MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME::plain), \
172  mira::TypedChannelPromoterBase) \
173  \
174  namespace MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME { \
175  class boost_optional{}; \
176  } \
177  MIRA_VARTEMPLATE_CLASS_REGISTER( \
178  (mira), TypedChannelPromoter, 2, \
179  (boost::optional<channeltype>, \
180  MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME::boost_optional), \
181  mira::TypedChannelPromoterBase) \
182  \
183  namespace MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME { \
184  class boost_shared_ptr{}; \
185  } \
186  MIRA_VARTEMPLATE_CLASS_REGISTER( \
187  (mira), TypedChannelPromoter, 2, \
188  (boost::shared_ptr<channeltype>, \
189  MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME::boost_shared_ptr), \
190  mira::TypedChannelPromoterBase) \
191  \
192  namespace MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME { \
193  class std_vector{}; \
194  } \
195  MIRA_VARTEMPLATE_CLASS_REGISTER( \
196  (mira), TypedChannelPromoter, 2, \
197  (std::vector<channeltype>, \
198  MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME::std_vector), \
199  mira::TypedChannelPromoterBase) \
200  \
201  namespace MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME { \
202  class std_vector_boost_optional{}; \
203  } \
204  MIRA_VARTEMPLATE_CLASS_REGISTER( \
205  (mira), TypedChannelPromoter, 2, \
206  (std::vector<boost::optional<channeltype>>, \
207  MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME::std_vector_boost_optional),\
208  mira::TypedChannelPromoterBase) \
209  \
210  namespace MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME { \
211  class std_vector_boost_shared_ptr{}; \
212  } \
213  MIRA_VARTEMPLATE_CLASS_REGISTER( \
214  (mira), TypedChannelPromoter, 2, \
215  (std::vector<boost::shared_ptr<channeltype>>, \
216  MIRA_REGISTER_CHANNELTYPE_UNIQUE_NAME::std_vector_boost_shared_ptr),\
217  mira::TypedChannelPromoterBase)
218  #endif
219 #endif
220 
222 
224 
225 }
226 
227 #endif
Definition: SyncTimedRead.h:62
specialize cv::DataType for our ImgPixel and inherit from cv::DataType<Vec>
Definition: IOService.h:67
STL namespace.
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