11#ifndef LINK16_MESSAGEDEFINES_HPP
12#define LINK16_MESSAGEDEFINES_HPP
18#include "UtMemory.hpp"
31#define DEFINE_VIRTUAL_TRANSERS__() \
32 virtual void TransferI(MessageBitInput& aMR) { Transfer(aMR); } \
33 virtual void TransferO(MessageBitOutput& aMW) { Transfer(aMW); } \
34 virtual void CreateAccessor(MessageAccessorFiller& aMP) { Transfer(aMP); }
37#define DEFINE_INITIAL(_LABEL_, _SUB_LABEL_) \
39 virtual InitialBase* Clone() const { return new Initial(*this); } \
42 static const unsigned int ___RequiredMessageSize = 57; \
45 virtual void GetLabel(int& aLabel, int& aSubLabel) const \
48 aSubLabel = _SUB_LABEL_; \
50 virtual int GetUID() const { return (_LABEL_ * 100 + _SUB_LABEL_) * 1000; } \
51 static const int cWORD_LABEL = _LABEL_; \
52 static const int cWORD_SUB_LABEL = _SUB_LABEL_; \
53 DEFINE_VIRTUAL_TRANSERS__()
56#define DEFINE_EXTENSION(_LABEL_, _SUB_LABEL_, _EXT_NUM_) \
58 virtual ExtensionBase* Clone() const { return new Extension##_EXT_NUM_(*this); } \
61 static const unsigned int ___RequiredMessageSize = 68; \
64 static const unsigned int cEXTENSION_NUMBER = _EXT_NUM_; \
65 virtual int GetExtensionNumber() const { return cEXTENSION_NUMBER; } \
66 virtual int GetUID() const { return (_LABEL_ * 100 + _SUB_LABEL_) * 1000 + _EXT_NUM_ + 1; } \
67 static const int cWORD_LABEL = _LABEL_; \
68 static const int cWORD_SUB_LABEL = _SUB_LABEL_; \
69 DEFINE_VIRTUAL_TRANSERS__()
72#define DEFINE_CONTINUATION(_LABEL_, _SUB_LABEL_, _CONT_NUM_) \
74 virtual ContinuationBase* Clone() const { return new Continuation##_CONT_NUM_(*this); } \
77 static const unsigned int ___RequiredMessageSize = 63; \
80 static const unsigned int cCONTINUATION_NUMBER = _CONT_NUM_; \
81 virtual int GetLabel() const { return _CONT_NUM_; } \
82 virtual int GetUID() const { return (_LABEL_ * 100 + _SUB_LABEL_) * 1000 + _CONT_NUM_ * 10; } \
83 static const int cWORD_LABEL = _LABEL_; \
84 static const int cWORD_SUB_LABEL = _SUB_LABEL_; \
85 DEFINE_VIRTUAL_TRANSERS__()
103#define DEFINE_CONT_CASE__(NUM) \
105 return ut::make_unique<Continuation##NUM>();
106#define DEFINE_CONT_CASE2__(N1, N2) DEFINE_CONT_CASE__(N1) DEFINE_CONT_CASE__(N2)
107#define DEFINE_CONT_CASE4__(N1, N2, N3, N4) DEFINE_CONT_CASE2__(N1, N2) DEFINE_CONT_CASE2__(N3, N4)
108#define DEFINE_CONT_CASE8__(N1, N2, N3, N4, N5, N6, N7, N8) \
109 DEFINE_CONT_CASE4__(N1, N2, N3, N4) DEFINE_CONT_CASE4__(N5, N6, N7, N8)
111#define DEFINE_CONT_DEFS(NUM) using Continuation##NUM##Type = Continuation##NUM;
112#define DEFINE_CONT_DEFS2(N1, N2) DEFINE_CONT_DEFS(N1) DEFINE_CONT_DEFS(N2)
113#define DEFINE_CONT_DEFS3(N1, N2, N3) DEFINE_CONT_DEFS2(N1, N2) DEFINE_CONT_DEFS(N3)
114#define DEFINE_CONT_DEFS4(N1, N2, N3, N4) DEFINE_CONT_DEFS2(N1, N2) DEFINE_CONT_DEFS2(N3, N4)
115#define DEFINE_CONT_DEFS8(N1, N2, N3, N4, N5, N6, N7, N8) \
116 DEFINE_CONT_DEFS4(N1, N2, N3, N4) DEFINE_CONT_DEFS4(N5, N6, N7, N8)
119#define DEFINE_CONTINUATIONS12(N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11, N12) \
120 DEFINE_CONT_DEFS8(N1, N2, N3, N4, N5, N6, N7, N8) \
121 DEFINE_CONT_DEFS4(N9, N10, N11, N12) std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override \
125 DEFINE_CONT_CASE8__(N1, N2, N3, N4, N5, N6, N7, N8) DEFINE_CONT_CASE4__(N9, N10, N11, N12) \
129#define DEFINE_CONTINUATIONS11(N1, N2, N3, N4, N5, N6, N7, N8, N9, N10, N11) \
130 DEFINE_CONT_DEFS8(N1, N2, N3, N4, N5, N6, N7, N8) \
131 DEFINE_CONT_DEFS3(N9, N10, N11) std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override \
135 DEFINE_CONT_CASE8__(N1, N2, N3, N4, N5, N6, N7, N8) DEFINE_CONT_CASE2__(N9, N10) DEFINE_CONT_CASE__(N11) \
139#define DEFINE_CONTINUATIONS10(N1, N2, N3, N4, N5, N6, N7, N8, N9, N10) \
140 DEFINE_CONT_DEFS8(N1, N2, N3, N4, N5, N6, N7, N8) \
141 DEFINE_CONT_DEFS2(N9, N10) std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override \
145 DEFINE_CONT_CASE8__(N1, N2, N3, N4, N5, N6, N7, N8) DEFINE_CONT_CASE2__(N9, N10) \
149#define DEFINE_CONTINUATIONS9(N1, N2, N3, N4, N5, N6, N7, N8, N9) \
150 DEFINE_CONT_DEFS8(N1, N2, N3, N4, N5, N6, N7, N8) \
151 DEFINE_CONT_DEFS(N9) std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override \
155 DEFINE_CONT_CASE8__(N1, N2, N3, N4, N5, N6, N7, N8) DEFINE_CONT_CASE__(N9) \
159#define DEFINE_CONTINUATIONS8(N1, N2, N3, N4, N5, N6, N7, N8) \
160 DEFINE_CONT_DEFS8(N1, N2, N3, N4, N5, N6, N7, N8) \
161 std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override \
165 DEFINE_CONT_CASE8__(N1, N2, N3, N4, N5, N6, N7, N8) \
169#define DEFINE_CONTINUATIONS7(N1, N2, N3, N4, N5, N6, N7) \
170 DEFINE_CONT_DEFS4(N1, N2, N3, N4) \
171 DEFINE_CONT_DEFS3(N5, N6, N7) std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override \
175 DEFINE_CONT_CASE4__(N1, N2, N3, N4) DEFINE_CONT_CASE2__(N5, N6) DEFINE_CONT_CASE__(N7) \
179#define DEFINE_CONTINUATIONS6(N1, N2, N3, N4, N5, N6) \
180 DEFINE_CONT_DEFS4(N1, N2, N3, N4) \
181 DEFINE_CONT_DEFS2(N5, N6) std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override \
185 DEFINE_CONT_CASE4__(N1, N2, N3, N4) DEFINE_CONT_CASE2__(N5, N6) \
189#define DEFINE_CONTINUATIONS5(N1, N2, N3, N4, N5) \
190 DEFINE_CONT_DEFS4(N1, N2, N3, N4) \
191 DEFINE_CONT_DEFS(N5) std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override \
195 DEFINE_CONT_CASE4__(N1, N2, N3, N4) DEFINE_CONT_CASE__(N5) \
199#define DEFINE_CONTINUATIONS4(N1, N2, N3, N4) \
200 DEFINE_CONT_DEFS4(N1, N2, N3, N4) std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override \
204 DEFINE_CONT_CASE4__(N1, N2, N3, N4) \
208#define DEFINE_CONTINUATIONS3(N1, N2, N3) \
209 DEFINE_CONT_DEFS2(N1, N2) \
210 DEFINE_CONT_DEFS(N3) std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override \
214 DEFINE_CONT_CASE2__(N1, N2) DEFINE_CONT_CASE__(N3) \
218#define DEFINE_CONTINUATIONS2(N1, N2) \
219 DEFINE_CONT_DEFS2(N1, N2) std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override \
223 DEFINE_CONT_CASE2__(N1, N2) \
227#define DEFINE_CONTINUATIONS1(N1) \
228 DEFINE_CONT_DEFS(N1) std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override \
232 DEFINE_CONT_CASE__(N1) \
236#define DEFINE_CONTINUATIONS0() \
237 std::unique_ptr<ContinuationBase> CreateContinuationWord(int lbl) override { return nullptr; }
240#define DEFINE_EXTENSIONS0() \
241 std::unique_ptr<ExtensionBase> CreateExtensionWord(int ) override { return nullptr; }
242#define DEFINE_EXTENSIONS1() \
243 typedef Extension0 Extension0Type; \
244 std::unique_ptr<ExtensionBase> CreateExtensionWord(int aEn) override \
249 return ut::make_unique<Extension0>(); \
254#define DEFINE_EXTENSIONS2() \
255 typedef Extension0 Extension0Type; \
256 typedef Extension1 Extension1Type; \
257 std::unique_ptr<ExtensionBase> CreateExtensionWord(int aEn) override \
262 return ut::make_unique<Extension0>(); \
264 return ut::make_unique<Extension1>(); \
269#define DEFINE_EXTENSIONS3() \
270 typedef Extension0 Extension0Type; \
271 typedef Extension1 Extension1Type; \
272 typedef Extension2 Extension2Type; \
273 std::unique_ptr<ExtensionBase> CreateExtensionWord(int aEn) override \
278 return ut::make_unique<Extension0>(); \
280 return ut::make_unique<Extension1>(); \
282 return ut::make_unique<Extension2>(); \
293template<
typename INIT_TYPE,
typename SUB_WORD,
typename WORD_TYPE_TAG,
unsigned CORRECT_SUB_TYPE>
298template<
typename INIT_TYPE,
typename SUB_WORD>
301 static bool FindWord(INIT_TYPE& aInitial, SUB_WORD*& aContinuation)
303 aContinuation =
static_cast<SUB_WORD*
>(aInitial.FindContinuation(SUB_WORD::cCONTINUATION_NUMBER));
304 return aContinuation !=
nullptr;
308template<
typename INIT_TYPE,
typename SUB_WORD>
311 static bool FindWord(INIT_TYPE& aInitial, SUB_WORD*& aExtension)
313 if (aInitial.GetExtensionCount() > SUB_WORD::cEXTENSION_NUMBER)
315 aExtension =
static_cast<SUB_WORD*
>(aInitial.GetExtension(SUB_WORD::cEXTENSION_NUMBER));
319 aExtension =
nullptr;
321 return aExtension !=
nullptr;
325template<
typename INIT_TYPE,
typename SUB_WORD>
326inline bool FindWordT(INIT_TYPE& aInitialWord, SUB_WORD*& aSubWord)
328 const bool correctSubType =
329 (INIT_TYPE::cWORD_LABEL == SUB_WORD::cWORD_LABEL) && (INIT_TYPE::cWORD_SUB_LABEL == SUB_WORD::cWORD_SUB_LABEL);
331 return Finder::FindWord(aInitialWord, aSubWord);
std::vector< ScenarioAnalyzerMessage > Messages
Definition ScenarioAnalyzerUtilities.hpp:67
The base class for J-Message ContinuationBase words.
Definition Messages.hpp:168
Definition Messages.hpp:183
Definition ComputerPart.hpp:45
bool FindWordT(INIT_TYPE &aInitialWord, SUB_WORD *&aSubWord)
Definition MessageDefines.hpp:326
This file should be included prior to defining a message. Currently there is a limit of 32 fields per...
Definition AllMessages.hpp:55
static bool FindWord(INIT_TYPE &aInitial, SUB_WORD *&aContinuation)
Definition MessageDefines.hpp:301
static bool FindWord(INIT_TYPE &aInitial, SUB_WORD *&aExtension)
Definition MessageDefines.hpp:311
Definition MessageDefines.hpp:295