30#error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
51#ifndef ETL_MESSAGE_ROUTER_INCLUDED
52#define ETL_MESSAGE_ROUTER_INCLUDED
57#include "message_packet.h"
58#include "message_types.h"
79 message_router_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
92 message_router_illegal_id(string_type file_name_, numeric_type line_number_)
93 : message_router_exception(ETL_ERROR_TEXT(
"message router:illegal id", ETL_MESSAGE_ROUTER_FILE_ID
"A"), file_name_, line_number_)
101 class imessage_router;
112 virtual ~imessage_router() {}
115 virtual bool is_null_router()
const = 0;
116 virtual bool is_producer()
const = 0;
117 virtual bool is_consumer()
const = 0;
122 if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
137 if ((destination_router_id == get_message_router_id()) || (destination_router_id == imessage_router::ALL_MESSAGE_ROUTERS))
146 return accepts(msg.get_message_id());
152 return message_router_id;
157 NULL_MESSAGE_ROUTER = 255,
159 ALL_MESSAGE_ROUTERS = 253,
160 MESSAGE_BROKER = 252,
161 MESSAGE_ROUTER = 251,
162 MAX_MESSAGE_ROUTER = 249
168 : message_router_id(id_)
174 , message_router_id(id_)
181 imessage_router(
const imessage_router&);
182 imessage_router& operator =(
const imessage_router&);
190 class null_message_router :
public imessage_router
195 null_message_router()
196 : imessage_router(imessage_router::NULL_MESSAGE_ROUTER)
202 : imessage_router(imessage_router::NULL_MESSAGE_ROUTER, successor_)
207 using etl::imessage_router::receive;
218 using etl::imessage_router::accepts;
233 ETL_DEPRECATED
bool is_null_router() const ETL_OVERRIDE
239 bool is_producer() const ETL_OVERRIDE
245 bool is_consumer() const ETL_OVERRIDE
251 static null_message_router& instance()
253 static null_message_router nmr;
262 return etl::null_message_router::instance();
268 class message_producer :
public imessage_router
274 : imessage_router(
etl::imessage_router::MESSAGE_ROUTER)
280 : imessage_router(imessage_router::NULL_MESSAGE_ROUTER, successor_)
286 : imessage_router(id_)
293 : imessage_router(id_, successor_)
299 using etl::imessage_router::receive;
310 using etl::imessage_router::accepts;
325 ETL_DEPRECATED
bool is_null_router() const ETL_OVERRIDE
331 bool is_producer() const ETL_OVERRIDE
337 bool is_consumer() const ETL_OVERRIDE
346 template <
typename T>
347 struct is_message_router :
public etl::bool_constant<etl::is_base_of<etl::imessage_router, typename etl::remove_cvref<T>::type>::value>
354 template <
typename TRouter,
typename TMessage>
366 template <
typename TRouter>
369 send_message(TRouter& destination,
372 destination.receive(message);
378 template <
typename TRouter,
typename TMessage>
382 etl::message_router_id_t
id,
391 template <
typename TRouter>
395 etl::message_router_id_t
id,
404#if ETL_USING_CPP17 && !defined(ETL_MESSAGE_ROUTER_FORCE_CPP03_IMPLEMENTATION)
408 template <
typename TDerived,
typename... TMessageTypes>
409 class message_router :
public imessage_router
417 : imessage_router(
etl::imessage_router::MESSAGE_ROUTER)
423 : imessage_router(
etl::imessage_router::MESSAGE_ROUTER, successor_)
429 : imessage_router(id_)
436 : imessage_router(id_, successor_)
442 using etl::imessage_router::receive;
446 const bool was_handled = (receive_message_type<TMessageTypes>(msg) || ...);
456 static_cast<TDerived*
>(
this)->on_receive_unknown(msg);
461 template <typename TMessage, typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value,
int>::type = 0>
462 void receive(
const TMessage& msg)
466 static_cast<TDerived*
>(
this)->on_receive(msg);
476 static_cast<TDerived*
>(
this)->on_receive_unknown(msg);
482 using imessage_router::accepts;
486 return (accepts_type<TMessageTypes>(
id) || ...);
490 ETL_DEPRECATED
bool is_null_router() const ETL_OVERRIDE
496 bool is_producer() const ETL_OVERRIDE
502 bool is_consumer() const ETL_OVERRIDE
510 template <
typename TMessage>
513 if (TMessage::ID == msg.get_message_id())
515 static_cast<TDerived*
>(
this)->on_receive(
static_cast<const TMessage&
>(msg));
525 template <
typename TMessage>
528 if (TMessage::ID ==
id)
552 template <
typename TDerived,
553 typename T1,
typename T2 = void,
typename T3 = void,
typename T4 = void,
554 typename T5 = void,
typename T6 = void,
typename T7 = void,
typename T8 = void,
555 typename T9 = void,
typename T10 = void,
typename T11 = void,
typename T12 = void,
556 typename T13 = void,
typename T14 = void,
typename T15 = void,
typename T16 =
void>
561 typedef etl::message_packet<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16> message_packet;
590 using etl::imessage_router::receive;
629 template <
typename TMessage>
630 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value &&
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>::value,
void>::type
636 template <
typename TMessage>
637 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>::value,
void>::type
651 using imessage_router::accepts;
657 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
case T5::ID:
case T6::ID:
case T7::ID:
case T8::ID:
658 case T9::ID:
case T10::ID:
case T11::ID:
case T12::ID:
case T13::ID:
case T14::ID:
case T15::ID:
case T16::ID:
675 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
681 bool is_producer()
const ETL_OVERRIDE
687 bool is_consumer()
const ETL_OVERRIDE
697 typename T1,
typename T2,
typename T3,
typename T4,
698 typename T5,
typename T6,
typename T7,
typename T8,
699 typename T9,
typename T10,
typename T11,
typename T12,
700 typename T13,
typename T14,
typename T15>
701 class message_router<
TDerived,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
T15,
void>
706 typedef etl::message_packet<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15> message_packet;
735 using etl::imessage_router::receive;
739 const size_t id =
msg.get_message_id();
773 template <
typename TMessage>
774 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value &&
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::value,
void>::type
780 template <
typename TMessage>
781 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::value,
void>::type
796 using imessage_router::accepts;
802 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
case T5::ID:
case T6::ID:
case T7::ID:
case T8::ID:
803 case T9::ID:
case T10::ID:
case T11::ID:
case T12::ID:
case T13::ID:
case T14::ID:
case T15::ID:
820 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
826 bool is_producer()
const ETL_OVERRIDE
832 bool is_consumer()
const ETL_OVERRIDE
842 typename T1,
typename T2,
typename T3,
typename T4,
843 typename T5,
typename T6,
typename T7,
typename T8,
844 typename T9,
typename T10,
typename T11,
typename T12,
845 typename T13,
typename T14>
846 class message_router<
TDerived,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
T14,
void,
void>
851 typedef etl::message_packet<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14> message_packet;
880 using etl::imessage_router::receive;
884 const size_t id =
msg.get_message_id();
917 template <
typename TMessage>
918 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value &&
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::value,
void>::type
924 template <
typename TMessage>
925 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::value,
void>::type
940 using imessage_router::accepts;
946 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
case T5::ID:
case T6::ID:
case T7::ID:
case T8::ID:
947 case T9::ID:
case T10::ID:
case T11::ID:
case T12::ID:
case T13::ID:
case T14::ID:
964 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
970 bool is_producer()
const ETL_OVERRIDE
976 bool is_consumer()
const ETL_OVERRIDE
986 typename T1,
typename T2,
typename T3,
typename T4,
987 typename T5,
typename T6,
typename T7,
typename T8,
988 typename T9,
typename T10,
typename T11,
typename T12,
990 class message_router<
TDerived,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
T13,
void,
void,
void>
995 typedef etl::message_packet<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13> message_packet;
1024 using etl::imessage_router::receive;
1028 const size_t id =
msg.get_message_id();
1060 template <
typename TMessage>
1061 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value &&
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::value,
void>::type
1067 template <
typename TMessage>
1068 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::value,
void>::type
1083 using imessage_router::accepts;
1089 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
case T5::ID:
case T6::ID:
case T7::ID:
case T8::ID:
1090 case T9::ID:
case T10::ID:
case T11::ID:
case T12::ID:
case T13::ID:
1107 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
1113 bool is_producer()
const ETL_OVERRIDE
1119 bool is_consumer()
const ETL_OVERRIDE
1129 typename T1,
typename T2,
typename T3,
typename T4,
1130 typename T5,
typename T6,
typename T7,
typename T8,
1131 typename T9,
typename T10,
typename T11,
typename T12>
1132 class message_router<
TDerived,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
T12,
void,
void,
void,
void>
1137 typedef etl::message_packet<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12> message_packet;
1166 using etl::imessage_router::receive;
1170 const size_t id =
msg.get_message_id();
1201 template <
typename TMessage>
1202 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value &&
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::value,
void>::type
1208 template <
typename TMessage>
1209 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::value,
void>::type
1224 using imessage_router::accepts;
1230 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
case T5::ID:
case T6::ID:
case T7::ID:
case T8::ID:
1231 case T9::ID:
case T10::ID:
case T11::ID:
case T12::ID:
1248 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
1254 bool is_producer()
const ETL_OVERRIDE
1260 bool is_consumer()
const ETL_OVERRIDE
1270 typename T1,
typename T2,
typename T3,
typename T4,
1271 typename T5,
typename T6,
typename T7,
typename T8,
1272 typename T9,
typename T10,
typename T11>
1273 class message_router<
TDerived,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
T11,
void,
void,
void,
void,
void>
1278 typedef etl::message_packet<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11> message_packet;
1307 using etl::imessage_router::receive;
1311 const size_t id =
msg.get_message_id();
1341 template <
typename TMessage>
1342 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value &&
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::value,
void>::type
1348 template <
typename TMessage>
1349 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::value,
void>::type
1364 using imessage_router::accepts;
1370 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
case T5::ID:
case T6::ID:
case T7::ID:
case T8::ID:
1371 case T9::ID:
case T10::ID:
case T11::ID:
1388 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
1394 bool is_producer()
const ETL_OVERRIDE
1400 bool is_consumer()
const ETL_OVERRIDE
1410 typename T1,
typename T2,
typename T3,
typename T4,
1411 typename T5,
typename T6,
typename T7,
typename T8,
1412 typename T9,
typename T10>
1413 class message_router<
TDerived,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
T10,
void,
void,
void,
void,
void,
void>
1447 using etl::imessage_router::receive;
1451 const size_t id =
msg.get_message_id();
1480 template <
typename TMessage>
1481 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value &&
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::value,
void>::type
1487 template <
typename TMessage>
1488 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::value,
void>::type
1503 using imessage_router::accepts;
1509 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
case T5::ID:
case T6::ID:
case T7::ID:
case T8::ID:
1510 case T9::ID:
case T10::ID:
1527 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
1533 bool is_producer()
const ETL_OVERRIDE
1539 bool is_consumer()
const ETL_OVERRIDE
1549 typename T1,
typename T2,
typename T3,
typename T4,
1550 typename T5,
typename T6,
typename T7,
typename T8,
1552 class message_router<
TDerived,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
T9,
void,
void,
void,
void,
void,
void,
void>
1586 using etl::imessage_router::receive;
1590 const size_t id =
msg.get_message_id();
1618 template <
typename TMessage>
1619 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value &&
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9>::value,
void>::type
1625 template <
typename TMessage>
1626 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8, T9>::value,
void>::type
1641 using imessage_router::accepts;
1647 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
case T5::ID:
case T6::ID:
case T7::ID:
case T8::ID:
1665 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
1671 bool is_producer()
const ETL_OVERRIDE
1677 bool is_consumer()
const ETL_OVERRIDE
1687 typename T1,
typename T2,
typename T3,
typename T4,
1688 typename T5,
typename T6,
typename T7,
typename T8>
1689 class message_router<
TDerived,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
T8,
void,
void,
void,
void,
void,
void,
void,
void>
1723 using etl::imessage_router::receive;
1727 const size_t id =
msg.get_message_id();
1754 template <
typename TMessage>
1755 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value &&
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8>::value,
void>::type
1761 template <
typename TMessage>
1762 typename etl::enable_if<etl::is_base_of<imessage, TMessage>::value && !
etl::is_one_of<TMessage, T1, T2, T3, T4, T5, T6, T7, T8>::value,
void>::type
1777 using imessage_router::accepts;
1783 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
case T5::ID:
case T6::ID:
case T7::ID:
case T8::ID:
1801 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
1807 bool is_producer()
const ETL_OVERRIDE
1813 bool is_consumer()
const ETL_OVERRIDE
1823 typename T1,
typename T2,
typename T3,
typename T4,
1824 typename T5,
typename T6,
typename T7>
1825 class message_router<
TDerived,
T1,
T2,
T3,
T4,
T5,
T6,
T7,
void,
void,
void,
void,
void,
void,
void,
void,
void>
1859 using etl::imessage_router::receive;
1863 const size_t id =
msg.get_message_id();
1889 template <
typename TMessage>
1896 template <
typename TMessage>
1912 using imessage_router::accepts;
1918 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
case T5::ID:
case T6::ID:
case T7::ID:
1935 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
1941 bool is_producer()
const ETL_OVERRIDE
1947 bool is_consumer()
const ETL_OVERRIDE
1957 typename T1,
typename T2,
typename T3,
typename T4,
1958 typename T5,
typename T6>
1959 class message_router<
TDerived,
T1,
T2,
T3,
T4,
T5,
T6,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void>
1993 using etl::imessage_router::receive;
1997 const size_t id =
msg.get_message_id();
2022 template <
typename TMessage>
2029 template <
typename TMessage>
2045 using imessage_router::accepts;
2051 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
case T5::ID:
case T6::ID:
2068 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
2074 bool is_producer()
const ETL_OVERRIDE
2080 bool is_consumer()
const ETL_OVERRIDE
2090 typename T1,
typename T2,
typename T3,
typename T4,
2092 class message_router<
TDerived,
T1,
T2,
T3,
T4,
T5,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void>
2126 using etl::imessage_router::receive;
2130 const size_t id =
msg.get_message_id();
2154 template <
typename TMessage>
2161 template <
typename TMessage>
2177 using imessage_router::accepts;
2183 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
case T5::ID:
2200 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
2206 bool is_producer()
const ETL_OVERRIDE
2212 bool is_consumer()
const ETL_OVERRIDE
2222 typename T1,
typename T2,
typename T3,
typename T4>
2223 class message_router<
TDerived,
T1,
T2,
T3,
T4,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void>
2257 using etl::imessage_router::receive;
2261 const size_t id =
msg.get_message_id();
2284 template <
typename TMessage>
2291 template <
typename TMessage>
2307 using imessage_router::accepts;
2313 case T1::ID:
case T2::ID:
case T3::ID:
case T4::ID:
2330 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
2336 bool is_producer()
const ETL_OVERRIDE
2342 bool is_consumer()
const ETL_OVERRIDE
2352 typename T1,
typename T2,
typename T3>
2353 class message_router<
TDerived,
T1,
T2,
T3,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void>
2387 using etl::imessage_router::receive;
2391 const size_t id =
msg.get_message_id();
2413 template <
typename TMessage>
2420 template <
typename TMessage>
2436 using imessage_router::accepts;
2442 case T1::ID:
case T2::ID:
case T3::ID:
2459 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
2465 bool is_producer()
const ETL_OVERRIDE
2471 bool is_consumer()
const ETL_OVERRIDE
2481 typename T1,
typename T2>
2482 class message_router<
TDerived,
T1,
T2,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void>
2516 using etl::imessage_router::receive;
2520 const size_t id =
msg.get_message_id();
2541 template <
typename TMessage>
2548 template <
typename TMessage>
2564 using imessage_router::accepts;
2570 case T1::ID:
case T2::ID:
2587 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
2593 bool is_producer()
const ETL_OVERRIDE
2599 bool is_consumer()
const ETL_OVERRIDE
2610 class message_router<
TDerived,
T1,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void,
void>
2644 using etl::imessage_router::receive;
2648 const size_t id =
msg.get_message_id();
2668 template <
typename TMessage>
2675 template <
typename TMessage>
2691 using imessage_router::accepts;
2714 ETL_DEPRECATED
bool is_null_router()
const ETL_OVERRIDE
2720 bool is_producer()
const ETL_OVERRIDE
2726 bool is_consumer()
const ETL_OVERRIDE
This is the base of all message routers.
Definition message_router_generator.h:121
Definition message_packet.h:393
Base exception class for message router.
Definition message_router_generator.h:88
Router id is out of the legal range.
Definition message_router_generator.h:101
Definition message_router.h:558
Definition shared_message.h:49
ETL_NODISCARD etl::imessage & get_message()
Get a reference to the contained message.
Definition shared_message.h:189
Adds successor traits to a class.
Definition successor.h:73
bool has_successor() const
Does this have a successor?
Definition successor.h:184
successor_type & get_successor() const
Definition successor.h:174
successor()
Default constructor.
Definition successor.h:81
#define ETL_ASSERT(b, e)
Definition error_handler.h:356
ETL_CONSTEXPR exception(string_type reason_, string_type, numeric_type line_)
Constructor.
Definition exception.h:69
Definition exception.h:47
bitset_ext
Definition absolute.h:38
etl::imessage_router & get_null_message_router()
null message router functionality.
Definition message_router_generator.h:272
uint_least8_t message_id_t
Allow alternative type for message id.
Definition message_types.h:40
Definition type_traits_generator.h:844
Is T ultimately derived from etl::imessage?
Definition message.h:208
pair holds two objects of arbitrary type
Definition utility.h:164