Stefan Scholz / ETL
Committer:
bobbery
Date:
Fri Mar 16 16:34:18 2018 +0000
Revision:
0:b47c2a7920c2
Works after using gcc_generic undef CAPACITY and replacing nullptr by std::nullptr

Who changed what in which revision?

UserRevisionLine numberNew contents of line
bobbery 0:b47c2a7920c2 1 /******************************************************************************
bobbery 0:b47c2a7920c2 2 The MIT License(MIT)
bobbery 0:b47c2a7920c2 3
bobbery 0:b47c2a7920c2 4 Embedded Template Library.
bobbery 0:b47c2a7920c2 5 https://github.com/ETLCPP/etl
bobbery 0:b47c2a7920c2 6 https://www.etlcpp.com
bobbery 0:b47c2a7920c2 7
bobbery 0:b47c2a7920c2 8 Copyright(c) 2017 jwellbelove
bobbery 0:b47c2a7920c2 9
bobbery 0:b47c2a7920c2 10 Permission is hereby granted, free of charge, to any person obtaining a copy
bobbery 0:b47c2a7920c2 11 of this software and associated documentation files(the "Software"), to deal
bobbery 0:b47c2a7920c2 12 in the Software without restriction, including without limitation the rights
bobbery 0:b47c2a7920c2 13 to use, copy, modify, merge, publish, distribute, sublicense, and / or sell
bobbery 0:b47c2a7920c2 14 copies of the Software, and to permit persons to whom the Software is
bobbery 0:b47c2a7920c2 15 furnished to do so, subject to the following conditions :
bobbery 0:b47c2a7920c2 16
bobbery 0:b47c2a7920c2 17 The above copyright notice and this permission notice shall be included in all
bobbery 0:b47c2a7920c2 18 copies or substantial portions of the Software.
bobbery 0:b47c2a7920c2 19
bobbery 0:b47c2a7920c2 20 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
bobbery 0:b47c2a7920c2 21 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
bobbery 0:b47c2a7920c2 22 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.IN NO EVENT SHALL THE
bobbery 0:b47c2a7920c2 23 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
bobbery 0:b47c2a7920c2 24 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
bobbery 0:b47c2a7920c2 25 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
bobbery 0:b47c2a7920c2 26 SOFTWARE.
bobbery 0:b47c2a7920c2 27 ******************************************************************************/
bobbery 0:b47c2a7920c2 28
bobbery 0:b47c2a7920c2 29 #if 0
bobbery 0:b47c2a7920c2 30 #error THIS HEADER IS A GENERATOR. DO NOT INCLUDE.
bobbery 0:b47c2a7920c2 31 #endif
bobbery 0:b47c2a7920c2 32
bobbery 0:b47c2a7920c2 33 //***************************************************************************
bobbery 0:b47c2a7920c2 34 // This file has been auto generated. Do not edit this file.
bobbery 0:b47c2a7920c2 35 //***************************************************************************
bobbery 0:b47c2a7920c2 36
bobbery 0:b47c2a7920c2 37 //***************************************************************************
bobbery 0:b47c2a7920c2 38 // To generate to header file, run this at the command line.
bobbery 0:b47c2a7920c2 39 // Note: You will need Python and COG installed.
bobbery 0:b47c2a7920c2 40 //
bobbery 0:b47c2a7920c2 41 // python -m cogapp -d -e -omessage_router.h -DHandlers=<n> message_router_generator.h
bobbery 0:b47c2a7920c2 42 // Where <n> is the number of messages to support.
bobbery 0:b47c2a7920c2 43 //
bobbery 0:b47c2a7920c2 44 // e.g.
bobbery 0:b47c2a7920c2 45 // To generate handlers for up to 16 messages...
bobbery 0:b47c2a7920c2 46 // python -m cogapp -d -e -omessage_router.h -DHandlers=16 message_router_generator.h
bobbery 0:b47c2a7920c2 47 //
bobbery 0:b47c2a7920c2 48 // See generate.bat
bobbery 0:b47c2a7920c2 49 //***************************************************************************
bobbery 0:b47c2a7920c2 50
bobbery 0:b47c2a7920c2 51 #ifndef __ETL_MESSAGE_ROUTER__
bobbery 0:b47c2a7920c2 52 #define __ETL_MESSAGE_ROUTER__
bobbery 0:b47c2a7920c2 53
bobbery 0:b47c2a7920c2 54 #include <stdint.h>
bobbery 0:b47c2a7920c2 55
bobbery 0:b47c2a7920c2 56 #include "platform.h"
bobbery 0:b47c2a7920c2 57 #include "message.h"
bobbery 0:b47c2a7920c2 58 #include "message_types.h"
bobbery 0:b47c2a7920c2 59 #include "alignment.h"
bobbery 0:b47c2a7920c2 60 #include "error_handler.h"
bobbery 0:b47c2a7920c2 61 #include "exception.h"
bobbery 0:b47c2a7920c2 62 #include "largest.h"
bobbery 0:b47c2a7920c2 63 #include "nullptr.h"
bobbery 0:b47c2a7920c2 64
bobbery 0:b47c2a7920c2 65 #undef ETL_FILE
bobbery 0:b47c2a7920c2 66 #define ETL_FILE "35"
bobbery 0:b47c2a7920c2 67
bobbery 0:b47c2a7920c2 68 namespace etl
bobbery 0:b47c2a7920c2 69 {
bobbery 0:b47c2a7920c2 70 //***************************************************************************
bobbery 0:b47c2a7920c2 71 /// Base exception class for message router
bobbery 0:b47c2a7920c2 72 //***************************************************************************
bobbery 0:b47c2a7920c2 73 class message_router_exception : public etl::exception
bobbery 0:b47c2a7920c2 74 {
bobbery 0:b47c2a7920c2 75 public:
bobbery 0:b47c2a7920c2 76
bobbery 0:b47c2a7920c2 77 message_router_exception(string_type reason_, string_type file_name_, numeric_type line_number_)
bobbery 0:b47c2a7920c2 78 : etl::exception(reason_, file_name_, line_number_)
bobbery 0:b47c2a7920c2 79 {
bobbery 0:b47c2a7920c2 80 }
bobbery 0:b47c2a7920c2 81 };
bobbery 0:b47c2a7920c2 82
bobbery 0:b47c2a7920c2 83 //***************************************************************************
bobbery 0:b47c2a7920c2 84 /// Router id is out of the legal range.
bobbery 0:b47c2a7920c2 85 //***************************************************************************
bobbery 0:b47c2a7920c2 86 class message_router_illegal_id : public etl::message_router_exception
bobbery 0:b47c2a7920c2 87 {
bobbery 0:b47c2a7920c2 88 public:
bobbery 0:b47c2a7920c2 89
bobbery 0:b47c2a7920c2 90 message_router_illegal_id(string_type file_name_, numeric_type line_number_)
bobbery 0:b47c2a7920c2 91 : message_router_exception(ETL_ERROR_TEXT("message router:illegal id", ETL_FILE"A"), file_name_, line_number_)
bobbery 0:b47c2a7920c2 92 {
bobbery 0:b47c2a7920c2 93 }
bobbery 0:b47c2a7920c2 94 };
bobbery 0:b47c2a7920c2 95
bobbery 0:b47c2a7920c2 96 //***************************************************************************
bobbery 0:b47c2a7920c2 97 class imessage_router
bobbery 0:b47c2a7920c2 98 {
bobbery 0:b47c2a7920c2 99 public:
bobbery 0:b47c2a7920c2 100
bobbery 0:b47c2a7920c2 101 virtual ~imessage_router() {}
bobbery 0:b47c2a7920c2 102 virtual void receive(const etl::imessage& message) = 0;
bobbery 0:b47c2a7920c2 103 virtual void receive(imessage_router& source, const etl::imessage& message) = 0;
bobbery 0:b47c2a7920c2 104 virtual bool accepts(etl::message_id_t id) const = 0;
bobbery 0:b47c2a7920c2 105
bobbery 0:b47c2a7920c2 106 //********************************************
bobbery 0:b47c2a7920c2 107 bool accepts(const etl::imessage& msg) const
bobbery 0:b47c2a7920c2 108 {
bobbery 0:b47c2a7920c2 109 return accepts(msg.message_id);
bobbery 0:b47c2a7920c2 110 }
bobbery 0:b47c2a7920c2 111
bobbery 0:b47c2a7920c2 112 //********************************************
bobbery 0:b47c2a7920c2 113 etl::message_router_id_t get_message_router_id() const
bobbery 0:b47c2a7920c2 114 {
bobbery 0:b47c2a7920c2 115 return message_router_id;
bobbery 0:b47c2a7920c2 116 }
bobbery 0:b47c2a7920c2 117
bobbery 0:b47c2a7920c2 118 //********************************************
bobbery 0:b47c2a7920c2 119 bool is_null_router() const
bobbery 0:b47c2a7920c2 120 {
bobbery 0:b47c2a7920c2 121 return (message_router_id == NULL_MESSAGE_ROUTER);
bobbery 0:b47c2a7920c2 122 }
bobbery 0:b47c2a7920c2 123
bobbery 0:b47c2a7920c2 124 //********************************************
bobbery 0:b47c2a7920c2 125 bool is_bus() const
bobbery 0:b47c2a7920c2 126 {
bobbery 0:b47c2a7920c2 127 return (message_router_id == MESSAGE_BUS);
bobbery 0:b47c2a7920c2 128 }
bobbery 0:b47c2a7920c2 129
bobbery 0:b47c2a7920c2 130 //********************************************
bobbery 0:b47c2a7920c2 131 void set_successor(imessage_router& successor_)
bobbery 0:b47c2a7920c2 132 {
bobbery 0:b47c2a7920c2 133 successor = &successor_;
bobbery 0:b47c2a7920c2 134 }
bobbery 0:b47c2a7920c2 135
bobbery 0:b47c2a7920c2 136 //********************************************
bobbery 0:b47c2a7920c2 137 imessage_router& get_successor() const
bobbery 0:b47c2a7920c2 138 {
bobbery 0:b47c2a7920c2 139 return *successor;
bobbery 0:b47c2a7920c2 140 }
bobbery 0:b47c2a7920c2 141
bobbery 0:b47c2a7920c2 142 //********************************************
bobbery 0:b47c2a7920c2 143 bool has_successor() const
bobbery 0:b47c2a7920c2 144 {
bobbery 0:b47c2a7920c2 145 return (successor != nullptr);
bobbery 0:b47c2a7920c2 146 }
bobbery 0:b47c2a7920c2 147
bobbery 0:b47c2a7920c2 148 enum
bobbery 0:b47c2a7920c2 149 {
bobbery 0:b47c2a7920c2 150 NULL_MESSAGE_ROUTER = 255,
bobbery 0:b47c2a7920c2 151 MESSAGE_BUS = 254,
bobbery 0:b47c2a7920c2 152 ALL_MESSAGE_ROUTERS = 253,
bobbery 0:b47c2a7920c2 153 MAX_MESSAGE_ROUTER = 249
bobbery 0:b47c2a7920c2 154 };
bobbery 0:b47c2a7920c2 155
bobbery 0:b47c2a7920c2 156 protected:
bobbery 0:b47c2a7920c2 157
bobbery 0:b47c2a7920c2 158 imessage_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 159 : successor(nullptr),
bobbery 0:b47c2a7920c2 160 message_router_id(id_)
bobbery 0:b47c2a7920c2 161 {
bobbery 0:b47c2a7920c2 162 }
bobbery 0:b47c2a7920c2 163
bobbery 0:b47c2a7920c2 164 imessage_router(etl::message_router_id_t id_,
bobbery 0:b47c2a7920c2 165 imessage_router& successor_)
bobbery 0:b47c2a7920c2 166 : successor(&successor_),
bobbery 0:b47c2a7920c2 167 message_router_id(id_)
bobbery 0:b47c2a7920c2 168 {
bobbery 0:b47c2a7920c2 169 }
bobbery 0:b47c2a7920c2 170
bobbery 0:b47c2a7920c2 171 private:
bobbery 0:b47c2a7920c2 172
bobbery 0:b47c2a7920c2 173 // Disabled.
bobbery 0:b47c2a7920c2 174 imessage_router(const imessage_router&);
bobbery 0:b47c2a7920c2 175 imessage_router& operator =(const imessage_router&);
bobbery 0:b47c2a7920c2 176
bobbery 0:b47c2a7920c2 177 etl::imessage_router* successor;
bobbery 0:b47c2a7920c2 178
bobbery 0:b47c2a7920c2 179 etl::message_router_id_t message_router_id;
bobbery 0:b47c2a7920c2 180 };
bobbery 0:b47c2a7920c2 181
bobbery 0:b47c2a7920c2 182 //***************************************************************************
bobbery 0:b47c2a7920c2 183 /// This router can be used either as a sink for messages
bobbery 0:b47c2a7920c2 184 /// or as a producer-only of messages such an interrupt routine.
bobbery 0:b47c2a7920c2 185 //***************************************************************************
bobbery 0:b47c2a7920c2 186 class null_message_router : public imessage_router
bobbery 0:b47c2a7920c2 187 {
bobbery 0:b47c2a7920c2 188 public:
bobbery 0:b47c2a7920c2 189
bobbery 0:b47c2a7920c2 190 null_message_router()
bobbery 0:b47c2a7920c2 191 : imessage_router(imessage_router::NULL_MESSAGE_ROUTER)
bobbery 0:b47c2a7920c2 192 {
bobbery 0:b47c2a7920c2 193 }
bobbery 0:b47c2a7920c2 194
bobbery 0:b47c2a7920c2 195 //********************************************
bobbery 0:b47c2a7920c2 196 void receive(const etl::imessage&)
bobbery 0:b47c2a7920c2 197 {
bobbery 0:b47c2a7920c2 198 }
bobbery 0:b47c2a7920c2 199
bobbery 0:b47c2a7920c2 200 //********************************************
bobbery 0:b47c2a7920c2 201 void receive(etl::imessage_router&, const etl::imessage&)
bobbery 0:b47c2a7920c2 202 {
bobbery 0:b47c2a7920c2 203 }
bobbery 0:b47c2a7920c2 204
bobbery 0:b47c2a7920c2 205 //********************************************
bobbery 0:b47c2a7920c2 206 bool accepts(etl::message_id_t) const
bobbery 0:b47c2a7920c2 207 {
bobbery 0:b47c2a7920c2 208 return false;
bobbery 0:b47c2a7920c2 209 }
bobbery 0:b47c2a7920c2 210
bobbery 0:b47c2a7920c2 211 //********************************************
bobbery 0:b47c2a7920c2 212 static null_message_router& instance()
bobbery 0:b47c2a7920c2 213 {
bobbery 0:b47c2a7920c2 214 static null_message_router nmr;
bobbery 0:b47c2a7920c2 215 return nmr;
bobbery 0:b47c2a7920c2 216 }
bobbery 0:b47c2a7920c2 217 };
bobbery 0:b47c2a7920c2 218
bobbery 0:b47c2a7920c2 219 //***************************************************************************
bobbery 0:b47c2a7920c2 220 /// Send a message to a router.
bobbery 0:b47c2a7920c2 221 /// Sets the 'sender' to etl::null_message_router type.
bobbery 0:b47c2a7920c2 222 //***************************************************************************
bobbery 0:b47c2a7920c2 223 inline static void send_message(etl::imessage_router& destination,
bobbery 0:b47c2a7920c2 224 const etl::imessage& message)
bobbery 0:b47c2a7920c2 225 {
bobbery 0:b47c2a7920c2 226 destination.receive(message);
bobbery 0:b47c2a7920c2 227 }
bobbery 0:b47c2a7920c2 228
bobbery 0:b47c2a7920c2 229 //***************************************************************************
bobbery 0:b47c2a7920c2 230 /// Send a message to a router.
bobbery 0:b47c2a7920c2 231 //***************************************************************************
bobbery 0:b47c2a7920c2 232 inline static void send_message(etl::imessage_router& source,
bobbery 0:b47c2a7920c2 233 etl::imessage_router& destination,
bobbery 0:b47c2a7920c2 234 const etl::imessage& message)
bobbery 0:b47c2a7920c2 235 {
bobbery 0:b47c2a7920c2 236 destination.receive(source, message);
bobbery 0:b47c2a7920c2 237 }
bobbery 0:b47c2a7920c2 238
bobbery 0:b47c2a7920c2 239 //***************************************************************************
bobbery 0:b47c2a7920c2 240 // The definition for all 16 message types.
bobbery 0:b47c2a7920c2 241 //***************************************************************************
bobbery 0:b47c2a7920c2 242 template <typename TDerived,
bobbery 0:b47c2a7920c2 243 typename T1, typename T2 = void, typename T3 = void, typename T4 = void,
bobbery 0:b47c2a7920c2 244 typename T5 = void, typename T6 = void, typename T7 = void, typename T8 = void,
bobbery 0:b47c2a7920c2 245 typename T9 = void, typename T10 = void, typename T11 = void, typename T12 = void,
bobbery 0:b47c2a7920c2 246 typename T13 = void, typename T14 = void, typename T15 = void, typename T16 = void>
bobbery 0:b47c2a7920c2 247 class message_router : public imessage_router
bobbery 0:b47c2a7920c2 248 {
bobbery 0:b47c2a7920c2 249 public:
bobbery 0:b47c2a7920c2 250
bobbery 0:b47c2a7920c2 251 //**********************************************
bobbery 0:b47c2a7920c2 252 class message_packet
bobbery 0:b47c2a7920c2 253 {
bobbery 0:b47c2a7920c2 254 public:
bobbery 0:b47c2a7920c2 255
bobbery 0:b47c2a7920c2 256 //********************************************
bobbery 0:b47c2a7920c2 257 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 258 {
bobbery 0:b47c2a7920c2 259 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 260
bobbery 0:b47c2a7920c2 261 void* p = data;
bobbery 0:b47c2a7920c2 262
bobbery 0:b47c2a7920c2 263 switch (id)
bobbery 0:b47c2a7920c2 264 {
bobbery 0:b47c2a7920c2 265 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 266 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 267 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 268 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 269 case T5::ID: ::new (p) T5(static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 270 case T6::ID: ::new (p) T6(static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 271 case T7::ID: ::new (p) T7(static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 272 case T8::ID: ::new (p) T8(static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 273 case T9::ID: ::new (p) T9(static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 274 case T10::ID: ::new (p) T10(static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 275 case T11::ID: ::new (p) T11(static_cast<const T11&>(msg)); break;
bobbery 0:b47c2a7920c2 276 case T12::ID: ::new (p) T12(static_cast<const T12&>(msg)); break;
bobbery 0:b47c2a7920c2 277 case T13::ID: ::new (p) T13(static_cast<const T13&>(msg)); break;
bobbery 0:b47c2a7920c2 278 case T14::ID: ::new (p) T14(static_cast<const T14&>(msg)); break;
bobbery 0:b47c2a7920c2 279 case T15::ID: ::new (p) T15(static_cast<const T15&>(msg)); break;
bobbery 0:b47c2a7920c2 280 case T16::ID: ::new (p) T16(static_cast<const T16&>(msg)); break;
bobbery 0:b47c2a7920c2 281 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 282 }
bobbery 0:b47c2a7920c2 283 }
bobbery 0:b47c2a7920c2 284
bobbery 0:b47c2a7920c2 285 //********************************************
bobbery 0:b47c2a7920c2 286 template <typename T>
bobbery 0:b47c2a7920c2 287 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 288 {
bobbery 0:b47c2a7920c2 289 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 290
bobbery 0:b47c2a7920c2 291 void* p = data;
bobbery 0:b47c2a7920c2 292 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 293 }
bobbery 0:b47c2a7920c2 294
bobbery 0:b47c2a7920c2 295 //********************************************
bobbery 0:b47c2a7920c2 296 ~message_packet()
bobbery 0:b47c2a7920c2 297 {
bobbery 0:b47c2a7920c2 298 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 299 }
bobbery 0:b47c2a7920c2 300
bobbery 0:b47c2a7920c2 301 //********************************************
bobbery 0:b47c2a7920c2 302 etl::imessage& get()
bobbery 0:b47c2a7920c2 303 {
bobbery 0:b47c2a7920c2 304 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 305 }
bobbery 0:b47c2a7920c2 306
bobbery 0:b47c2a7920c2 307 //********************************************
bobbery 0:b47c2a7920c2 308 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 309 {
bobbery 0:b47c2a7920c2 310 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 311 }
bobbery 0:b47c2a7920c2 312
bobbery 0:b47c2a7920c2 313 enum
bobbery 0:b47c2a7920c2 314 {
bobbery 0:b47c2a7920c2 315 SIZE = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>::size,
bobbery 0:b47c2a7920c2 316 ALIGNMENT = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>::alignment
bobbery 0:b47c2a7920c2 317 };
bobbery 0:b47c2a7920c2 318
bobbery 0:b47c2a7920c2 319 private:
bobbery 0:b47c2a7920c2 320
bobbery 0:b47c2a7920c2 321 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 322 };
bobbery 0:b47c2a7920c2 323
bobbery 0:b47c2a7920c2 324 //**********************************************
bobbery 0:b47c2a7920c2 325 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 326 : imessage_router(id_)
bobbery 0:b47c2a7920c2 327 {
bobbery 0:b47c2a7920c2 328 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 329 }
bobbery 0:b47c2a7920c2 330
bobbery 0:b47c2a7920c2 331 //**********************************************
bobbery 0:b47c2a7920c2 332 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 333 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 334 {
bobbery 0:b47c2a7920c2 335 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 336 }
bobbery 0:b47c2a7920c2 337
bobbery 0:b47c2a7920c2 338 //**********************************************
bobbery 0:b47c2a7920c2 339 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 340 {
bobbery 0:b47c2a7920c2 341 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 342 }
bobbery 0:b47c2a7920c2 343
bobbery 0:b47c2a7920c2 344 //**********************************************
bobbery 0:b47c2a7920c2 345 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 346 {
bobbery 0:b47c2a7920c2 347 const etl::message_id_t id = msg.message_id;
bobbery 0:b47c2a7920c2 348
bobbery 0:b47c2a7920c2 349 switch (id)
bobbery 0:b47c2a7920c2 350 {
bobbery 0:b47c2a7920c2 351 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 352 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 353 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 354 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 355 case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 356 case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 357 case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 358 case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 359 case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 360 case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 361 case T11::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T11&>(msg)); break;
bobbery 0:b47c2a7920c2 362 case T12::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T12&>(msg)); break;
bobbery 0:b47c2a7920c2 363 case T13::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T13&>(msg)); break;
bobbery 0:b47c2a7920c2 364 case T14::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T14&>(msg)); break;
bobbery 0:b47c2a7920c2 365 case T15::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T15&>(msg)); break;
bobbery 0:b47c2a7920c2 366 case T16::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T16&>(msg)); break;
bobbery 0:b47c2a7920c2 367 default:
bobbery 0:b47c2a7920c2 368 {
bobbery 0:b47c2a7920c2 369 if (has_successor())
bobbery 0:b47c2a7920c2 370 {
bobbery 0:b47c2a7920c2 371 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 372 }
bobbery 0:b47c2a7920c2 373 else
bobbery 0:b47c2a7920c2 374 {
bobbery 0:b47c2a7920c2 375 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 376 }
bobbery 0:b47c2a7920c2 377 break;
bobbery 0:b47c2a7920c2 378 }
bobbery 0:b47c2a7920c2 379 }
bobbery 0:b47c2a7920c2 380 }
bobbery 0:b47c2a7920c2 381
bobbery 0:b47c2a7920c2 382 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 383
bobbery 0:b47c2a7920c2 384 //**********************************************
bobbery 0:b47c2a7920c2 385 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 386 {
bobbery 0:b47c2a7920c2 387 switch (id)
bobbery 0:b47c2a7920c2 388 {
bobbery 0:b47c2a7920c2 389 case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
bobbery 0:b47c2a7920c2 390 case T9::ID: case T10::ID: case T11::ID: case T12::ID: case T13::ID: case T14::ID: case T15::ID: case T16::ID:
bobbery 0:b47c2a7920c2 391 return true; break;
bobbery 0:b47c2a7920c2 392 default:
bobbery 0:b47c2a7920c2 393 return false; break;
bobbery 0:b47c2a7920c2 394 }
bobbery 0:b47c2a7920c2 395 }
bobbery 0:b47c2a7920c2 396 };
bobbery 0:b47c2a7920c2 397
bobbery 0:b47c2a7920c2 398 //***************************************************************************
bobbery 0:b47c2a7920c2 399 // Specialisation for 15 message types.
bobbery 0:b47c2a7920c2 400 //***************************************************************************
bobbery 0:b47c2a7920c2 401 template <typename TDerived,
bobbery 0:b47c2a7920c2 402 typename T1, typename T2, typename T3, typename T4,
bobbery 0:b47c2a7920c2 403 typename T5, typename T6, typename T7, typename T8,
bobbery 0:b47c2a7920c2 404 typename T9, typename T10, typename T11, typename T12,
bobbery 0:b47c2a7920c2 405 typename T13, typename T14, typename T15>
bobbery 0:b47c2a7920c2 406 class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, void>
bobbery 0:b47c2a7920c2 407 : public imessage_router
bobbery 0:b47c2a7920c2 408 {
bobbery 0:b47c2a7920c2 409 public:
bobbery 0:b47c2a7920c2 410
bobbery 0:b47c2a7920c2 411 //**********************************************
bobbery 0:b47c2a7920c2 412 class message_packet
bobbery 0:b47c2a7920c2 413 {
bobbery 0:b47c2a7920c2 414 public:
bobbery 0:b47c2a7920c2 415
bobbery 0:b47c2a7920c2 416 //********************************************
bobbery 0:b47c2a7920c2 417 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 418 {
bobbery 0:b47c2a7920c2 419 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 420
bobbery 0:b47c2a7920c2 421 void* p = data;
bobbery 0:b47c2a7920c2 422
bobbery 0:b47c2a7920c2 423 switch (id)
bobbery 0:b47c2a7920c2 424 {
bobbery 0:b47c2a7920c2 425 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 426 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 427 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 428 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 429 case T5::ID: ::new (p) T5(static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 430 case T6::ID: ::new (p) T6(static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 431 case T7::ID: ::new (p) T7(static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 432 case T8::ID: ::new (p) T8(static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 433 case T9::ID: ::new (p) T9(static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 434 case T10::ID: ::new (p) T10(static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 435 case T11::ID: ::new (p) T11(static_cast<const T11&>(msg)); break;
bobbery 0:b47c2a7920c2 436 case T12::ID: ::new (p) T12(static_cast<const T12&>(msg)); break;
bobbery 0:b47c2a7920c2 437 case T13::ID: ::new (p) T13(static_cast<const T13&>(msg)); break;
bobbery 0:b47c2a7920c2 438 case T14::ID: ::new (p) T14(static_cast<const T14&>(msg)); break;
bobbery 0:b47c2a7920c2 439 case T15::ID: ::new (p) T15(static_cast<const T15&>(msg)); break;
bobbery 0:b47c2a7920c2 440 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 441 }
bobbery 0:b47c2a7920c2 442 }
bobbery 0:b47c2a7920c2 443
bobbery 0:b47c2a7920c2 444 //********************************************
bobbery 0:b47c2a7920c2 445 template <typename T>
bobbery 0:b47c2a7920c2 446 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 447 {
bobbery 0:b47c2a7920c2 448 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 449
bobbery 0:b47c2a7920c2 450 void* p = data;
bobbery 0:b47c2a7920c2 451 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 452 }
bobbery 0:b47c2a7920c2 453
bobbery 0:b47c2a7920c2 454 //********************************************
bobbery 0:b47c2a7920c2 455 ~message_packet()
bobbery 0:b47c2a7920c2 456 {
bobbery 0:b47c2a7920c2 457 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 458 }
bobbery 0:b47c2a7920c2 459
bobbery 0:b47c2a7920c2 460 //********************************************
bobbery 0:b47c2a7920c2 461 etl::imessage& get()
bobbery 0:b47c2a7920c2 462 {
bobbery 0:b47c2a7920c2 463 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 464 }
bobbery 0:b47c2a7920c2 465
bobbery 0:b47c2a7920c2 466 //********************************************
bobbery 0:b47c2a7920c2 467 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 468 {
bobbery 0:b47c2a7920c2 469 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 470 }
bobbery 0:b47c2a7920c2 471
bobbery 0:b47c2a7920c2 472 enum
bobbery 0:b47c2a7920c2 473 {
bobbery 0:b47c2a7920c2 474 SIZE = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::size,
bobbery 0:b47c2a7920c2 475 ALIGNMENT = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>::alignment
bobbery 0:b47c2a7920c2 476 };
bobbery 0:b47c2a7920c2 477
bobbery 0:b47c2a7920c2 478 private:
bobbery 0:b47c2a7920c2 479
bobbery 0:b47c2a7920c2 480 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 481 };
bobbery 0:b47c2a7920c2 482
bobbery 0:b47c2a7920c2 483 //**********************************************
bobbery 0:b47c2a7920c2 484 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 485 : imessage_router(id_)
bobbery 0:b47c2a7920c2 486 {
bobbery 0:b47c2a7920c2 487 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 488 }
bobbery 0:b47c2a7920c2 489
bobbery 0:b47c2a7920c2 490 //**********************************************
bobbery 0:b47c2a7920c2 491 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 492 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 493 {
bobbery 0:b47c2a7920c2 494 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 495 }
bobbery 0:b47c2a7920c2 496
bobbery 0:b47c2a7920c2 497 //**********************************************
bobbery 0:b47c2a7920c2 498 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 499 {
bobbery 0:b47c2a7920c2 500 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 501 }
bobbery 0:b47c2a7920c2 502
bobbery 0:b47c2a7920c2 503 //**********************************************
bobbery 0:b47c2a7920c2 504 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 505 {
bobbery 0:b47c2a7920c2 506 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 507
bobbery 0:b47c2a7920c2 508 switch (id)
bobbery 0:b47c2a7920c2 509 {
bobbery 0:b47c2a7920c2 510 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 511 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 512 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 513 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 514 case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 515 case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 516 case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 517 case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 518 case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 519 case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 520 case T11::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T11&>(msg)); break;
bobbery 0:b47c2a7920c2 521 case T12::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T12&>(msg)); break;
bobbery 0:b47c2a7920c2 522 case T13::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T13&>(msg)); break;
bobbery 0:b47c2a7920c2 523 case T14::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T14&>(msg)); break;
bobbery 0:b47c2a7920c2 524 case T15::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T15&>(msg)); break;
bobbery 0:b47c2a7920c2 525 default:
bobbery 0:b47c2a7920c2 526 {
bobbery 0:b47c2a7920c2 527 if (has_successor())
bobbery 0:b47c2a7920c2 528 {
bobbery 0:b47c2a7920c2 529 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 530 }
bobbery 0:b47c2a7920c2 531 else
bobbery 0:b47c2a7920c2 532 {
bobbery 0:b47c2a7920c2 533 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 534 }
bobbery 0:b47c2a7920c2 535 break;
bobbery 0:b47c2a7920c2 536 }
bobbery 0:b47c2a7920c2 537 }
bobbery 0:b47c2a7920c2 538 }
bobbery 0:b47c2a7920c2 539
bobbery 0:b47c2a7920c2 540 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 541
bobbery 0:b47c2a7920c2 542 //**********************************************
bobbery 0:b47c2a7920c2 543 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 544 {
bobbery 0:b47c2a7920c2 545 switch (id)
bobbery 0:b47c2a7920c2 546 {
bobbery 0:b47c2a7920c2 547 case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
bobbery 0:b47c2a7920c2 548 case T9::ID: case T10::ID: case T11::ID: case T12::ID: case T13::ID: case T14::ID: case T15::ID:
bobbery 0:b47c2a7920c2 549 return true; break;
bobbery 0:b47c2a7920c2 550 default:
bobbery 0:b47c2a7920c2 551 return false; break;
bobbery 0:b47c2a7920c2 552 }
bobbery 0:b47c2a7920c2 553 }
bobbery 0:b47c2a7920c2 554 };
bobbery 0:b47c2a7920c2 555
bobbery 0:b47c2a7920c2 556 //***************************************************************************
bobbery 0:b47c2a7920c2 557 // Specialisation for 14 message types.
bobbery 0:b47c2a7920c2 558 //***************************************************************************
bobbery 0:b47c2a7920c2 559 template <typename TDerived,
bobbery 0:b47c2a7920c2 560 typename T1, typename T2, typename T3, typename T4,
bobbery 0:b47c2a7920c2 561 typename T5, typename T6, typename T7, typename T8,
bobbery 0:b47c2a7920c2 562 typename T9, typename T10, typename T11, typename T12,
bobbery 0:b47c2a7920c2 563 typename T13, typename T14>
bobbery 0:b47c2a7920c2 564 class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, void, void>
bobbery 0:b47c2a7920c2 565 : public imessage_router
bobbery 0:b47c2a7920c2 566 {
bobbery 0:b47c2a7920c2 567 public:
bobbery 0:b47c2a7920c2 568
bobbery 0:b47c2a7920c2 569 //**********************************************
bobbery 0:b47c2a7920c2 570 class message_packet
bobbery 0:b47c2a7920c2 571 {
bobbery 0:b47c2a7920c2 572 public:
bobbery 0:b47c2a7920c2 573
bobbery 0:b47c2a7920c2 574 //********************************************
bobbery 0:b47c2a7920c2 575 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 576 {
bobbery 0:b47c2a7920c2 577 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 578
bobbery 0:b47c2a7920c2 579 void* p = data;
bobbery 0:b47c2a7920c2 580
bobbery 0:b47c2a7920c2 581 switch (id)
bobbery 0:b47c2a7920c2 582 {
bobbery 0:b47c2a7920c2 583 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 584 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 585 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 586 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 587 case T5::ID: ::new (p) T5(static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 588 case T6::ID: ::new (p) T6(static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 589 case T7::ID: ::new (p) T7(static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 590 case T8::ID: ::new (p) T8(static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 591 case T9::ID: ::new (p) T9(static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 592 case T10::ID: ::new (p) T10(static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 593 case T11::ID: ::new (p) T11(static_cast<const T11&>(msg)); break;
bobbery 0:b47c2a7920c2 594 case T12::ID: ::new (p) T12(static_cast<const T12&>(msg)); break;
bobbery 0:b47c2a7920c2 595 case T13::ID: ::new (p) T13(static_cast<const T13&>(msg)); break;
bobbery 0:b47c2a7920c2 596 case T14::ID: ::new (p) T14(static_cast<const T14&>(msg)); break;
bobbery 0:b47c2a7920c2 597 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 598 }
bobbery 0:b47c2a7920c2 599 }
bobbery 0:b47c2a7920c2 600
bobbery 0:b47c2a7920c2 601 //********************************************
bobbery 0:b47c2a7920c2 602 template <typename T>
bobbery 0:b47c2a7920c2 603 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 604 {
bobbery 0:b47c2a7920c2 605 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 606
bobbery 0:b47c2a7920c2 607 void* p = data;
bobbery 0:b47c2a7920c2 608 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 609 }
bobbery 0:b47c2a7920c2 610
bobbery 0:b47c2a7920c2 611 //********************************************
bobbery 0:b47c2a7920c2 612 ~message_packet()
bobbery 0:b47c2a7920c2 613 {
bobbery 0:b47c2a7920c2 614 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 615 }
bobbery 0:b47c2a7920c2 616
bobbery 0:b47c2a7920c2 617 //********************************************
bobbery 0:b47c2a7920c2 618 etl::imessage& get()
bobbery 0:b47c2a7920c2 619 {
bobbery 0:b47c2a7920c2 620 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 621 }
bobbery 0:b47c2a7920c2 622
bobbery 0:b47c2a7920c2 623 //********************************************
bobbery 0:b47c2a7920c2 624 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 625 {
bobbery 0:b47c2a7920c2 626 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 627 }
bobbery 0:b47c2a7920c2 628
bobbery 0:b47c2a7920c2 629 enum
bobbery 0:b47c2a7920c2 630 {
bobbery 0:b47c2a7920c2 631 SIZE = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::size,
bobbery 0:b47c2a7920c2 632 ALIGNMENT = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>::alignment
bobbery 0:b47c2a7920c2 633 };
bobbery 0:b47c2a7920c2 634
bobbery 0:b47c2a7920c2 635 private:
bobbery 0:b47c2a7920c2 636
bobbery 0:b47c2a7920c2 637 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 638 };
bobbery 0:b47c2a7920c2 639
bobbery 0:b47c2a7920c2 640 //**********************************************
bobbery 0:b47c2a7920c2 641 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 642 : imessage_router(id_)
bobbery 0:b47c2a7920c2 643 {
bobbery 0:b47c2a7920c2 644 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 645 }
bobbery 0:b47c2a7920c2 646
bobbery 0:b47c2a7920c2 647 //**********************************************
bobbery 0:b47c2a7920c2 648 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 649 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 650 {
bobbery 0:b47c2a7920c2 651 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 652 }
bobbery 0:b47c2a7920c2 653
bobbery 0:b47c2a7920c2 654 //**********************************************
bobbery 0:b47c2a7920c2 655 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 656 {
bobbery 0:b47c2a7920c2 657 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 658 }
bobbery 0:b47c2a7920c2 659
bobbery 0:b47c2a7920c2 660 //**********************************************
bobbery 0:b47c2a7920c2 661 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 662 {
bobbery 0:b47c2a7920c2 663 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 664
bobbery 0:b47c2a7920c2 665 switch (id)
bobbery 0:b47c2a7920c2 666 {
bobbery 0:b47c2a7920c2 667 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 668 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 669 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 670 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 671 case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 672 case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 673 case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 674 case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 675 case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 676 case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 677 case T11::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T11&>(msg)); break;
bobbery 0:b47c2a7920c2 678 case T12::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T12&>(msg)); break;
bobbery 0:b47c2a7920c2 679 case T13::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T13&>(msg)); break;
bobbery 0:b47c2a7920c2 680 case T14::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T14&>(msg)); break;
bobbery 0:b47c2a7920c2 681 default:
bobbery 0:b47c2a7920c2 682 {
bobbery 0:b47c2a7920c2 683 if (has_successor())
bobbery 0:b47c2a7920c2 684 {
bobbery 0:b47c2a7920c2 685 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 686 }
bobbery 0:b47c2a7920c2 687 else
bobbery 0:b47c2a7920c2 688 {
bobbery 0:b47c2a7920c2 689 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 690 }
bobbery 0:b47c2a7920c2 691 break;
bobbery 0:b47c2a7920c2 692 }
bobbery 0:b47c2a7920c2 693 }
bobbery 0:b47c2a7920c2 694 }
bobbery 0:b47c2a7920c2 695
bobbery 0:b47c2a7920c2 696 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 697
bobbery 0:b47c2a7920c2 698 //**********************************************
bobbery 0:b47c2a7920c2 699 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 700 {
bobbery 0:b47c2a7920c2 701 switch (id)
bobbery 0:b47c2a7920c2 702 {
bobbery 0:b47c2a7920c2 703 case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
bobbery 0:b47c2a7920c2 704 case T9::ID: case T10::ID: case T11::ID: case T12::ID: case T13::ID: case T14::ID:
bobbery 0:b47c2a7920c2 705 return true; break;
bobbery 0:b47c2a7920c2 706 default:
bobbery 0:b47c2a7920c2 707 return false; break;
bobbery 0:b47c2a7920c2 708 }
bobbery 0:b47c2a7920c2 709 }
bobbery 0:b47c2a7920c2 710 };
bobbery 0:b47c2a7920c2 711
bobbery 0:b47c2a7920c2 712 //***************************************************************************
bobbery 0:b47c2a7920c2 713 // Specialisation for 13 message types.
bobbery 0:b47c2a7920c2 714 //***************************************************************************
bobbery 0:b47c2a7920c2 715 template <typename TDerived,
bobbery 0:b47c2a7920c2 716 typename T1, typename T2, typename T3, typename T4,
bobbery 0:b47c2a7920c2 717 typename T5, typename T6, typename T7, typename T8,
bobbery 0:b47c2a7920c2 718 typename T9, typename T10, typename T11, typename T12,
bobbery 0:b47c2a7920c2 719 typename T13>
bobbery 0:b47c2a7920c2 720 class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, void, void, void>
bobbery 0:b47c2a7920c2 721 : public imessage_router
bobbery 0:b47c2a7920c2 722 {
bobbery 0:b47c2a7920c2 723 public:
bobbery 0:b47c2a7920c2 724
bobbery 0:b47c2a7920c2 725 //**********************************************
bobbery 0:b47c2a7920c2 726 class message_packet
bobbery 0:b47c2a7920c2 727 {
bobbery 0:b47c2a7920c2 728 public:
bobbery 0:b47c2a7920c2 729
bobbery 0:b47c2a7920c2 730 //********************************************
bobbery 0:b47c2a7920c2 731 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 732 {
bobbery 0:b47c2a7920c2 733 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 734
bobbery 0:b47c2a7920c2 735 void* p = data;
bobbery 0:b47c2a7920c2 736
bobbery 0:b47c2a7920c2 737 switch (id)
bobbery 0:b47c2a7920c2 738 {
bobbery 0:b47c2a7920c2 739 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 740 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 741 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 742 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 743 case T5::ID: ::new (p) T5(static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 744 case T6::ID: ::new (p) T6(static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 745 case T7::ID: ::new (p) T7(static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 746 case T8::ID: ::new (p) T8(static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 747 case T9::ID: ::new (p) T9(static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 748 case T10::ID: ::new (p) T10(static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 749 case T11::ID: ::new (p) T11(static_cast<const T11&>(msg)); break;
bobbery 0:b47c2a7920c2 750 case T12::ID: ::new (p) T12(static_cast<const T12&>(msg)); break;
bobbery 0:b47c2a7920c2 751 case T13::ID: ::new (p) T13(static_cast<const T13&>(msg)); break;
bobbery 0:b47c2a7920c2 752 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 753 }
bobbery 0:b47c2a7920c2 754 }
bobbery 0:b47c2a7920c2 755
bobbery 0:b47c2a7920c2 756 //********************************************
bobbery 0:b47c2a7920c2 757 template <typename T>
bobbery 0:b47c2a7920c2 758 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 759 {
bobbery 0:b47c2a7920c2 760 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 761
bobbery 0:b47c2a7920c2 762 void* p = data;
bobbery 0:b47c2a7920c2 763 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 764 }
bobbery 0:b47c2a7920c2 765
bobbery 0:b47c2a7920c2 766 //********************************************
bobbery 0:b47c2a7920c2 767 ~message_packet()
bobbery 0:b47c2a7920c2 768 {
bobbery 0:b47c2a7920c2 769 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 770 }
bobbery 0:b47c2a7920c2 771
bobbery 0:b47c2a7920c2 772 //********************************************
bobbery 0:b47c2a7920c2 773 etl::imessage& get()
bobbery 0:b47c2a7920c2 774 {
bobbery 0:b47c2a7920c2 775 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 776 }
bobbery 0:b47c2a7920c2 777
bobbery 0:b47c2a7920c2 778 //********************************************
bobbery 0:b47c2a7920c2 779 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 780 {
bobbery 0:b47c2a7920c2 781 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 782 }
bobbery 0:b47c2a7920c2 783
bobbery 0:b47c2a7920c2 784 enum
bobbery 0:b47c2a7920c2 785 {
bobbery 0:b47c2a7920c2 786 SIZE = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::size,
bobbery 0:b47c2a7920c2 787 ALIGNMENT = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>::alignment
bobbery 0:b47c2a7920c2 788 };
bobbery 0:b47c2a7920c2 789
bobbery 0:b47c2a7920c2 790 private:
bobbery 0:b47c2a7920c2 791
bobbery 0:b47c2a7920c2 792 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 793 };
bobbery 0:b47c2a7920c2 794
bobbery 0:b47c2a7920c2 795 //**********************************************
bobbery 0:b47c2a7920c2 796 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 797 : imessage_router(id_)
bobbery 0:b47c2a7920c2 798 {
bobbery 0:b47c2a7920c2 799 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 800 }
bobbery 0:b47c2a7920c2 801
bobbery 0:b47c2a7920c2 802 //**********************************************
bobbery 0:b47c2a7920c2 803 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 804 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 805 {
bobbery 0:b47c2a7920c2 806 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 807 }
bobbery 0:b47c2a7920c2 808
bobbery 0:b47c2a7920c2 809 //**********************************************
bobbery 0:b47c2a7920c2 810 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 811 {
bobbery 0:b47c2a7920c2 812 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 813 }
bobbery 0:b47c2a7920c2 814
bobbery 0:b47c2a7920c2 815 //**********************************************
bobbery 0:b47c2a7920c2 816 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 817 {
bobbery 0:b47c2a7920c2 818 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 819
bobbery 0:b47c2a7920c2 820 switch (id)
bobbery 0:b47c2a7920c2 821 {
bobbery 0:b47c2a7920c2 822 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 823 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 824 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 825 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 826 case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 827 case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 828 case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 829 case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 830 case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 831 case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 832 case T11::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T11&>(msg)); break;
bobbery 0:b47c2a7920c2 833 case T12::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T12&>(msg)); break;
bobbery 0:b47c2a7920c2 834 case T13::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T13&>(msg)); break;
bobbery 0:b47c2a7920c2 835 default:
bobbery 0:b47c2a7920c2 836 {
bobbery 0:b47c2a7920c2 837 if (has_successor())
bobbery 0:b47c2a7920c2 838 {
bobbery 0:b47c2a7920c2 839 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 840 }
bobbery 0:b47c2a7920c2 841 else
bobbery 0:b47c2a7920c2 842 {
bobbery 0:b47c2a7920c2 843 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 844 }
bobbery 0:b47c2a7920c2 845 break;
bobbery 0:b47c2a7920c2 846 }
bobbery 0:b47c2a7920c2 847 }
bobbery 0:b47c2a7920c2 848 }
bobbery 0:b47c2a7920c2 849
bobbery 0:b47c2a7920c2 850 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 851
bobbery 0:b47c2a7920c2 852 //**********************************************
bobbery 0:b47c2a7920c2 853 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 854 {
bobbery 0:b47c2a7920c2 855 switch (id)
bobbery 0:b47c2a7920c2 856 {
bobbery 0:b47c2a7920c2 857 case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
bobbery 0:b47c2a7920c2 858 case T9::ID: case T10::ID: case T11::ID: case T12::ID: case T13::ID:
bobbery 0:b47c2a7920c2 859 return true; break;
bobbery 0:b47c2a7920c2 860 default:
bobbery 0:b47c2a7920c2 861 return false; break;
bobbery 0:b47c2a7920c2 862 }
bobbery 0:b47c2a7920c2 863 }
bobbery 0:b47c2a7920c2 864 };
bobbery 0:b47c2a7920c2 865
bobbery 0:b47c2a7920c2 866 //***************************************************************************
bobbery 0:b47c2a7920c2 867 // Specialisation for 12 message types.
bobbery 0:b47c2a7920c2 868 //***************************************************************************
bobbery 0:b47c2a7920c2 869 template <typename TDerived,
bobbery 0:b47c2a7920c2 870 typename T1, typename T2, typename T3, typename T4,
bobbery 0:b47c2a7920c2 871 typename T5, typename T6, typename T7, typename T8,
bobbery 0:b47c2a7920c2 872 typename T9, typename T10, typename T11, typename T12>
bobbery 0:b47c2a7920c2 873 class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, void, void, void, void>
bobbery 0:b47c2a7920c2 874 : public imessage_router
bobbery 0:b47c2a7920c2 875 {
bobbery 0:b47c2a7920c2 876 public:
bobbery 0:b47c2a7920c2 877
bobbery 0:b47c2a7920c2 878 //**********************************************
bobbery 0:b47c2a7920c2 879 class message_packet
bobbery 0:b47c2a7920c2 880 {
bobbery 0:b47c2a7920c2 881 public:
bobbery 0:b47c2a7920c2 882
bobbery 0:b47c2a7920c2 883 //********************************************
bobbery 0:b47c2a7920c2 884 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 885 {
bobbery 0:b47c2a7920c2 886 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 887
bobbery 0:b47c2a7920c2 888 void* p = data;
bobbery 0:b47c2a7920c2 889
bobbery 0:b47c2a7920c2 890 switch (id)
bobbery 0:b47c2a7920c2 891 {
bobbery 0:b47c2a7920c2 892 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 893 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 894 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 895 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 896 case T5::ID: ::new (p) T5(static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 897 case T6::ID: ::new (p) T6(static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 898 case T7::ID: ::new (p) T7(static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 899 case T8::ID: ::new (p) T8(static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 900 case T9::ID: ::new (p) T9(static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 901 case T10::ID: ::new (p) T10(static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 902 case T11::ID: ::new (p) T11(static_cast<const T11&>(msg)); break;
bobbery 0:b47c2a7920c2 903 case T12::ID: ::new (p) T12(static_cast<const T12&>(msg)); break;
bobbery 0:b47c2a7920c2 904 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 905 }
bobbery 0:b47c2a7920c2 906 }
bobbery 0:b47c2a7920c2 907
bobbery 0:b47c2a7920c2 908 //********************************************
bobbery 0:b47c2a7920c2 909 template <typename T>
bobbery 0:b47c2a7920c2 910 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 911 {
bobbery 0:b47c2a7920c2 912 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 913
bobbery 0:b47c2a7920c2 914 void* p = data;
bobbery 0:b47c2a7920c2 915 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 916 }
bobbery 0:b47c2a7920c2 917
bobbery 0:b47c2a7920c2 918 //********************************************
bobbery 0:b47c2a7920c2 919 ~message_packet()
bobbery 0:b47c2a7920c2 920 {
bobbery 0:b47c2a7920c2 921 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 922 }
bobbery 0:b47c2a7920c2 923
bobbery 0:b47c2a7920c2 924 //********************************************
bobbery 0:b47c2a7920c2 925 etl::imessage& get()
bobbery 0:b47c2a7920c2 926 {
bobbery 0:b47c2a7920c2 927 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 928 }
bobbery 0:b47c2a7920c2 929
bobbery 0:b47c2a7920c2 930 //********************************************
bobbery 0:b47c2a7920c2 931 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 932 {
bobbery 0:b47c2a7920c2 933 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 934 }
bobbery 0:b47c2a7920c2 935
bobbery 0:b47c2a7920c2 936 enum
bobbery 0:b47c2a7920c2 937 {
bobbery 0:b47c2a7920c2 938 SIZE = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::size,
bobbery 0:b47c2a7920c2 939 ALIGNMENT = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>::alignment
bobbery 0:b47c2a7920c2 940 };
bobbery 0:b47c2a7920c2 941
bobbery 0:b47c2a7920c2 942 private:
bobbery 0:b47c2a7920c2 943
bobbery 0:b47c2a7920c2 944 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 945 };
bobbery 0:b47c2a7920c2 946
bobbery 0:b47c2a7920c2 947 //**********************************************
bobbery 0:b47c2a7920c2 948 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 949 : imessage_router(id_)
bobbery 0:b47c2a7920c2 950 {
bobbery 0:b47c2a7920c2 951 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 952 }
bobbery 0:b47c2a7920c2 953
bobbery 0:b47c2a7920c2 954 //**********************************************
bobbery 0:b47c2a7920c2 955 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 956 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 957 {
bobbery 0:b47c2a7920c2 958 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 959 }
bobbery 0:b47c2a7920c2 960
bobbery 0:b47c2a7920c2 961 //**********************************************
bobbery 0:b47c2a7920c2 962 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 963 {
bobbery 0:b47c2a7920c2 964 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 965 }
bobbery 0:b47c2a7920c2 966
bobbery 0:b47c2a7920c2 967 //**********************************************
bobbery 0:b47c2a7920c2 968 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 969 {
bobbery 0:b47c2a7920c2 970 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 971
bobbery 0:b47c2a7920c2 972 switch (id)
bobbery 0:b47c2a7920c2 973 {
bobbery 0:b47c2a7920c2 974 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 975 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 976 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 977 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 978 case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 979 case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 980 case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 981 case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 982 case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 983 case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 984 case T11::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T11&>(msg)); break;
bobbery 0:b47c2a7920c2 985 case T12::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T12&>(msg)); break;
bobbery 0:b47c2a7920c2 986 default:
bobbery 0:b47c2a7920c2 987 {
bobbery 0:b47c2a7920c2 988 if (has_successor())
bobbery 0:b47c2a7920c2 989 {
bobbery 0:b47c2a7920c2 990 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 991 }
bobbery 0:b47c2a7920c2 992 else
bobbery 0:b47c2a7920c2 993 {
bobbery 0:b47c2a7920c2 994 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 995 }
bobbery 0:b47c2a7920c2 996 break;
bobbery 0:b47c2a7920c2 997 }
bobbery 0:b47c2a7920c2 998 }
bobbery 0:b47c2a7920c2 999 }
bobbery 0:b47c2a7920c2 1000
bobbery 0:b47c2a7920c2 1001 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 1002
bobbery 0:b47c2a7920c2 1003 //**********************************************
bobbery 0:b47c2a7920c2 1004 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 1005 {
bobbery 0:b47c2a7920c2 1006 switch (id)
bobbery 0:b47c2a7920c2 1007 {
bobbery 0:b47c2a7920c2 1008 case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
bobbery 0:b47c2a7920c2 1009 case T9::ID: case T10::ID: case T11::ID: case T12::ID:
bobbery 0:b47c2a7920c2 1010 return true; break;
bobbery 0:b47c2a7920c2 1011 default:
bobbery 0:b47c2a7920c2 1012 return false; break;
bobbery 0:b47c2a7920c2 1013 }
bobbery 0:b47c2a7920c2 1014 }
bobbery 0:b47c2a7920c2 1015 };
bobbery 0:b47c2a7920c2 1016
bobbery 0:b47c2a7920c2 1017 //***************************************************************************
bobbery 0:b47c2a7920c2 1018 // Specialisation for 11 message types.
bobbery 0:b47c2a7920c2 1019 //***************************************************************************
bobbery 0:b47c2a7920c2 1020 template <typename TDerived,
bobbery 0:b47c2a7920c2 1021 typename T1, typename T2, typename T3, typename T4,
bobbery 0:b47c2a7920c2 1022 typename T5, typename T6, typename T7, typename T8,
bobbery 0:b47c2a7920c2 1023 typename T9, typename T10, typename T11>
bobbery 0:b47c2a7920c2 1024 class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, void, void, void, void, void>
bobbery 0:b47c2a7920c2 1025 : public imessage_router
bobbery 0:b47c2a7920c2 1026 {
bobbery 0:b47c2a7920c2 1027 public:
bobbery 0:b47c2a7920c2 1028
bobbery 0:b47c2a7920c2 1029 //**********************************************
bobbery 0:b47c2a7920c2 1030 class message_packet
bobbery 0:b47c2a7920c2 1031 {
bobbery 0:b47c2a7920c2 1032 public:
bobbery 0:b47c2a7920c2 1033
bobbery 0:b47c2a7920c2 1034 //********************************************
bobbery 0:b47c2a7920c2 1035 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1036 {
bobbery 0:b47c2a7920c2 1037 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1038
bobbery 0:b47c2a7920c2 1039 void* p = data;
bobbery 0:b47c2a7920c2 1040
bobbery 0:b47c2a7920c2 1041 switch (id)
bobbery 0:b47c2a7920c2 1042 {
bobbery 0:b47c2a7920c2 1043 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1044 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1045 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1046 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1047 case T5::ID: ::new (p) T5(static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1048 case T6::ID: ::new (p) T6(static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 1049 case T7::ID: ::new (p) T7(static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 1050 case T8::ID: ::new (p) T8(static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 1051 case T9::ID: ::new (p) T9(static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 1052 case T10::ID: ::new (p) T10(static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 1053 case T11::ID: ::new (p) T11(static_cast<const T11&>(msg)); break;
bobbery 0:b47c2a7920c2 1054 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 1055 }
bobbery 0:b47c2a7920c2 1056 }
bobbery 0:b47c2a7920c2 1057
bobbery 0:b47c2a7920c2 1058 //********************************************
bobbery 0:b47c2a7920c2 1059 template <typename T>
bobbery 0:b47c2a7920c2 1060 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 1061 {
bobbery 0:b47c2a7920c2 1062 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 1063
bobbery 0:b47c2a7920c2 1064 void* p = data;
bobbery 0:b47c2a7920c2 1065 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 1066 }
bobbery 0:b47c2a7920c2 1067
bobbery 0:b47c2a7920c2 1068 //********************************************
bobbery 0:b47c2a7920c2 1069 ~message_packet()
bobbery 0:b47c2a7920c2 1070 {
bobbery 0:b47c2a7920c2 1071 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 1072 }
bobbery 0:b47c2a7920c2 1073
bobbery 0:b47c2a7920c2 1074 //********************************************
bobbery 0:b47c2a7920c2 1075 etl::imessage& get()
bobbery 0:b47c2a7920c2 1076 {
bobbery 0:b47c2a7920c2 1077 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1078 }
bobbery 0:b47c2a7920c2 1079
bobbery 0:b47c2a7920c2 1080 //********************************************
bobbery 0:b47c2a7920c2 1081 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 1082 {
bobbery 0:b47c2a7920c2 1083 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1084 }
bobbery 0:b47c2a7920c2 1085
bobbery 0:b47c2a7920c2 1086 enum
bobbery 0:b47c2a7920c2 1087 {
bobbery 0:b47c2a7920c2 1088 SIZE = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::size,
bobbery 0:b47c2a7920c2 1089 ALIGNMENT = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>::alignment
bobbery 0:b47c2a7920c2 1090 };
bobbery 0:b47c2a7920c2 1091
bobbery 0:b47c2a7920c2 1092 private:
bobbery 0:b47c2a7920c2 1093
bobbery 0:b47c2a7920c2 1094 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 1095 };
bobbery 0:b47c2a7920c2 1096
bobbery 0:b47c2a7920c2 1097 //**********************************************
bobbery 0:b47c2a7920c2 1098 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 1099 : imessage_router(id_)
bobbery 0:b47c2a7920c2 1100 {
bobbery 0:b47c2a7920c2 1101 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1102 }
bobbery 0:b47c2a7920c2 1103
bobbery 0:b47c2a7920c2 1104 //**********************************************
bobbery 0:b47c2a7920c2 1105 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 1106 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 1107 {
bobbery 0:b47c2a7920c2 1108 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1109 }
bobbery 0:b47c2a7920c2 1110
bobbery 0:b47c2a7920c2 1111 //**********************************************
bobbery 0:b47c2a7920c2 1112 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1113 {
bobbery 0:b47c2a7920c2 1114 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 1115 }
bobbery 0:b47c2a7920c2 1116
bobbery 0:b47c2a7920c2 1117 //**********************************************
bobbery 0:b47c2a7920c2 1118 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1119 {
bobbery 0:b47c2a7920c2 1120 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1121
bobbery 0:b47c2a7920c2 1122 switch (id)
bobbery 0:b47c2a7920c2 1123 {
bobbery 0:b47c2a7920c2 1124 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1125 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1126 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1127 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1128 case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1129 case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 1130 case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 1131 case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 1132 case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 1133 case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 1134 case T11::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T11&>(msg)); break;
bobbery 0:b47c2a7920c2 1135 default:
bobbery 0:b47c2a7920c2 1136 {
bobbery 0:b47c2a7920c2 1137 if (has_successor())
bobbery 0:b47c2a7920c2 1138 {
bobbery 0:b47c2a7920c2 1139 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 1140 }
bobbery 0:b47c2a7920c2 1141 else
bobbery 0:b47c2a7920c2 1142 {
bobbery 0:b47c2a7920c2 1143 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 1144 }
bobbery 0:b47c2a7920c2 1145 break;
bobbery 0:b47c2a7920c2 1146 }
bobbery 0:b47c2a7920c2 1147 }
bobbery 0:b47c2a7920c2 1148 }
bobbery 0:b47c2a7920c2 1149
bobbery 0:b47c2a7920c2 1150 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 1151
bobbery 0:b47c2a7920c2 1152 //**********************************************
bobbery 0:b47c2a7920c2 1153 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 1154 {
bobbery 0:b47c2a7920c2 1155 switch (id)
bobbery 0:b47c2a7920c2 1156 {
bobbery 0:b47c2a7920c2 1157 case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
bobbery 0:b47c2a7920c2 1158 case T9::ID: case T10::ID: case T11::ID:
bobbery 0:b47c2a7920c2 1159 return true; break;
bobbery 0:b47c2a7920c2 1160 default:
bobbery 0:b47c2a7920c2 1161 return false; break;
bobbery 0:b47c2a7920c2 1162 }
bobbery 0:b47c2a7920c2 1163 }
bobbery 0:b47c2a7920c2 1164 };
bobbery 0:b47c2a7920c2 1165
bobbery 0:b47c2a7920c2 1166 //***************************************************************************
bobbery 0:b47c2a7920c2 1167 // Specialisation for 10 message types.
bobbery 0:b47c2a7920c2 1168 //***************************************************************************
bobbery 0:b47c2a7920c2 1169 template <typename TDerived,
bobbery 0:b47c2a7920c2 1170 typename T1, typename T2, typename T3, typename T4,
bobbery 0:b47c2a7920c2 1171 typename T5, typename T6, typename T7, typename T8,
bobbery 0:b47c2a7920c2 1172 typename T9, typename T10>
bobbery 0:b47c2a7920c2 1173 class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, void, void, void, void, void, void>
bobbery 0:b47c2a7920c2 1174 : public imessage_router
bobbery 0:b47c2a7920c2 1175 {
bobbery 0:b47c2a7920c2 1176 public:
bobbery 0:b47c2a7920c2 1177
bobbery 0:b47c2a7920c2 1178 //**********************************************
bobbery 0:b47c2a7920c2 1179 class message_packet
bobbery 0:b47c2a7920c2 1180 {
bobbery 0:b47c2a7920c2 1181 public:
bobbery 0:b47c2a7920c2 1182
bobbery 0:b47c2a7920c2 1183 //********************************************
bobbery 0:b47c2a7920c2 1184 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1185 {
bobbery 0:b47c2a7920c2 1186 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1187
bobbery 0:b47c2a7920c2 1188 void* p = data;
bobbery 0:b47c2a7920c2 1189
bobbery 0:b47c2a7920c2 1190 switch (id)
bobbery 0:b47c2a7920c2 1191 {
bobbery 0:b47c2a7920c2 1192 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1193 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1194 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1195 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1196 case T5::ID: ::new (p) T5(static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1197 case T6::ID: ::new (p) T6(static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 1198 case T7::ID: ::new (p) T7(static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 1199 case T8::ID: ::new (p) T8(static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 1200 case T9::ID: ::new (p) T9(static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 1201 case T10::ID: ::new (p) T10(static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 1202 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 1203 }
bobbery 0:b47c2a7920c2 1204 }
bobbery 0:b47c2a7920c2 1205
bobbery 0:b47c2a7920c2 1206 //********************************************
bobbery 0:b47c2a7920c2 1207 template <typename T>
bobbery 0:b47c2a7920c2 1208 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 1209 {
bobbery 0:b47c2a7920c2 1210 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 1211
bobbery 0:b47c2a7920c2 1212 void* p = data;
bobbery 0:b47c2a7920c2 1213 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 1214 }
bobbery 0:b47c2a7920c2 1215
bobbery 0:b47c2a7920c2 1216 //********************************************
bobbery 0:b47c2a7920c2 1217 ~message_packet()
bobbery 0:b47c2a7920c2 1218 {
bobbery 0:b47c2a7920c2 1219 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 1220 }
bobbery 0:b47c2a7920c2 1221
bobbery 0:b47c2a7920c2 1222 //********************************************
bobbery 0:b47c2a7920c2 1223 etl::imessage& get()
bobbery 0:b47c2a7920c2 1224 {
bobbery 0:b47c2a7920c2 1225 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1226 }
bobbery 0:b47c2a7920c2 1227
bobbery 0:b47c2a7920c2 1228 //********************************************
bobbery 0:b47c2a7920c2 1229 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 1230 {
bobbery 0:b47c2a7920c2 1231 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1232 }
bobbery 0:b47c2a7920c2 1233
bobbery 0:b47c2a7920c2 1234 enum
bobbery 0:b47c2a7920c2 1235 {
bobbery 0:b47c2a7920c2 1236 SIZE = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::size,
bobbery 0:b47c2a7920c2 1237 ALIGNMENT = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>::alignment
bobbery 0:b47c2a7920c2 1238 };
bobbery 0:b47c2a7920c2 1239
bobbery 0:b47c2a7920c2 1240 private:
bobbery 0:b47c2a7920c2 1241
bobbery 0:b47c2a7920c2 1242 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 1243 };
bobbery 0:b47c2a7920c2 1244
bobbery 0:b47c2a7920c2 1245 //**********************************************
bobbery 0:b47c2a7920c2 1246 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 1247 : imessage_router(id_)
bobbery 0:b47c2a7920c2 1248 {
bobbery 0:b47c2a7920c2 1249 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1250 }
bobbery 0:b47c2a7920c2 1251
bobbery 0:b47c2a7920c2 1252 //**********************************************
bobbery 0:b47c2a7920c2 1253 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 1254 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 1255 {
bobbery 0:b47c2a7920c2 1256 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1257 }
bobbery 0:b47c2a7920c2 1258
bobbery 0:b47c2a7920c2 1259 //**********************************************
bobbery 0:b47c2a7920c2 1260 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1261 {
bobbery 0:b47c2a7920c2 1262 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 1263 }
bobbery 0:b47c2a7920c2 1264
bobbery 0:b47c2a7920c2 1265 //**********************************************
bobbery 0:b47c2a7920c2 1266 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1267 {
bobbery 0:b47c2a7920c2 1268 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1269
bobbery 0:b47c2a7920c2 1270 switch (id)
bobbery 0:b47c2a7920c2 1271 {
bobbery 0:b47c2a7920c2 1272 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1273 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1274 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1275 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1276 case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1277 case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 1278 case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 1279 case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 1280 case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 1281 case T10::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T10&>(msg)); break;
bobbery 0:b47c2a7920c2 1282 default:
bobbery 0:b47c2a7920c2 1283 {
bobbery 0:b47c2a7920c2 1284 if (has_successor())
bobbery 0:b47c2a7920c2 1285 {
bobbery 0:b47c2a7920c2 1286 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 1287 }
bobbery 0:b47c2a7920c2 1288 else
bobbery 0:b47c2a7920c2 1289 {
bobbery 0:b47c2a7920c2 1290 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 1291 }
bobbery 0:b47c2a7920c2 1292 break;
bobbery 0:b47c2a7920c2 1293 }
bobbery 0:b47c2a7920c2 1294 }
bobbery 0:b47c2a7920c2 1295 }
bobbery 0:b47c2a7920c2 1296
bobbery 0:b47c2a7920c2 1297 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 1298
bobbery 0:b47c2a7920c2 1299 //**********************************************
bobbery 0:b47c2a7920c2 1300 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 1301 {
bobbery 0:b47c2a7920c2 1302 switch (id)
bobbery 0:b47c2a7920c2 1303 {
bobbery 0:b47c2a7920c2 1304 case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
bobbery 0:b47c2a7920c2 1305 case T9::ID: case T10::ID:
bobbery 0:b47c2a7920c2 1306 return true; break;
bobbery 0:b47c2a7920c2 1307 default:
bobbery 0:b47c2a7920c2 1308 return false; break;
bobbery 0:b47c2a7920c2 1309 }
bobbery 0:b47c2a7920c2 1310 }
bobbery 0:b47c2a7920c2 1311 };
bobbery 0:b47c2a7920c2 1312
bobbery 0:b47c2a7920c2 1313 //***************************************************************************
bobbery 0:b47c2a7920c2 1314 // Specialisation for 9 message types.
bobbery 0:b47c2a7920c2 1315 //***************************************************************************
bobbery 0:b47c2a7920c2 1316 template <typename TDerived,
bobbery 0:b47c2a7920c2 1317 typename T1, typename T2, typename T3, typename T4,
bobbery 0:b47c2a7920c2 1318 typename T5, typename T6, typename T7, typename T8,
bobbery 0:b47c2a7920c2 1319 typename T9>
bobbery 0:b47c2a7920c2 1320 class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, T9, void, void, void, void, void, void, void>
bobbery 0:b47c2a7920c2 1321 : public imessage_router
bobbery 0:b47c2a7920c2 1322 {
bobbery 0:b47c2a7920c2 1323 public:
bobbery 0:b47c2a7920c2 1324
bobbery 0:b47c2a7920c2 1325 //**********************************************
bobbery 0:b47c2a7920c2 1326 class message_packet
bobbery 0:b47c2a7920c2 1327 {
bobbery 0:b47c2a7920c2 1328 public:
bobbery 0:b47c2a7920c2 1329
bobbery 0:b47c2a7920c2 1330 //********************************************
bobbery 0:b47c2a7920c2 1331 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1332 {
bobbery 0:b47c2a7920c2 1333 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1334
bobbery 0:b47c2a7920c2 1335 void* p = data;
bobbery 0:b47c2a7920c2 1336
bobbery 0:b47c2a7920c2 1337 switch (id)
bobbery 0:b47c2a7920c2 1338 {
bobbery 0:b47c2a7920c2 1339 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1340 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1341 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1342 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1343 case T5::ID: ::new (p) T5(static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1344 case T6::ID: ::new (p) T6(static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 1345 case T7::ID: ::new (p) T7(static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 1346 case T8::ID: ::new (p) T8(static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 1347 case T9::ID: ::new (p) T9(static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 1348 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 1349 }
bobbery 0:b47c2a7920c2 1350 }
bobbery 0:b47c2a7920c2 1351
bobbery 0:b47c2a7920c2 1352 //********************************************
bobbery 0:b47c2a7920c2 1353 template <typename T>
bobbery 0:b47c2a7920c2 1354 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 1355 {
bobbery 0:b47c2a7920c2 1356 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4, T5, T6, T7, T8, T9>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 1357
bobbery 0:b47c2a7920c2 1358 void* p = data;
bobbery 0:b47c2a7920c2 1359 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 1360 }
bobbery 0:b47c2a7920c2 1361
bobbery 0:b47c2a7920c2 1362 //********************************************
bobbery 0:b47c2a7920c2 1363 ~message_packet()
bobbery 0:b47c2a7920c2 1364 {
bobbery 0:b47c2a7920c2 1365 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 1366 }
bobbery 0:b47c2a7920c2 1367
bobbery 0:b47c2a7920c2 1368 //********************************************
bobbery 0:b47c2a7920c2 1369 etl::imessage& get()
bobbery 0:b47c2a7920c2 1370 {
bobbery 0:b47c2a7920c2 1371 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1372 }
bobbery 0:b47c2a7920c2 1373
bobbery 0:b47c2a7920c2 1374 //********************************************
bobbery 0:b47c2a7920c2 1375 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 1376 {
bobbery 0:b47c2a7920c2 1377 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1378 }
bobbery 0:b47c2a7920c2 1379
bobbery 0:b47c2a7920c2 1380 enum
bobbery 0:b47c2a7920c2 1381 {
bobbery 0:b47c2a7920c2 1382 SIZE = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9>::size,
bobbery 0:b47c2a7920c2 1383 ALIGNMENT = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8, T9>::alignment
bobbery 0:b47c2a7920c2 1384 };
bobbery 0:b47c2a7920c2 1385
bobbery 0:b47c2a7920c2 1386 private:
bobbery 0:b47c2a7920c2 1387
bobbery 0:b47c2a7920c2 1388 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 1389 };
bobbery 0:b47c2a7920c2 1390
bobbery 0:b47c2a7920c2 1391 //**********************************************
bobbery 0:b47c2a7920c2 1392 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 1393 : imessage_router(id_)
bobbery 0:b47c2a7920c2 1394 {
bobbery 0:b47c2a7920c2 1395 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1396 }
bobbery 0:b47c2a7920c2 1397
bobbery 0:b47c2a7920c2 1398 //**********************************************
bobbery 0:b47c2a7920c2 1399 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 1400 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 1401 {
bobbery 0:b47c2a7920c2 1402 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1403 }
bobbery 0:b47c2a7920c2 1404
bobbery 0:b47c2a7920c2 1405 //**********************************************
bobbery 0:b47c2a7920c2 1406 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1407 {
bobbery 0:b47c2a7920c2 1408 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 1409 }
bobbery 0:b47c2a7920c2 1410
bobbery 0:b47c2a7920c2 1411 //**********************************************
bobbery 0:b47c2a7920c2 1412 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1413 {
bobbery 0:b47c2a7920c2 1414 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1415
bobbery 0:b47c2a7920c2 1416 switch (id)
bobbery 0:b47c2a7920c2 1417 {
bobbery 0:b47c2a7920c2 1418 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1419 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1420 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1421 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1422 case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1423 case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 1424 case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 1425 case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 1426 case T9::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T9&>(msg)); break;
bobbery 0:b47c2a7920c2 1427 default:
bobbery 0:b47c2a7920c2 1428 {
bobbery 0:b47c2a7920c2 1429 if (has_successor())
bobbery 0:b47c2a7920c2 1430 {
bobbery 0:b47c2a7920c2 1431 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 1432 }
bobbery 0:b47c2a7920c2 1433 else
bobbery 0:b47c2a7920c2 1434 {
bobbery 0:b47c2a7920c2 1435 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 1436 }
bobbery 0:b47c2a7920c2 1437 break;
bobbery 0:b47c2a7920c2 1438 }
bobbery 0:b47c2a7920c2 1439 }
bobbery 0:b47c2a7920c2 1440 }
bobbery 0:b47c2a7920c2 1441
bobbery 0:b47c2a7920c2 1442 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 1443
bobbery 0:b47c2a7920c2 1444 //**********************************************
bobbery 0:b47c2a7920c2 1445 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 1446 {
bobbery 0:b47c2a7920c2 1447 switch (id)
bobbery 0:b47c2a7920c2 1448 {
bobbery 0:b47c2a7920c2 1449 case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
bobbery 0:b47c2a7920c2 1450 case T9::ID:
bobbery 0:b47c2a7920c2 1451 return true; break;
bobbery 0:b47c2a7920c2 1452 default:
bobbery 0:b47c2a7920c2 1453 return false; break;
bobbery 0:b47c2a7920c2 1454 }
bobbery 0:b47c2a7920c2 1455 }
bobbery 0:b47c2a7920c2 1456 };
bobbery 0:b47c2a7920c2 1457
bobbery 0:b47c2a7920c2 1458 //***************************************************************************
bobbery 0:b47c2a7920c2 1459 // Specialisation for 8 message types.
bobbery 0:b47c2a7920c2 1460 //***************************************************************************
bobbery 0:b47c2a7920c2 1461 template <typename TDerived,
bobbery 0:b47c2a7920c2 1462 typename T1, typename T2, typename T3, typename T4,
bobbery 0:b47c2a7920c2 1463 typename T5, typename T6, typename T7, typename T8>
bobbery 0:b47c2a7920c2 1464 class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, T8, void, void, void, void, void, void, void, void>
bobbery 0:b47c2a7920c2 1465 : public imessage_router
bobbery 0:b47c2a7920c2 1466 {
bobbery 0:b47c2a7920c2 1467 public:
bobbery 0:b47c2a7920c2 1468
bobbery 0:b47c2a7920c2 1469 //**********************************************
bobbery 0:b47c2a7920c2 1470 class message_packet
bobbery 0:b47c2a7920c2 1471 {
bobbery 0:b47c2a7920c2 1472 public:
bobbery 0:b47c2a7920c2 1473
bobbery 0:b47c2a7920c2 1474 //********************************************
bobbery 0:b47c2a7920c2 1475 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1476 {
bobbery 0:b47c2a7920c2 1477 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1478
bobbery 0:b47c2a7920c2 1479 void* p = data;
bobbery 0:b47c2a7920c2 1480
bobbery 0:b47c2a7920c2 1481 switch (id)
bobbery 0:b47c2a7920c2 1482 {
bobbery 0:b47c2a7920c2 1483 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1484 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1485 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1486 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1487 case T5::ID: ::new (p) T5(static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1488 case T6::ID: ::new (p) T6(static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 1489 case T7::ID: ::new (p) T7(static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 1490 case T8::ID: ::new (p) T8(static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 1491 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 1492 }
bobbery 0:b47c2a7920c2 1493 }
bobbery 0:b47c2a7920c2 1494
bobbery 0:b47c2a7920c2 1495 //********************************************
bobbery 0:b47c2a7920c2 1496 template <typename T>
bobbery 0:b47c2a7920c2 1497 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 1498 {
bobbery 0:b47c2a7920c2 1499 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4, T5, T6, T7, T8>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 1500
bobbery 0:b47c2a7920c2 1501 void* p = data;
bobbery 0:b47c2a7920c2 1502 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 1503 }
bobbery 0:b47c2a7920c2 1504
bobbery 0:b47c2a7920c2 1505 //********************************************
bobbery 0:b47c2a7920c2 1506 ~message_packet()
bobbery 0:b47c2a7920c2 1507 {
bobbery 0:b47c2a7920c2 1508 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 1509 }
bobbery 0:b47c2a7920c2 1510
bobbery 0:b47c2a7920c2 1511 //********************************************
bobbery 0:b47c2a7920c2 1512 etl::imessage& get()
bobbery 0:b47c2a7920c2 1513 {
bobbery 0:b47c2a7920c2 1514 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1515 }
bobbery 0:b47c2a7920c2 1516
bobbery 0:b47c2a7920c2 1517 //********************************************
bobbery 0:b47c2a7920c2 1518 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 1519 {
bobbery 0:b47c2a7920c2 1520 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1521 }
bobbery 0:b47c2a7920c2 1522
bobbery 0:b47c2a7920c2 1523 enum
bobbery 0:b47c2a7920c2 1524 {
bobbery 0:b47c2a7920c2 1525 SIZE = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8>::size,
bobbery 0:b47c2a7920c2 1526 ALIGNMENT = etl::largest<T1, T2, T3, T4, T5, T6, T7, T8>::alignment
bobbery 0:b47c2a7920c2 1527 };
bobbery 0:b47c2a7920c2 1528
bobbery 0:b47c2a7920c2 1529 private:
bobbery 0:b47c2a7920c2 1530
bobbery 0:b47c2a7920c2 1531 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 1532 };
bobbery 0:b47c2a7920c2 1533
bobbery 0:b47c2a7920c2 1534 //**********************************************
bobbery 0:b47c2a7920c2 1535 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 1536 : imessage_router(id_)
bobbery 0:b47c2a7920c2 1537 {
bobbery 0:b47c2a7920c2 1538 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1539 }
bobbery 0:b47c2a7920c2 1540
bobbery 0:b47c2a7920c2 1541 //**********************************************
bobbery 0:b47c2a7920c2 1542 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 1543 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 1544 {
bobbery 0:b47c2a7920c2 1545 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1546 }
bobbery 0:b47c2a7920c2 1547
bobbery 0:b47c2a7920c2 1548 //**********************************************
bobbery 0:b47c2a7920c2 1549 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1550 {
bobbery 0:b47c2a7920c2 1551 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 1552 }
bobbery 0:b47c2a7920c2 1553
bobbery 0:b47c2a7920c2 1554 //**********************************************
bobbery 0:b47c2a7920c2 1555 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1556 {
bobbery 0:b47c2a7920c2 1557 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1558
bobbery 0:b47c2a7920c2 1559 switch (id)
bobbery 0:b47c2a7920c2 1560 {
bobbery 0:b47c2a7920c2 1561 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1562 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1563 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1564 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1565 case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1566 case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 1567 case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 1568 case T8::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T8&>(msg)); break;
bobbery 0:b47c2a7920c2 1569 default:
bobbery 0:b47c2a7920c2 1570 {
bobbery 0:b47c2a7920c2 1571 if (has_successor())
bobbery 0:b47c2a7920c2 1572 {
bobbery 0:b47c2a7920c2 1573 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 1574 }
bobbery 0:b47c2a7920c2 1575 else
bobbery 0:b47c2a7920c2 1576 {
bobbery 0:b47c2a7920c2 1577 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 1578 }
bobbery 0:b47c2a7920c2 1579 break;
bobbery 0:b47c2a7920c2 1580 }
bobbery 0:b47c2a7920c2 1581 }
bobbery 0:b47c2a7920c2 1582 }
bobbery 0:b47c2a7920c2 1583
bobbery 0:b47c2a7920c2 1584 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 1585
bobbery 0:b47c2a7920c2 1586 //**********************************************
bobbery 0:b47c2a7920c2 1587 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 1588 {
bobbery 0:b47c2a7920c2 1589 switch (id)
bobbery 0:b47c2a7920c2 1590 {
bobbery 0:b47c2a7920c2 1591 case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID: case T8::ID:
bobbery 0:b47c2a7920c2 1592
bobbery 0:b47c2a7920c2 1593 return true; break;
bobbery 0:b47c2a7920c2 1594 default:
bobbery 0:b47c2a7920c2 1595 return false; break;
bobbery 0:b47c2a7920c2 1596 }
bobbery 0:b47c2a7920c2 1597 }
bobbery 0:b47c2a7920c2 1598 };
bobbery 0:b47c2a7920c2 1599
bobbery 0:b47c2a7920c2 1600 //***************************************************************************
bobbery 0:b47c2a7920c2 1601 // Specialisation for 7 message types.
bobbery 0:b47c2a7920c2 1602 //***************************************************************************
bobbery 0:b47c2a7920c2 1603 template <typename TDerived,
bobbery 0:b47c2a7920c2 1604 typename T1, typename T2, typename T3, typename T4,
bobbery 0:b47c2a7920c2 1605 typename T5, typename T6, typename T7>
bobbery 0:b47c2a7920c2 1606 class message_router<TDerived, T1, T2, T3, T4, T5, T6, T7, void, void, void, void, void, void, void, void, void>
bobbery 0:b47c2a7920c2 1607 : public imessage_router
bobbery 0:b47c2a7920c2 1608 {
bobbery 0:b47c2a7920c2 1609 public:
bobbery 0:b47c2a7920c2 1610
bobbery 0:b47c2a7920c2 1611 //**********************************************
bobbery 0:b47c2a7920c2 1612 class message_packet
bobbery 0:b47c2a7920c2 1613 {
bobbery 0:b47c2a7920c2 1614 public:
bobbery 0:b47c2a7920c2 1615
bobbery 0:b47c2a7920c2 1616 //********************************************
bobbery 0:b47c2a7920c2 1617 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1618 {
bobbery 0:b47c2a7920c2 1619 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1620
bobbery 0:b47c2a7920c2 1621 void* p = data;
bobbery 0:b47c2a7920c2 1622
bobbery 0:b47c2a7920c2 1623 switch (id)
bobbery 0:b47c2a7920c2 1624 {
bobbery 0:b47c2a7920c2 1625 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1626 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1627 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1628 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1629 case T5::ID: ::new (p) T5(static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1630 case T6::ID: ::new (p) T6(static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 1631 case T7::ID: ::new (p) T7(static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 1632 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 1633 }
bobbery 0:b47c2a7920c2 1634 }
bobbery 0:b47c2a7920c2 1635
bobbery 0:b47c2a7920c2 1636 //********************************************
bobbery 0:b47c2a7920c2 1637 template <typename T>
bobbery 0:b47c2a7920c2 1638 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 1639 {
bobbery 0:b47c2a7920c2 1640 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4, T5, T6, T7>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 1641
bobbery 0:b47c2a7920c2 1642 void* p = data;
bobbery 0:b47c2a7920c2 1643 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 1644 }
bobbery 0:b47c2a7920c2 1645
bobbery 0:b47c2a7920c2 1646 //********************************************
bobbery 0:b47c2a7920c2 1647 ~message_packet()
bobbery 0:b47c2a7920c2 1648 {
bobbery 0:b47c2a7920c2 1649 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 1650 }
bobbery 0:b47c2a7920c2 1651
bobbery 0:b47c2a7920c2 1652 //********************************************
bobbery 0:b47c2a7920c2 1653 etl::imessage& get()
bobbery 0:b47c2a7920c2 1654 {
bobbery 0:b47c2a7920c2 1655 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1656 }
bobbery 0:b47c2a7920c2 1657
bobbery 0:b47c2a7920c2 1658 //********************************************
bobbery 0:b47c2a7920c2 1659 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 1660 {
bobbery 0:b47c2a7920c2 1661 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1662 }
bobbery 0:b47c2a7920c2 1663
bobbery 0:b47c2a7920c2 1664 enum
bobbery 0:b47c2a7920c2 1665 {
bobbery 0:b47c2a7920c2 1666 SIZE = etl::largest<T1, T2, T3, T4, T5, T6, T7>::size,
bobbery 0:b47c2a7920c2 1667 ALIGNMENT = etl::largest<T1, T2, T3, T4, T5, T6, T7>::alignment
bobbery 0:b47c2a7920c2 1668 };
bobbery 0:b47c2a7920c2 1669
bobbery 0:b47c2a7920c2 1670 private:
bobbery 0:b47c2a7920c2 1671
bobbery 0:b47c2a7920c2 1672 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 1673 };
bobbery 0:b47c2a7920c2 1674
bobbery 0:b47c2a7920c2 1675 //**********************************************
bobbery 0:b47c2a7920c2 1676 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 1677 : imessage_router(id_)
bobbery 0:b47c2a7920c2 1678 {
bobbery 0:b47c2a7920c2 1679 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1680 }
bobbery 0:b47c2a7920c2 1681
bobbery 0:b47c2a7920c2 1682 //**********************************************
bobbery 0:b47c2a7920c2 1683 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 1684 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 1685 {
bobbery 0:b47c2a7920c2 1686 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1687 }
bobbery 0:b47c2a7920c2 1688
bobbery 0:b47c2a7920c2 1689 //**********************************************
bobbery 0:b47c2a7920c2 1690 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1691 {
bobbery 0:b47c2a7920c2 1692 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 1693 }
bobbery 0:b47c2a7920c2 1694
bobbery 0:b47c2a7920c2 1695 //**********************************************
bobbery 0:b47c2a7920c2 1696 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1697 {
bobbery 0:b47c2a7920c2 1698 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1699
bobbery 0:b47c2a7920c2 1700 switch (id)
bobbery 0:b47c2a7920c2 1701 {
bobbery 0:b47c2a7920c2 1702 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1703 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1704 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1705 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1706 case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1707 case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 1708 case T7::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T7&>(msg)); break;
bobbery 0:b47c2a7920c2 1709 default:
bobbery 0:b47c2a7920c2 1710 {
bobbery 0:b47c2a7920c2 1711 if (has_successor())
bobbery 0:b47c2a7920c2 1712 {
bobbery 0:b47c2a7920c2 1713 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 1714 }
bobbery 0:b47c2a7920c2 1715 else
bobbery 0:b47c2a7920c2 1716 {
bobbery 0:b47c2a7920c2 1717 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 1718 }
bobbery 0:b47c2a7920c2 1719 break;
bobbery 0:b47c2a7920c2 1720 }
bobbery 0:b47c2a7920c2 1721 }
bobbery 0:b47c2a7920c2 1722 }
bobbery 0:b47c2a7920c2 1723
bobbery 0:b47c2a7920c2 1724 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 1725
bobbery 0:b47c2a7920c2 1726 //**********************************************
bobbery 0:b47c2a7920c2 1727 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 1728 {
bobbery 0:b47c2a7920c2 1729 switch (id)
bobbery 0:b47c2a7920c2 1730 {
bobbery 0:b47c2a7920c2 1731 case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID: case T7::ID:
bobbery 0:b47c2a7920c2 1732 return true; break;
bobbery 0:b47c2a7920c2 1733 default:
bobbery 0:b47c2a7920c2 1734 return false; break;
bobbery 0:b47c2a7920c2 1735 }
bobbery 0:b47c2a7920c2 1736 }
bobbery 0:b47c2a7920c2 1737 };
bobbery 0:b47c2a7920c2 1738
bobbery 0:b47c2a7920c2 1739 //***************************************************************************
bobbery 0:b47c2a7920c2 1740 // Specialisation for 6 message types.
bobbery 0:b47c2a7920c2 1741 //***************************************************************************
bobbery 0:b47c2a7920c2 1742 template <typename TDerived,
bobbery 0:b47c2a7920c2 1743 typename T1, typename T2, typename T3, typename T4,
bobbery 0:b47c2a7920c2 1744 typename T5, typename T6>
bobbery 0:b47c2a7920c2 1745 class message_router<TDerived, T1, T2, T3, T4, T5, T6, void, void, void, void, void, void, void, void, void, void>
bobbery 0:b47c2a7920c2 1746 : public imessage_router
bobbery 0:b47c2a7920c2 1747 {
bobbery 0:b47c2a7920c2 1748 public:
bobbery 0:b47c2a7920c2 1749
bobbery 0:b47c2a7920c2 1750 //**********************************************
bobbery 0:b47c2a7920c2 1751 class message_packet
bobbery 0:b47c2a7920c2 1752 {
bobbery 0:b47c2a7920c2 1753 public:
bobbery 0:b47c2a7920c2 1754
bobbery 0:b47c2a7920c2 1755 //********************************************
bobbery 0:b47c2a7920c2 1756 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1757 {
bobbery 0:b47c2a7920c2 1758 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1759
bobbery 0:b47c2a7920c2 1760 void* p = data;
bobbery 0:b47c2a7920c2 1761
bobbery 0:b47c2a7920c2 1762 switch (id)
bobbery 0:b47c2a7920c2 1763 {
bobbery 0:b47c2a7920c2 1764 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1765 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1766 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1767 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1768 case T5::ID: ::new (p) T5(static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1769 case T6::ID: ::new (p) T6(static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 1770 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 1771 }
bobbery 0:b47c2a7920c2 1772 }
bobbery 0:b47c2a7920c2 1773
bobbery 0:b47c2a7920c2 1774 //********************************************
bobbery 0:b47c2a7920c2 1775 template <typename T>
bobbery 0:b47c2a7920c2 1776 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 1777 {
bobbery 0:b47c2a7920c2 1778 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4, T5, T6>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 1779
bobbery 0:b47c2a7920c2 1780 void* p = data;
bobbery 0:b47c2a7920c2 1781 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 1782 }
bobbery 0:b47c2a7920c2 1783
bobbery 0:b47c2a7920c2 1784 //********************************************
bobbery 0:b47c2a7920c2 1785 ~message_packet()
bobbery 0:b47c2a7920c2 1786 {
bobbery 0:b47c2a7920c2 1787 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 1788 }
bobbery 0:b47c2a7920c2 1789
bobbery 0:b47c2a7920c2 1790 //********************************************
bobbery 0:b47c2a7920c2 1791 etl::imessage& get()
bobbery 0:b47c2a7920c2 1792 {
bobbery 0:b47c2a7920c2 1793 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1794 }
bobbery 0:b47c2a7920c2 1795
bobbery 0:b47c2a7920c2 1796 //********************************************
bobbery 0:b47c2a7920c2 1797 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 1798 {
bobbery 0:b47c2a7920c2 1799 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1800 }
bobbery 0:b47c2a7920c2 1801
bobbery 0:b47c2a7920c2 1802 enum
bobbery 0:b47c2a7920c2 1803 {
bobbery 0:b47c2a7920c2 1804 SIZE = etl::largest<T1, T2, T3, T4, T5, T6>::size,
bobbery 0:b47c2a7920c2 1805 ALIGNMENT = etl::largest<T1, T2, T3, T4, T5, T6>::alignment
bobbery 0:b47c2a7920c2 1806 };
bobbery 0:b47c2a7920c2 1807
bobbery 0:b47c2a7920c2 1808 private:
bobbery 0:b47c2a7920c2 1809
bobbery 0:b47c2a7920c2 1810 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 1811 };
bobbery 0:b47c2a7920c2 1812
bobbery 0:b47c2a7920c2 1813 //**********************************************
bobbery 0:b47c2a7920c2 1814 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 1815 : imessage_router(id_)
bobbery 0:b47c2a7920c2 1816 {
bobbery 0:b47c2a7920c2 1817 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1818 }
bobbery 0:b47c2a7920c2 1819
bobbery 0:b47c2a7920c2 1820 //**********************************************
bobbery 0:b47c2a7920c2 1821 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 1822 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 1823 {
bobbery 0:b47c2a7920c2 1824 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1825 }
bobbery 0:b47c2a7920c2 1826
bobbery 0:b47c2a7920c2 1827 //**********************************************
bobbery 0:b47c2a7920c2 1828 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1829 {
bobbery 0:b47c2a7920c2 1830 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 1831 }
bobbery 0:b47c2a7920c2 1832
bobbery 0:b47c2a7920c2 1833 //**********************************************
bobbery 0:b47c2a7920c2 1834 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1835 {
bobbery 0:b47c2a7920c2 1836 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1837
bobbery 0:b47c2a7920c2 1838 switch (id)
bobbery 0:b47c2a7920c2 1839 {
bobbery 0:b47c2a7920c2 1840 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1841 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1842 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1843 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1844 case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1845 case T6::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T6&>(msg)); break;
bobbery 0:b47c2a7920c2 1846 default:
bobbery 0:b47c2a7920c2 1847 {
bobbery 0:b47c2a7920c2 1848 if (has_successor())
bobbery 0:b47c2a7920c2 1849 {
bobbery 0:b47c2a7920c2 1850 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 1851 }
bobbery 0:b47c2a7920c2 1852 else
bobbery 0:b47c2a7920c2 1853 {
bobbery 0:b47c2a7920c2 1854 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 1855 }
bobbery 0:b47c2a7920c2 1856 break;
bobbery 0:b47c2a7920c2 1857 }
bobbery 0:b47c2a7920c2 1858 }
bobbery 0:b47c2a7920c2 1859 }
bobbery 0:b47c2a7920c2 1860
bobbery 0:b47c2a7920c2 1861 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 1862
bobbery 0:b47c2a7920c2 1863 //**********************************************
bobbery 0:b47c2a7920c2 1864 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 1865 {
bobbery 0:b47c2a7920c2 1866 switch (id)
bobbery 0:b47c2a7920c2 1867 {
bobbery 0:b47c2a7920c2 1868 case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID: case T6::ID:
bobbery 0:b47c2a7920c2 1869 return true; break;
bobbery 0:b47c2a7920c2 1870 default:
bobbery 0:b47c2a7920c2 1871 return false; break;
bobbery 0:b47c2a7920c2 1872 }
bobbery 0:b47c2a7920c2 1873 }
bobbery 0:b47c2a7920c2 1874 };
bobbery 0:b47c2a7920c2 1875
bobbery 0:b47c2a7920c2 1876 //***************************************************************************
bobbery 0:b47c2a7920c2 1877 // Specialisation for 5 message types.
bobbery 0:b47c2a7920c2 1878 //***************************************************************************
bobbery 0:b47c2a7920c2 1879 template <typename TDerived,
bobbery 0:b47c2a7920c2 1880 typename T1, typename T2, typename T3, typename T4,
bobbery 0:b47c2a7920c2 1881 typename T5>
bobbery 0:b47c2a7920c2 1882 class message_router<TDerived, T1, T2, T3, T4, T5, void, void, void, void, void, void, void, void, void, void, void>
bobbery 0:b47c2a7920c2 1883 : public imessage_router
bobbery 0:b47c2a7920c2 1884 {
bobbery 0:b47c2a7920c2 1885 public:
bobbery 0:b47c2a7920c2 1886
bobbery 0:b47c2a7920c2 1887 //**********************************************
bobbery 0:b47c2a7920c2 1888 class message_packet
bobbery 0:b47c2a7920c2 1889 {
bobbery 0:b47c2a7920c2 1890 public:
bobbery 0:b47c2a7920c2 1891
bobbery 0:b47c2a7920c2 1892 //********************************************
bobbery 0:b47c2a7920c2 1893 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1894 {
bobbery 0:b47c2a7920c2 1895 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1896
bobbery 0:b47c2a7920c2 1897 void* p = data;
bobbery 0:b47c2a7920c2 1898
bobbery 0:b47c2a7920c2 1899 switch (id)
bobbery 0:b47c2a7920c2 1900 {
bobbery 0:b47c2a7920c2 1901 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1902 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1903 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1904 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1905 case T5::ID: ::new (p) T5(static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1906 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 1907 }
bobbery 0:b47c2a7920c2 1908 }
bobbery 0:b47c2a7920c2 1909
bobbery 0:b47c2a7920c2 1910 //********************************************
bobbery 0:b47c2a7920c2 1911 template <typename T>
bobbery 0:b47c2a7920c2 1912 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 1913 {
bobbery 0:b47c2a7920c2 1914 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4, T5>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 1915
bobbery 0:b47c2a7920c2 1916 void* p = data;
bobbery 0:b47c2a7920c2 1917 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 1918 }
bobbery 0:b47c2a7920c2 1919
bobbery 0:b47c2a7920c2 1920 //********************************************
bobbery 0:b47c2a7920c2 1921 ~message_packet()
bobbery 0:b47c2a7920c2 1922 {
bobbery 0:b47c2a7920c2 1923 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 1924 }
bobbery 0:b47c2a7920c2 1925
bobbery 0:b47c2a7920c2 1926 //********************************************
bobbery 0:b47c2a7920c2 1927 etl::imessage& get()
bobbery 0:b47c2a7920c2 1928 {
bobbery 0:b47c2a7920c2 1929 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1930 }
bobbery 0:b47c2a7920c2 1931
bobbery 0:b47c2a7920c2 1932 //********************************************
bobbery 0:b47c2a7920c2 1933 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 1934 {
bobbery 0:b47c2a7920c2 1935 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 1936 }
bobbery 0:b47c2a7920c2 1937
bobbery 0:b47c2a7920c2 1938 enum
bobbery 0:b47c2a7920c2 1939 {
bobbery 0:b47c2a7920c2 1940 SIZE = etl::largest<T1, T2, T3, T4, T5>::size,
bobbery 0:b47c2a7920c2 1941 ALIGNMENT = etl::largest<T1, T2, T3, T4, T5>::alignment
bobbery 0:b47c2a7920c2 1942 };
bobbery 0:b47c2a7920c2 1943
bobbery 0:b47c2a7920c2 1944 private:
bobbery 0:b47c2a7920c2 1945
bobbery 0:b47c2a7920c2 1946 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 1947 };
bobbery 0:b47c2a7920c2 1948
bobbery 0:b47c2a7920c2 1949 //**********************************************
bobbery 0:b47c2a7920c2 1950 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 1951 : imessage_router(id_)
bobbery 0:b47c2a7920c2 1952 {
bobbery 0:b47c2a7920c2 1953 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1954 }
bobbery 0:b47c2a7920c2 1955
bobbery 0:b47c2a7920c2 1956 //**********************************************
bobbery 0:b47c2a7920c2 1957 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 1958 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 1959 {
bobbery 0:b47c2a7920c2 1960 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 1961 }
bobbery 0:b47c2a7920c2 1962
bobbery 0:b47c2a7920c2 1963 //**********************************************
bobbery 0:b47c2a7920c2 1964 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1965 {
bobbery 0:b47c2a7920c2 1966 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 1967 }
bobbery 0:b47c2a7920c2 1968
bobbery 0:b47c2a7920c2 1969 //**********************************************
bobbery 0:b47c2a7920c2 1970 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 1971 {
bobbery 0:b47c2a7920c2 1972 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 1973
bobbery 0:b47c2a7920c2 1974 switch (id)
bobbery 0:b47c2a7920c2 1975 {
bobbery 0:b47c2a7920c2 1976 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 1977 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 1978 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 1979 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 1980 case T5::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T5&>(msg)); break;
bobbery 0:b47c2a7920c2 1981 default:
bobbery 0:b47c2a7920c2 1982 {
bobbery 0:b47c2a7920c2 1983 if (has_successor())
bobbery 0:b47c2a7920c2 1984 {
bobbery 0:b47c2a7920c2 1985 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 1986 }
bobbery 0:b47c2a7920c2 1987 else
bobbery 0:b47c2a7920c2 1988 {
bobbery 0:b47c2a7920c2 1989 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 1990 }
bobbery 0:b47c2a7920c2 1991 break;
bobbery 0:b47c2a7920c2 1992 }
bobbery 0:b47c2a7920c2 1993 }
bobbery 0:b47c2a7920c2 1994 }
bobbery 0:b47c2a7920c2 1995
bobbery 0:b47c2a7920c2 1996 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 1997
bobbery 0:b47c2a7920c2 1998 //**********************************************
bobbery 0:b47c2a7920c2 1999 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 2000 {
bobbery 0:b47c2a7920c2 2001 switch (id)
bobbery 0:b47c2a7920c2 2002 {
bobbery 0:b47c2a7920c2 2003 case T1::ID: case T2::ID: case T3::ID: case T4::ID: case T5::ID:
bobbery 0:b47c2a7920c2 2004 return true; break;
bobbery 0:b47c2a7920c2 2005 default:
bobbery 0:b47c2a7920c2 2006 return false; break;
bobbery 0:b47c2a7920c2 2007 }
bobbery 0:b47c2a7920c2 2008 }
bobbery 0:b47c2a7920c2 2009 };
bobbery 0:b47c2a7920c2 2010
bobbery 0:b47c2a7920c2 2011 //***************************************************************************
bobbery 0:b47c2a7920c2 2012 // Specialisation for 4 message types.
bobbery 0:b47c2a7920c2 2013 //***************************************************************************
bobbery 0:b47c2a7920c2 2014 template <typename TDerived,
bobbery 0:b47c2a7920c2 2015 typename T1, typename T2, typename T3, typename T4>
bobbery 0:b47c2a7920c2 2016 class message_router<TDerived, T1, T2, T3, T4, void, void, void, void, void, void, void, void, void, void, void, void>
bobbery 0:b47c2a7920c2 2017 : public imessage_router
bobbery 0:b47c2a7920c2 2018 {
bobbery 0:b47c2a7920c2 2019 public:
bobbery 0:b47c2a7920c2 2020
bobbery 0:b47c2a7920c2 2021 //**********************************************
bobbery 0:b47c2a7920c2 2022 class message_packet
bobbery 0:b47c2a7920c2 2023 {
bobbery 0:b47c2a7920c2 2024 public:
bobbery 0:b47c2a7920c2 2025
bobbery 0:b47c2a7920c2 2026 //********************************************
bobbery 0:b47c2a7920c2 2027 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 2028 {
bobbery 0:b47c2a7920c2 2029 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 2030
bobbery 0:b47c2a7920c2 2031 void* p = data;
bobbery 0:b47c2a7920c2 2032
bobbery 0:b47c2a7920c2 2033 switch (id)
bobbery 0:b47c2a7920c2 2034 {
bobbery 0:b47c2a7920c2 2035 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 2036 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 2037 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 2038 case T4::ID: ::new (p) T4(static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 2039 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 2040 }
bobbery 0:b47c2a7920c2 2041 }
bobbery 0:b47c2a7920c2 2042
bobbery 0:b47c2a7920c2 2043 //********************************************
bobbery 0:b47c2a7920c2 2044 template <typename T>
bobbery 0:b47c2a7920c2 2045 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 2046 {
bobbery 0:b47c2a7920c2 2047 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3, T4>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 2048
bobbery 0:b47c2a7920c2 2049 void* p = data;
bobbery 0:b47c2a7920c2 2050 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 2051 }
bobbery 0:b47c2a7920c2 2052
bobbery 0:b47c2a7920c2 2053 //********************************************
bobbery 0:b47c2a7920c2 2054 ~message_packet()
bobbery 0:b47c2a7920c2 2055 {
bobbery 0:b47c2a7920c2 2056 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 2057 }
bobbery 0:b47c2a7920c2 2058
bobbery 0:b47c2a7920c2 2059 //********************************************
bobbery 0:b47c2a7920c2 2060 etl::imessage& get()
bobbery 0:b47c2a7920c2 2061 {
bobbery 0:b47c2a7920c2 2062 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 2063 }
bobbery 0:b47c2a7920c2 2064
bobbery 0:b47c2a7920c2 2065 //********************************************
bobbery 0:b47c2a7920c2 2066 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 2067 {
bobbery 0:b47c2a7920c2 2068 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 2069 }
bobbery 0:b47c2a7920c2 2070
bobbery 0:b47c2a7920c2 2071 enum
bobbery 0:b47c2a7920c2 2072 {
bobbery 0:b47c2a7920c2 2073 SIZE = etl::largest<T1, T2, T3, T4>::size,
bobbery 0:b47c2a7920c2 2074 ALIGNMENT = etl::largest<T1, T2, T3, T4>::alignment
bobbery 0:b47c2a7920c2 2075 };
bobbery 0:b47c2a7920c2 2076
bobbery 0:b47c2a7920c2 2077 private:
bobbery 0:b47c2a7920c2 2078
bobbery 0:b47c2a7920c2 2079 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 2080 };
bobbery 0:b47c2a7920c2 2081
bobbery 0:b47c2a7920c2 2082 //**********************************************
bobbery 0:b47c2a7920c2 2083 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 2084 : imessage_router(id_)
bobbery 0:b47c2a7920c2 2085 {
bobbery 0:b47c2a7920c2 2086 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 2087 }
bobbery 0:b47c2a7920c2 2088
bobbery 0:b47c2a7920c2 2089 //**********************************************
bobbery 0:b47c2a7920c2 2090 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 2091 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 2092 {
bobbery 0:b47c2a7920c2 2093 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 2094 }
bobbery 0:b47c2a7920c2 2095
bobbery 0:b47c2a7920c2 2096 //**********************************************
bobbery 0:b47c2a7920c2 2097 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 2098 {
bobbery 0:b47c2a7920c2 2099 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 2100 }
bobbery 0:b47c2a7920c2 2101
bobbery 0:b47c2a7920c2 2102 //**********************************************
bobbery 0:b47c2a7920c2 2103 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 2104 {
bobbery 0:b47c2a7920c2 2105 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 2106
bobbery 0:b47c2a7920c2 2107 switch (id)
bobbery 0:b47c2a7920c2 2108 {
bobbery 0:b47c2a7920c2 2109 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 2110 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 2111 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 2112 case T4::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T4&>(msg)); break;
bobbery 0:b47c2a7920c2 2113 default:
bobbery 0:b47c2a7920c2 2114 {
bobbery 0:b47c2a7920c2 2115 if (has_successor())
bobbery 0:b47c2a7920c2 2116 {
bobbery 0:b47c2a7920c2 2117 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 2118 }
bobbery 0:b47c2a7920c2 2119 else
bobbery 0:b47c2a7920c2 2120 {
bobbery 0:b47c2a7920c2 2121 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 2122 }
bobbery 0:b47c2a7920c2 2123 break;
bobbery 0:b47c2a7920c2 2124 }
bobbery 0:b47c2a7920c2 2125 }
bobbery 0:b47c2a7920c2 2126 }
bobbery 0:b47c2a7920c2 2127
bobbery 0:b47c2a7920c2 2128 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 2129
bobbery 0:b47c2a7920c2 2130 //**********************************************
bobbery 0:b47c2a7920c2 2131 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 2132 {
bobbery 0:b47c2a7920c2 2133 switch (id)
bobbery 0:b47c2a7920c2 2134 {
bobbery 0:b47c2a7920c2 2135 case T1::ID: case T2::ID: case T3::ID: case T4::ID:
bobbery 0:b47c2a7920c2 2136 return true; break;
bobbery 0:b47c2a7920c2 2137 default:
bobbery 0:b47c2a7920c2 2138 return false; break;
bobbery 0:b47c2a7920c2 2139 }
bobbery 0:b47c2a7920c2 2140 }
bobbery 0:b47c2a7920c2 2141 };
bobbery 0:b47c2a7920c2 2142
bobbery 0:b47c2a7920c2 2143 //***************************************************************************
bobbery 0:b47c2a7920c2 2144 // Specialisation for 3 message types.
bobbery 0:b47c2a7920c2 2145 //***************************************************************************
bobbery 0:b47c2a7920c2 2146 template <typename TDerived,
bobbery 0:b47c2a7920c2 2147 typename T1, typename T2, typename T3>
bobbery 0:b47c2a7920c2 2148 class message_router<TDerived, T1, T2, T3, void, void, void, void, void, void, void, void, void, void, void, void, void>
bobbery 0:b47c2a7920c2 2149 : public imessage_router
bobbery 0:b47c2a7920c2 2150 {
bobbery 0:b47c2a7920c2 2151 public:
bobbery 0:b47c2a7920c2 2152
bobbery 0:b47c2a7920c2 2153 //**********************************************
bobbery 0:b47c2a7920c2 2154 class message_packet
bobbery 0:b47c2a7920c2 2155 {
bobbery 0:b47c2a7920c2 2156 public:
bobbery 0:b47c2a7920c2 2157
bobbery 0:b47c2a7920c2 2158 //********************************************
bobbery 0:b47c2a7920c2 2159 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 2160 {
bobbery 0:b47c2a7920c2 2161 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 2162
bobbery 0:b47c2a7920c2 2163 void* p = data;
bobbery 0:b47c2a7920c2 2164
bobbery 0:b47c2a7920c2 2165 switch (id)
bobbery 0:b47c2a7920c2 2166 {
bobbery 0:b47c2a7920c2 2167 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 2168 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 2169 case T3::ID: ::new (p) T3(static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 2170 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 2171 }
bobbery 0:b47c2a7920c2 2172 }
bobbery 0:b47c2a7920c2 2173
bobbery 0:b47c2a7920c2 2174 //********************************************
bobbery 0:b47c2a7920c2 2175 template <typename T>
bobbery 0:b47c2a7920c2 2176 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 2177 {
bobbery 0:b47c2a7920c2 2178 STATIC_ASSERT((etl::is_one_of<T, T1, T2, T3>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 2179
bobbery 0:b47c2a7920c2 2180 void* p = data;
bobbery 0:b47c2a7920c2 2181 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 2182 }
bobbery 0:b47c2a7920c2 2183
bobbery 0:b47c2a7920c2 2184 //********************************************
bobbery 0:b47c2a7920c2 2185 ~message_packet()
bobbery 0:b47c2a7920c2 2186 {
bobbery 0:b47c2a7920c2 2187 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 2188 }
bobbery 0:b47c2a7920c2 2189
bobbery 0:b47c2a7920c2 2190 //********************************************
bobbery 0:b47c2a7920c2 2191 etl::imessage& get()
bobbery 0:b47c2a7920c2 2192 {
bobbery 0:b47c2a7920c2 2193 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 2194 }
bobbery 0:b47c2a7920c2 2195
bobbery 0:b47c2a7920c2 2196 //********************************************
bobbery 0:b47c2a7920c2 2197 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 2198 {
bobbery 0:b47c2a7920c2 2199 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 2200 }
bobbery 0:b47c2a7920c2 2201
bobbery 0:b47c2a7920c2 2202 enum
bobbery 0:b47c2a7920c2 2203 {
bobbery 0:b47c2a7920c2 2204 SIZE = etl::largest<T1, T2, T3>::size,
bobbery 0:b47c2a7920c2 2205 ALIGNMENT = etl::largest<T1, T2, T3>::alignment
bobbery 0:b47c2a7920c2 2206 };
bobbery 0:b47c2a7920c2 2207
bobbery 0:b47c2a7920c2 2208 private:
bobbery 0:b47c2a7920c2 2209
bobbery 0:b47c2a7920c2 2210 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 2211 };
bobbery 0:b47c2a7920c2 2212
bobbery 0:b47c2a7920c2 2213 //**********************************************
bobbery 0:b47c2a7920c2 2214 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 2215 : imessage_router(id_)
bobbery 0:b47c2a7920c2 2216 {
bobbery 0:b47c2a7920c2 2217 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 2218 }
bobbery 0:b47c2a7920c2 2219
bobbery 0:b47c2a7920c2 2220 //**********************************************
bobbery 0:b47c2a7920c2 2221 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 2222 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 2223 {
bobbery 0:b47c2a7920c2 2224 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 2225 }
bobbery 0:b47c2a7920c2 2226
bobbery 0:b47c2a7920c2 2227 //**********************************************
bobbery 0:b47c2a7920c2 2228 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 2229 {
bobbery 0:b47c2a7920c2 2230 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 2231 }
bobbery 0:b47c2a7920c2 2232
bobbery 0:b47c2a7920c2 2233 //**********************************************
bobbery 0:b47c2a7920c2 2234 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 2235 {
bobbery 0:b47c2a7920c2 2236 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 2237
bobbery 0:b47c2a7920c2 2238 switch (id)
bobbery 0:b47c2a7920c2 2239 {
bobbery 0:b47c2a7920c2 2240 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 2241 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 2242 case T3::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T3&>(msg)); break;
bobbery 0:b47c2a7920c2 2243 default:
bobbery 0:b47c2a7920c2 2244 {
bobbery 0:b47c2a7920c2 2245 if (has_successor())
bobbery 0:b47c2a7920c2 2246 {
bobbery 0:b47c2a7920c2 2247 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 2248 }
bobbery 0:b47c2a7920c2 2249 else
bobbery 0:b47c2a7920c2 2250 {
bobbery 0:b47c2a7920c2 2251 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 2252 }
bobbery 0:b47c2a7920c2 2253 break;
bobbery 0:b47c2a7920c2 2254 }
bobbery 0:b47c2a7920c2 2255 }
bobbery 0:b47c2a7920c2 2256 }
bobbery 0:b47c2a7920c2 2257
bobbery 0:b47c2a7920c2 2258 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 2259
bobbery 0:b47c2a7920c2 2260 //**********************************************
bobbery 0:b47c2a7920c2 2261 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 2262 {
bobbery 0:b47c2a7920c2 2263 switch (id)
bobbery 0:b47c2a7920c2 2264 {
bobbery 0:b47c2a7920c2 2265 case T1::ID: case T2::ID: case T3::ID:
bobbery 0:b47c2a7920c2 2266 return true; break;
bobbery 0:b47c2a7920c2 2267 default:
bobbery 0:b47c2a7920c2 2268 return false; break;
bobbery 0:b47c2a7920c2 2269 }
bobbery 0:b47c2a7920c2 2270 }
bobbery 0:b47c2a7920c2 2271 };
bobbery 0:b47c2a7920c2 2272
bobbery 0:b47c2a7920c2 2273 //***************************************************************************
bobbery 0:b47c2a7920c2 2274 // Specialisation for 2 message types.
bobbery 0:b47c2a7920c2 2275 //***************************************************************************
bobbery 0:b47c2a7920c2 2276 template <typename TDerived,
bobbery 0:b47c2a7920c2 2277 typename T1, typename T2>
bobbery 0:b47c2a7920c2 2278 class message_router<TDerived, T1, T2, void, void, void, void, void, void, void, void, void, void, void, void, void, void>
bobbery 0:b47c2a7920c2 2279 : public imessage_router
bobbery 0:b47c2a7920c2 2280 {
bobbery 0:b47c2a7920c2 2281 public:
bobbery 0:b47c2a7920c2 2282
bobbery 0:b47c2a7920c2 2283 //**********************************************
bobbery 0:b47c2a7920c2 2284 class message_packet
bobbery 0:b47c2a7920c2 2285 {
bobbery 0:b47c2a7920c2 2286 public:
bobbery 0:b47c2a7920c2 2287
bobbery 0:b47c2a7920c2 2288 //********************************************
bobbery 0:b47c2a7920c2 2289 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 2290 {
bobbery 0:b47c2a7920c2 2291 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 2292
bobbery 0:b47c2a7920c2 2293 void* p = data;
bobbery 0:b47c2a7920c2 2294
bobbery 0:b47c2a7920c2 2295 switch (id)
bobbery 0:b47c2a7920c2 2296 {
bobbery 0:b47c2a7920c2 2297 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 2298 case T2::ID: ::new (p) T2(static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 2299 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 2300 }
bobbery 0:b47c2a7920c2 2301 }
bobbery 0:b47c2a7920c2 2302
bobbery 0:b47c2a7920c2 2303 //********************************************
bobbery 0:b47c2a7920c2 2304 template <typename T>
bobbery 0:b47c2a7920c2 2305 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 2306 {
bobbery 0:b47c2a7920c2 2307 STATIC_ASSERT((etl::is_one_of<T, T1, T2>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 2308
bobbery 0:b47c2a7920c2 2309 void* p = data;
bobbery 0:b47c2a7920c2 2310 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 2311 }
bobbery 0:b47c2a7920c2 2312
bobbery 0:b47c2a7920c2 2313 //********************************************
bobbery 0:b47c2a7920c2 2314 ~message_packet()
bobbery 0:b47c2a7920c2 2315 {
bobbery 0:b47c2a7920c2 2316 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 2317 }
bobbery 0:b47c2a7920c2 2318
bobbery 0:b47c2a7920c2 2319 //********************************************
bobbery 0:b47c2a7920c2 2320 etl::imessage& get()
bobbery 0:b47c2a7920c2 2321 {
bobbery 0:b47c2a7920c2 2322 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 2323 }
bobbery 0:b47c2a7920c2 2324
bobbery 0:b47c2a7920c2 2325 //********************************************
bobbery 0:b47c2a7920c2 2326 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 2327 {
bobbery 0:b47c2a7920c2 2328 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 2329 }
bobbery 0:b47c2a7920c2 2330
bobbery 0:b47c2a7920c2 2331 enum
bobbery 0:b47c2a7920c2 2332 {
bobbery 0:b47c2a7920c2 2333 SIZE = etl::largest<T1, T2>::size,
bobbery 0:b47c2a7920c2 2334 ALIGNMENT = etl::largest<T1, T2>::alignment
bobbery 0:b47c2a7920c2 2335 };
bobbery 0:b47c2a7920c2 2336
bobbery 0:b47c2a7920c2 2337 private:
bobbery 0:b47c2a7920c2 2338
bobbery 0:b47c2a7920c2 2339 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 2340 };
bobbery 0:b47c2a7920c2 2341
bobbery 0:b47c2a7920c2 2342 //**********************************************
bobbery 0:b47c2a7920c2 2343 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 2344 : imessage_router(id_)
bobbery 0:b47c2a7920c2 2345 {
bobbery 0:b47c2a7920c2 2346 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 2347 }
bobbery 0:b47c2a7920c2 2348
bobbery 0:b47c2a7920c2 2349 //**********************************************
bobbery 0:b47c2a7920c2 2350 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 2351 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 2352 {
bobbery 0:b47c2a7920c2 2353 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 2354 }
bobbery 0:b47c2a7920c2 2355
bobbery 0:b47c2a7920c2 2356 //**********************************************
bobbery 0:b47c2a7920c2 2357 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 2358 {
bobbery 0:b47c2a7920c2 2359 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 2360 }
bobbery 0:b47c2a7920c2 2361
bobbery 0:b47c2a7920c2 2362 //**********************************************
bobbery 0:b47c2a7920c2 2363 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 2364 {
bobbery 0:b47c2a7920c2 2365 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 2366
bobbery 0:b47c2a7920c2 2367 switch (id)
bobbery 0:b47c2a7920c2 2368 {
bobbery 0:b47c2a7920c2 2369 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 2370 case T2::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T2&>(msg)); break;
bobbery 0:b47c2a7920c2 2371 default:
bobbery 0:b47c2a7920c2 2372 {
bobbery 0:b47c2a7920c2 2373 if (has_successor())
bobbery 0:b47c2a7920c2 2374 {
bobbery 0:b47c2a7920c2 2375 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 2376 }
bobbery 0:b47c2a7920c2 2377 else
bobbery 0:b47c2a7920c2 2378 {
bobbery 0:b47c2a7920c2 2379 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 2380 }
bobbery 0:b47c2a7920c2 2381 break;
bobbery 0:b47c2a7920c2 2382 }
bobbery 0:b47c2a7920c2 2383 }
bobbery 0:b47c2a7920c2 2384 }
bobbery 0:b47c2a7920c2 2385
bobbery 0:b47c2a7920c2 2386 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 2387
bobbery 0:b47c2a7920c2 2388 //**********************************************
bobbery 0:b47c2a7920c2 2389 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 2390 {
bobbery 0:b47c2a7920c2 2391 switch (id)
bobbery 0:b47c2a7920c2 2392 {
bobbery 0:b47c2a7920c2 2393 case T1::ID: case T2::ID:
bobbery 0:b47c2a7920c2 2394 return true; break;
bobbery 0:b47c2a7920c2 2395 default:
bobbery 0:b47c2a7920c2 2396 return false; break;
bobbery 0:b47c2a7920c2 2397 }
bobbery 0:b47c2a7920c2 2398 }
bobbery 0:b47c2a7920c2 2399 };
bobbery 0:b47c2a7920c2 2400
bobbery 0:b47c2a7920c2 2401 //***************************************************************************
bobbery 0:b47c2a7920c2 2402 // Specialisation for 1 message type.
bobbery 0:b47c2a7920c2 2403 //***************************************************************************
bobbery 0:b47c2a7920c2 2404 template <typename TDerived,
bobbery 0:b47c2a7920c2 2405 typename T1>
bobbery 0:b47c2a7920c2 2406 class message_router<TDerived, T1, void, void, void, void, void, void, void, void, void, void, void, void, void, void, void>
bobbery 0:b47c2a7920c2 2407 : public imessage_router
bobbery 0:b47c2a7920c2 2408 {
bobbery 0:b47c2a7920c2 2409 public:
bobbery 0:b47c2a7920c2 2410
bobbery 0:b47c2a7920c2 2411 //**********************************************
bobbery 0:b47c2a7920c2 2412 class message_packet
bobbery 0:b47c2a7920c2 2413 {
bobbery 0:b47c2a7920c2 2414 public:
bobbery 0:b47c2a7920c2 2415
bobbery 0:b47c2a7920c2 2416 //********************************************
bobbery 0:b47c2a7920c2 2417 explicit message_packet(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 2418 {
bobbery 0:b47c2a7920c2 2419 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 2420
bobbery 0:b47c2a7920c2 2421 void* p = data;
bobbery 0:b47c2a7920c2 2422
bobbery 0:b47c2a7920c2 2423 switch (id)
bobbery 0:b47c2a7920c2 2424 {
bobbery 0:b47c2a7920c2 2425 case T1::ID: ::new (p) T1(static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 2426 default: ETL_ASSERT(false, ETL_ERROR(unhandled_message_exception)); break;
bobbery 0:b47c2a7920c2 2427 }
bobbery 0:b47c2a7920c2 2428 }
bobbery 0:b47c2a7920c2 2429
bobbery 0:b47c2a7920c2 2430 //********************************************
bobbery 0:b47c2a7920c2 2431 template <typename T>
bobbery 0:b47c2a7920c2 2432 explicit message_packet(const T& msg)
bobbery 0:b47c2a7920c2 2433 {
bobbery 0:b47c2a7920c2 2434 STATIC_ASSERT((etl::is_one_of<T, T1>::value), "Unsupported type for this message packet");
bobbery 0:b47c2a7920c2 2435
bobbery 0:b47c2a7920c2 2436 void* p = data;
bobbery 0:b47c2a7920c2 2437 ::new (p) T(static_cast<const T&>(msg));
bobbery 0:b47c2a7920c2 2438 }
bobbery 0:b47c2a7920c2 2439
bobbery 0:b47c2a7920c2 2440 //********************************************
bobbery 0:b47c2a7920c2 2441 ~message_packet()
bobbery 0:b47c2a7920c2 2442 {
bobbery 0:b47c2a7920c2 2443 static_cast<etl::imessage*>(data)->~imessage();
bobbery 0:b47c2a7920c2 2444 }
bobbery 0:b47c2a7920c2 2445
bobbery 0:b47c2a7920c2 2446 //********************************************
bobbery 0:b47c2a7920c2 2447 etl::imessage& get()
bobbery 0:b47c2a7920c2 2448 {
bobbery 0:b47c2a7920c2 2449 return *static_cast<etl::imessage*>(data);
bobbery 0:b47c2a7920c2 2450 }
bobbery 0:b47c2a7920c2 2451
bobbery 0:b47c2a7920c2 2452 //********************************************
bobbery 0:b47c2a7920c2 2453 const etl::imessage& get() const
bobbery 0:b47c2a7920c2 2454 {
bobbery 0:b47c2a7920c2 2455 return *static_cast<const etl::imessage*>(data);
bobbery 0:b47c2a7920c2 2456 }
bobbery 0:b47c2a7920c2 2457
bobbery 0:b47c2a7920c2 2458 enum
bobbery 0:b47c2a7920c2 2459 {
bobbery 0:b47c2a7920c2 2460 SIZE = etl::largest<T1>::size,
bobbery 0:b47c2a7920c2 2461 ALIGNMENT = etl::largest<T1>::alignment
bobbery 0:b47c2a7920c2 2462 };
bobbery 0:b47c2a7920c2 2463
bobbery 0:b47c2a7920c2 2464 private:
bobbery 0:b47c2a7920c2 2465
bobbery 0:b47c2a7920c2 2466 typename etl::aligned_storage<SIZE, ALIGNMENT>::type data;
bobbery 0:b47c2a7920c2 2467 };
bobbery 0:b47c2a7920c2 2468
bobbery 0:b47c2a7920c2 2469 //**********************************************
bobbery 0:b47c2a7920c2 2470 message_router(etl::message_router_id_t id_)
bobbery 0:b47c2a7920c2 2471 : imessage_router(id_)
bobbery 0:b47c2a7920c2 2472 {
bobbery 0:b47c2a7920c2 2473 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 2474 }
bobbery 0:b47c2a7920c2 2475
bobbery 0:b47c2a7920c2 2476 //**********************************************
bobbery 0:b47c2a7920c2 2477 message_router(etl::message_router_id_t id_, etl::imessage_router& successor_)
bobbery 0:b47c2a7920c2 2478 : imessage_router(id_, successor_)
bobbery 0:b47c2a7920c2 2479 {
bobbery 0:b47c2a7920c2 2480 ETL_ASSERT(id_ <= etl::imessage_router::MAX_MESSAGE_ROUTER, ETL_ERROR(etl::message_router_illegal_id));
bobbery 0:b47c2a7920c2 2481 }
bobbery 0:b47c2a7920c2 2482
bobbery 0:b47c2a7920c2 2483 //**********************************************
bobbery 0:b47c2a7920c2 2484 void receive(const etl::imessage& msg)
bobbery 0:b47c2a7920c2 2485 {
bobbery 0:b47c2a7920c2 2486 receive(etl::null_message_router::instance(), msg);
bobbery 0:b47c2a7920c2 2487 }
bobbery 0:b47c2a7920c2 2488
bobbery 0:b47c2a7920c2 2489 //**********************************************
bobbery 0:b47c2a7920c2 2490 void receive(etl::imessage_router& source, const etl::imessage& msg)
bobbery 0:b47c2a7920c2 2491 {
bobbery 0:b47c2a7920c2 2492 const size_t id = msg.message_id;
bobbery 0:b47c2a7920c2 2493
bobbery 0:b47c2a7920c2 2494 switch (id)
bobbery 0:b47c2a7920c2 2495 {
bobbery 0:b47c2a7920c2 2496 case T1::ID: static_cast<TDerived*>(this)->on_receive(source, static_cast<const T1&>(msg)); break;
bobbery 0:b47c2a7920c2 2497 default:
bobbery 0:b47c2a7920c2 2498 {
bobbery 0:b47c2a7920c2 2499 if (has_successor())
bobbery 0:b47c2a7920c2 2500 {
bobbery 0:b47c2a7920c2 2501 get_successor().receive(source, msg);
bobbery 0:b47c2a7920c2 2502 }
bobbery 0:b47c2a7920c2 2503 else
bobbery 0:b47c2a7920c2 2504 {
bobbery 0:b47c2a7920c2 2505 static_cast<TDerived*>(this)->on_receive_unknown(source, msg);
bobbery 0:b47c2a7920c2 2506 }
bobbery 0:b47c2a7920c2 2507 break;
bobbery 0:b47c2a7920c2 2508 }
bobbery 0:b47c2a7920c2 2509 }
bobbery 0:b47c2a7920c2 2510 }
bobbery 0:b47c2a7920c2 2511
bobbery 0:b47c2a7920c2 2512 using imessage_router::accepts;
bobbery 0:b47c2a7920c2 2513
bobbery 0:b47c2a7920c2 2514 //**********************************************
bobbery 0:b47c2a7920c2 2515 bool accepts(etl::message_id_t id) const
bobbery 0:b47c2a7920c2 2516 {
bobbery 0:b47c2a7920c2 2517 switch (id)
bobbery 0:b47c2a7920c2 2518 {
bobbery 0:b47c2a7920c2 2519 case T1::ID:
bobbery 0:b47c2a7920c2 2520 return true; break;
bobbery 0:b47c2a7920c2 2521 default:
bobbery 0:b47c2a7920c2 2522 return false; break;
bobbery 0:b47c2a7920c2 2523 }
bobbery 0:b47c2a7920c2 2524 }
bobbery 0:b47c2a7920c2 2525 };
bobbery 0:b47c2a7920c2 2526 }
bobbery 0:b47c2a7920c2 2527
bobbery 0:b47c2a7920c2 2528 #undef ETL_FILE
bobbery 0:b47c2a7920c2 2529
bobbery 0:b47c2a7920c2 2530 #endif
bobbery 0:b47c2a7920c2 2531