00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037 #ifndef MESSAGE_PREPROCESS_HPP_
00038 #define MESSAGE_PREPROCESS_HPP_
00039 #include <boost/integer/integer_mask.hpp>
00040 #include <boost/preprocessor/seq/for_each.hpp>
00041 #include <boost/preprocessor/tuple/rem.hpp>
00042
00043 #define PP_MSG_FILLER_0(X1,X2,X3, X4,X5) \
00044 ((X1,X2,X3, X4,X5)) PP_MSG_FILLER_1
00045 #define PP_MSG_FILLER_1(X1,X2,X3, X4,X5) \
00046 ((X1,X2,X3, X4,X5)) PP_MSG_FILLER_0
00047 #define PP_MSG_FILLER_0_END
00048 #define PP_MSG_FILLER_1_END
00049
00050 #define DEFINE_TOPSIDE_MESSAGES(seq)\
00051 BOOST_PP_SEQ_FOR_EACH_R(1, ADD_CADDY_MESSAGE2, \
00052 3, BOOST_PP_CAT(PP_MSG_FILLER_0 seq, _END))\
00053 void registerTopsideMessages() \
00054 { \
00055 static bool inited(false); \
00056 if (!inited) \
00057 { \
00058 inited = true; \
00059 BOOST_PP_SEQ_FOR_EACH_R(1, ADD_TO_MAP, \
00060 topsideMap, BOOST_PP_CAT(PP_MSG_FILLER_0 seq, _END))\
00061 } \
00062 };
00063
00064 #define DEFINE_DIVER_MESSAGES(seq)\
00065 BOOST_PP_SEQ_FOR_EACH_R(1, ADD_CADDY_MESSAGE2, \
00066 3, BOOST_PP_CAT(PP_MSG_FILLER_0 seq, _END))\
00067 void registerDiverMessages() \
00068 { \
00069 static bool inited(false); \
00070 if (!inited) \
00071 { \
00072 inited = true; \
00073 BOOST_PP_SEQ_FOR_EACH_R(1, ADD_TO_MAP, \
00074 diverMap, BOOST_PP_CAT(PP_MSG_FILLER_0 seq, _END))\
00075 } \
00076 };
00077
00078 #define ADD_TO_MAP(r, data, elem) \
00079 data[BOOST_PP_TUPLE_ELEM(5,1,elem)] = boost::shared_ptr<BOOST_PP_TUPLE_ELEM(5,0,elem)>(new (BOOST_PP_TUPLE_ELEM(5,0,elem)));
00080
00081 #define ADD_CADDY_MESSAGE2(r, data, elem) \
00082 ADD_CADDY_MESSAGE(BOOST_PP_TUPLE_ELEM(5,0,elem), \
00083 BOOST_PP_TUPLE_ELEM(5,1,elem), \
00084 BOOST_PP_TUPLE_ELEM(5,2,elem), \
00085 BOOST_PP_TUPLE_ELEM(5,3,elem), \
00086 BOOST_PP_TUPLE_ELEM(5,4,elem))
00087
00088 #define ADD_CADDY_MESSAGE(NAME, CODE, DEPTHSIZE, \
00089 LATLONSIZE, MSGSIZE) \
00090 struct NAME : public virtual labust::tritech::Packer\
00091 {\
00092 enum{type=CODE};\
00093 enum{depthSize=DEPTHSIZE,latlonSize=LATLONSIZE,msgSize=MSGSIZE};\
00094 uint64_t pack(DiverMsg& msg) \
00095 { \
00096 return msg.pack<NAME>(); \
00097 } \
00098 void unpack(uint64_t data, DiverMsg& msg) \
00099 { \
00100 msg.unpack<NAME>(data); \
00101 } \
00102 };\
00103
00104
00105 #endif
00106
00107
00108