10 #ifndef PACK_MESSAGE_DETAIL_H_INCLUDED
11 #define PACK_MESSAGE_DETAIL_H_INCLUDED
14 #ifndef PACK_MESSAGE_H_INCLUDED
15 # error Do not include this file directly. Use <detail/pack_message.h> instead
33 template<
size_t IdxT,
48 void operator()(MsgT &msg,
50 size_t dynamic_offset)
55 typename MsgT::format_type
59 proxy_type::value_type value_type;
61 value_type &value = msg.template FieldAt<IdxT>().
get();
64 buffer.set_data(value, offset);
73 template<
size_t IdxT,
77 void WriteDatum(MsgT& message,
79 size_t& dynamic_offset)
83 typename MsgT::format_type
86 proxy_type::value_type value_type;
91 typename DeduceTypeTrait<value_type>::type
93 pack(message, buffer, dynamic_offset);
106 template <
size_t Idx,
111 struct PackMessageWorker
113 void operator()(MsgT &message,
117 size_t dynamic_offset = 0;
118 WriteDatum< Idx, MsgT, BufferT>(message, buffer,dynamic_offset);
120 PackMessageWorker < Idx+1, Count, MsgT, BufferT> pack;
121 pack(message, buffer);
124 void operator()(MsgT &message,
126 size_t &dynamic_offset)
129 WriteDatum< Idx, MsgT, BufferT>(message, buffer, dynamic_offset);
131 PackMessageWorker < Idx+1, Count, MsgT, BufferT> pack;
132 pack(message, buffer, dynamic_offset);
140 template <
size_t Idx,
144 struct PackMessageWorker< Idx,
150 void operator()(MsgT& msg,
154 void operator()(MsgT& msg,
156 size_t dynamic_offset)
170 template<
typename MsgT,
174 pack_fixed_size_message(MsgT& msg_values,
175 BufferT & fixed_buffer,
176 const static_size_trait&)
183 detail::PackMessageWorker < 0,
188 pack(msg_values, fixed_buffer);
206 template<
typename MsgT,
210 pack_message( MsgT& msg_values,
213 const static_size_trait&)
218 detail::PackMessageWorker < 0,
223 pack(msg_values, buffer);
239 template<
typename MsgT,
242 size_t pack_message(MsgT &msg_values,
245 const static_size_trait&)
250 size_t org_offset = buffer.offset();
257 buffer.offset(offset + org_offset);
258 detail::PackMessageWorker < 0,
263 pack(msg_values, buffer);
265 buffer.offset(org_offset);
285 template<
typename MsgT,
289 pack_message( MsgT &msg_values,
292 const dynamic_size_trait&)
297 detail::PackMessageWorker < 0,
298 Hg::length<typename MsgT::format_type>::value,
302 size_t dynamic_offset = 0;
303 pack(msg_values, buffer, dynamic_offset);
321 template<
typename MsgT,
324 size_t pack_message(MsgT &msg_values,
327 const dynamic_size_trait&)
332 size_t org_offset = buffer.offset();
338 buffer.offset(org_offset + offset);
339 detail::PackMessageWorker < 0,
340 Hg::length<typename MsgT::format_type>::value,
344 size_t dynamic_offset = 0;
345 pack(msg_values, buffer, dynamic_offset);
347 buffer.offset(org_offset);
349 return length + dynamic_offset;