8 #ifndef UNPACK_MESSAGE_DETAIL_H_INCLUDED
9 #define UNPACK_MESSAGE_DETAIL_H_INCLUDED
12 #ifndef UNPACK_MESSAGE_H_INCLUDED
13 # error Do not include this file directly. Use <detail/unpack_message.h> instead
36 template<
size_t IdxT,
51 void operator()(MsgT &msg,
53 size_t dynamic_offset)
57 typename MsgT::format_type
60 proxy_type::value_type value_type;
65 buffer.get_data(msg.template FieldAt<IdxT>().get(),
74 template<
size_t IdxT,
78 void ReadDatum( MsgT& message,
79 const BufferT& buffer,
80 size_t& dynamic_offset)
84 typename MsgT::format_type
87 proxy_type::value_type value_type;
92 typename DeduceTypeTrait<value_type>::type
94 unpack(message, buffer, dynamic_offset);
107 template <
size_t Idx,
112 struct UnpackMessageWorker
114 void operator()( MsgT &msg,
115 const BufferT &buffer )
118 size_t dynamic_offset = 0;
119 ReadDatum< Idx, MsgT, BufferT>(msg, buffer, dynamic_offset);
121 UnpackMessageWorker < Idx+1, Count, MsgT, BufferT> unpack;
125 void operator()( MsgT &msg,
126 const BufferT &buffer,
127 size_t &dynamic_offset)
130 ReadDatum< Idx, MsgT, BufferT>(msg, buffer, dynamic_offset);
132 UnpackMessageWorker < Idx+1, Count, MsgT, BufferT> unpack;
133 unpack(msg, buffer, dynamic_offset);
142 template <
size_t Idx,
146 struct UnpackMessageWorker< Idx,
152 void operator()( MsgT& msg,
153 const BufferT& buffer)
156 void operator()( MsgT& msg,
157 const BufferT& buffer,
158 size_t dynamic_offset)
172 template<
typename MsgT,
176 const BufferT &buffer,
177 const static_size_trait& )
182 || buffer.size() < k_msg_size)
184 #ifdef ALCHEMY_USES_EXCEPTIONS
185 throw std::length_error(
"Static unpack_message does not have enough space to complete its operation.");
191 detail::UnpackMessageWorker < 0,
196 unpack(msg_values, buffer);
212 template<
typename MsgT,
216 const BufferT &buffer,
218 const static_size_trait& )
221 std::remove_const<BufferT>::type MutableBuffer;
226 size_t org_offset = buffer.offset();
227 MutableBuffer working(buffer);
228 working.offset(offset+org_offset);
229 detail::UnpackMessageWorker < 0,
234 unpack(msg_values, working);
249 template<
typename MsgT,
253 const BufferT &buffer,
254 const dynamic_size_trait& )
260 || buffer.size() < k_msg_size)
262 #ifdef ALCHEMY_USES_EXCEPTIONS
263 throw std::length_error(
"Dynamic unpack_message does not have enough space to complete its operation.");
269 detail::UnpackMessageWorker < 0,
274 size_t dynamic_offset = 0;
275 unpack(msg_values, buffer, dynamic_offset);
291 template<
typename MsgT,
295 const BufferT &buffer,
297 const dynamic_size_trait& )
300 std::remove_const<BufferT>::type MutableBuffer;
305 size_t org_offset = buffer.offset();
306 MutableBuffer working(buffer);
307 working.offset(offset+org_offset);
308 detail::UnpackMessageWorker < 0,
313 size_t dynamic_offset = 0;
314 unpack(msg_values, working, dynamic_offset);
316 return length + dynamic_offset;