9 #ifndef CLUON_GENERICMESSAGE_HPP 10 #define CLUON_GENERICMESSAGE_HPP 14 #include "cluon/any/any.hpp" 16 #include "cluon/cluonDataStructures.hpp" 20 #include <unordered_map> 172 class GenericMessageVisitor {
174 GenericMessageVisitor(
const GenericMessageVisitor &) =
delete;
175 GenericMessageVisitor(GenericMessageVisitor &&) =
delete;
176 GenericMessageVisitor &operator=(
const GenericMessageVisitor &) =
delete;
177 GenericMessageVisitor &operator=(GenericMessageVisitor &&) =
delete;
180 GenericMessageVisitor() =
default;
185 void preVisit(int32_t
id,
const std::string &shortName,
const std::string &longName) noexcept;
186 void postVisit() noexcept;
188 void visit(uint32_t
id, std::string &&typeName, std::string &&name,
bool &v) noexcept;
189 void visit(uint32_t
id, std::string &&typeName, std::string &&name,
char &v) noexcept;
190 void visit(uint32_t
id, std::string &&typeName, std::string &&name, int8_t &v) noexcept;
191 void visit(uint32_t
id, std::string &&typeName, std::string &&name, uint8_t &v) noexcept;
192 void visit(uint32_t
id, std::string &&typeName, std::string &&name, int16_t &v) noexcept;
193 void visit(uint32_t
id, std::string &&typeName, std::string &&name, uint16_t &v) noexcept;
194 void visit(uint32_t
id, std::string &&typeName, std::string &&name, int32_t &v) noexcept;
195 void visit(uint32_t
id, std::string &&typeName, std::string &&name, uint32_t &v) noexcept;
196 void visit(uint32_t
id, std::string &&typeName, std::string &&name, int64_t &v) noexcept;
197 void visit(uint32_t
id, std::string &&typeName, std::string &&name, uint64_t &v) noexcept;
198 void visit(uint32_t
id, std::string &&typeName, std::string &&name,
float &v) noexcept;
199 void visit(uint32_t
id, std::string &&typeName, std::string &&name,
double &v) noexcept;
200 void visit(uint32_t
id, std::string &&typeName, std::string &&name, std::string &v) noexcept;
202 template <
typename T>
203 void visit(uint32_t &
id, std::string &&typeName, std::string &&name, T &value) noexcept {
210 m_intermediateDataRepresentation[mf.
fieldIdentifier()] = linb::any{gm};
211 m_metaMessage.add(std::move(mf));
223 std::unordered_map<uint32_t, linb::any, UseUInt32ValueAsHashKey> intermediateDataRepresentation()
const noexcept;
227 std::unordered_map<uint32_t, linb::any, UseUInt32ValueAsHashKey> m_intermediateDataRepresentation;
241 const std::string ShortName();
242 const std::string LongName();
250 template <
typename T>
252 GenericMessageVisitor gmv;
255 m_metaMessage = gmv.metaMessage();
256 m_intermediateDataRepresentation.clear();
257 m_intermediateDataRepresentation = gmv.intermediateDataRepresentation();
267 void createFrom(
const MetaMessage &
mm,
const std::vector<MetaMessage> &mms) noexcept;
272 void preVisit(int32_t
id,
const std::string &shortName,
const std::string &longName) noexcept;
273 void postVisit() noexcept;
275 void visit(uint32_t
id, std::string &&typeName, std::string &&name,
bool &v) noexcept;
276 void visit(uint32_t
id, std::string &&typeName, std::string &&name,
char &v) noexcept;
277 void visit(uint32_t
id, std::string &&typeName, std::string &&name, int8_t &v) noexcept;
278 void visit(uint32_t
id, std::string &&typeName, std::string &&name, uint8_t &v) noexcept;
279 void visit(uint32_t
id, std::string &&typeName, std::string &&name, int16_t &v) noexcept;
280 void visit(uint32_t
id, std::string &&typeName, std::string &&name, uint16_t &v) noexcept;
281 void visit(uint32_t
id, std::string &&typeName, std::string &&name, int32_t &v) noexcept;
282 void visit(uint32_t
id, std::string &&typeName, std::string &&name, uint32_t &v) noexcept;
283 void visit(uint32_t
id, std::string &&typeName, std::string &&name, int64_t &v) noexcept;
284 void visit(uint32_t
id, std::string &&typeName, std::string &&name, uint64_t &v) noexcept;
285 void visit(uint32_t
id, std::string &&typeName, std::string &&name,
float &v) noexcept;
286 void visit(uint32_t
id, std::string &&typeName, std::string &&name,
double &v) noexcept;
287 void visit(uint32_t
id, std::string &&typeName, std::string &&name, std::string &v) noexcept;
289 template <
typename T>
290 void visit(uint32_t &
id, std::string &&typeName, std::string &&name, T &value) noexcept {
293 if (0 < m_intermediateDataRepresentation.count(
id)) {
297 }
catch (
const linb::bad_any_cast &) {
310 template<
class Visitor>
311 inline void accept(uint32_t fieldId, Visitor &visitor) {
312 const bool VISIT_ALL{
false};
313 accept<Visitor>(fieldId, visitor, VISIT_ALL);
322 template <
class Visitor>
324 const uint32_t FIELD_ID{0};
325 const bool VISIT_ALL{
true};
326 accept<Visitor>(FIELD_ID, visitor, VISIT_ALL);
337 template <
class PreVisitor,
class Visitor,
class PostVisitor>
338 void accept(PreVisitor &&_preVisit, Visitor &&_visit, PostVisitor &&_postVisit) {
339 std::forward<PreVisitor>(_preVisit)(m_metaMessage.messageIdentifier(), m_metaMessage.messageName(), m_longName);
341 for (
const auto &f : m_metaMessage.listOfMetaFields()) {
344 auto &v = linb::any_cast<
bool &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
345 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
346 }
catch (
const linb::bad_any_cast &) {
350 auto &v = linb::any_cast<
char &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
351 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
352 }
catch (
const linb::bad_any_cast &) {
356 auto &v = linb::any_cast<uint8_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
357 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
358 }
catch (
const linb::bad_any_cast &) {
362 auto &v = linb::any_cast<int8_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
363 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
364 }
catch (
const linb::bad_any_cast &) {
368 auto &v = linb::any_cast<uint16_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
369 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
370 }
catch (
const linb::bad_any_cast &) {
374 auto &v = linb::any_cast<int16_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
375 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
376 }
catch (
const linb::bad_any_cast &) {
380 auto &v = linb::any_cast<uint32_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
381 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
382 }
catch (
const linb::bad_any_cast &) {
386 auto &v = linb::any_cast<int32_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
387 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
388 }
catch (
const linb::bad_any_cast &) {
392 auto &v = linb::any_cast<uint64_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
393 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
394 }
catch (
const linb::bad_any_cast &) {
398 auto &v = linb::any_cast<int64_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
399 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
400 }
catch (
const linb::bad_any_cast &) {
404 auto &v = linb::any_cast<
float &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
405 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
406 }
catch (
const linb::bad_any_cast &) {
410 auto &v = linb::any_cast<
double &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
411 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
412 }
catch (
const linb::bad_any_cast &) {
415 && (0 < m_intermediateDataRepresentation.count(f.fieldIdentifier()))) {
417 auto &v = linb::any_cast<std::string &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
418 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
419 }
catch (
const linb::bad_any_cast &) {
423 auto &v = linb::any_cast<
cluon::GenericMessage &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
424 doTripletForwardVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, _preVisit, _visit, _postVisit);
425 }
catch (
const linb::bad_any_cast &) {
430 std::forward<PostVisitor>(_postVisit)();
434 template<
class Visitor>
435 inline void accept(uint32_t fieldId, Visitor &visitor,
bool visitAll) {
436 visitor.preVisit(ID(), ShortName(), LongName());
438 for (
const auto &f : m_metaMessage.listOfMetaFields()) {
439 if (visitAll || (fieldId == f.fieldIdentifier())) {
442 auto &v = linb::any_cast<
bool &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
443 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
444 }
catch (
const linb::bad_any_cast &) {
448 auto &v = linb::any_cast<
char &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
449 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
450 }
catch (
const linb::bad_any_cast &) {
454 auto &v = linb::any_cast<uint8_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
455 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
456 }
catch (
const linb::bad_any_cast &) {
460 auto &v = linb::any_cast<int8_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
461 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
462 }
catch (
const linb::bad_any_cast &) {
466 auto &v = linb::any_cast<uint16_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
467 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
468 }
catch (
const linb::bad_any_cast &) {
472 auto &v = linb::any_cast<int16_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
473 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
474 }
catch (
const linb::bad_any_cast &) {
478 auto &v = linb::any_cast<uint32_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
479 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
480 }
catch (
const linb::bad_any_cast &) {
484 auto &v = linb::any_cast<int32_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
485 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
486 }
catch (
const linb::bad_any_cast &) {
490 auto &v = linb::any_cast<uint64_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
491 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
492 }
catch (
const linb::bad_any_cast &) {
496 auto &v = linb::any_cast<int64_t &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
497 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
498 }
catch (
const linb::bad_any_cast &) {
502 auto &v = linb::any_cast<
float &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
503 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
504 }
catch (
const linb::bad_any_cast &) {
508 auto &v = linb::any_cast<
double &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
509 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
510 }
catch (
const linb::bad_any_cast &) {
513 && (0 < m_intermediateDataRepresentation.count(f.fieldIdentifier()))) {
515 auto &v = linb::any_cast<std::string &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
516 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
517 }
catch (
const linb::bad_any_cast &) {
521 auto &v = linb::any_cast<
cluon::GenericMessage &>(m_intermediateDataRepresentation[f.fieldIdentifier()]);
522 doVisit(f.fieldIdentifier(), std::move(f.fieldDataTypeName()), std::move(f.fieldName()), v, visitor);
523 }
catch (
const linb::bad_any_cast &) {
527 if (!visitAll && (fieldId == f.fieldIdentifier())) {
538 std::vector<MetaMessage> m_scopeOfMetaMessages{};
539 std::unordered_map<std::string, MetaMessage> m_mapForScopeOfMetaMessages{};
540 std::string m_longName{
""};
541 std::unordered_map<uint32_t, linb::any, UseUInt32ValueAsHashKey> m_intermediateDataRepresentation;
546 struct isVisitable<
cluon::GenericMessage> {
547 static const bool value =
true;
550 struct isTripletForwardVisitable<
cluon::GenericMessage> {
551 static const bool value =
true;
return mm
Definition: MessageParser.cpp:257
#define LIBCLUON_API
Definition: cluon.hpp:56
Definition: GenericMessage.hpp:170
void accept(Visitor &visitor)
Definition: GenericMessage.hpp:323
void visit(uint32_t &id, std::string &&typeName, std::string &&name, T &value) noexcept
Definition: GenericMessage.hpp:290
void accept(PreVisitor &&_preVisit, Visitor &&_visit, PostVisitor &&_postVisit)
Definition: GenericMessage.hpp:338
void accept(uint32_t fieldId, Visitor &visitor)
Definition: GenericMessage.hpp:311
MetaMessage::MetaField mf
Definition: MessageParser.cpp:243
void createFrom(T &msg)
Definition: GenericMessage.hpp:251