8 #ifndef UNPACK_VECTOR_H_INCLUDED
9 #define UNPACK_VECTOR_H_INCLUDED
12 #ifndef UNPACK_MESSAGE_H_INCLUDED
13 # error Do not include this file directly. Use <detail/unpack_message.h> instead
27 size_t DeserializeInBulk( std::vector<T,A>&, BufferT&,
size_t);
33 size_t DeserializeByItem( std::vector<T,A>&, BufferT&,
size_t);
42 template<
typename VectorT,
53 template<
typename VectorT,
56 struct Deserializer <VectorT, BufferT, fundamental_trait>
58 typedef VectorT vector_type;
61 vector_type::value_type value_type;
63 typedef BufferT buffer_type;
65 typedef fundamental_trait data_type_trait;
68 size_t Read ( vector_type &value,
79 size_t size = count *
sizeof(value_type);
81 value_type *pFirst = &value[0];
82 return buffer.get_range(pFirst, size, offset);
86 size_t Read ( value_type &value,
90 return buffer.get_data( value, offset);
102 struct Deserializer <Hg::BitFieldVector<T,A>, BufferT, packed_trait>
106 vector_type::value_type value_type;
107 typedef BufferT buffer_type;
108 typedef packed_trait data_type_trait;
111 size_t Read ( vector_type &value,
122 size_t size = count *
sizeof(value_type);
124 value_type *pFirst = &(value[0].value());
126 return buffer.get_range(pFirst, size, offset);
130 size_t Read ( value_type &value,
134 return buffer.get_data( value, offset);
142 template<
typename T,
146 struct Deserializer <std::vector<T, A>, BufferT, nested_trait>
148 typedef std::vector<T,A> vector_type;
149 typedef T value_type;
150 typedef BufferT buffer_type;
151 typedef nested_trait data_type_trait;
154 size_t Read ( vector_type &value,
164 size_t bytes_read = 0;
167 for (
size_t index = 0; index < count; ++index)
171 size_t item_offset = offset + bytes_read;
173 bytes_read += Read(value[index], buffer, item_offset);
180 size_t Read ( value_type &value,
187 message_size_trait<typename value_type::format_type>::type size_trait;
192 >(value, buffer, offset);
201 template<
typename T,
205 struct Deserializer <std::vector<T, A>, BufferT, array_trait>
207 typedef std::vector<T,A> vector_type;
209 vector_type::value_type value_type;
211 typedef BufferT buffer_type;
218 < value_type >::type data_type_trait;
221 size_t Read ( vector_type &value,
226 return DeserializeByItem(value, buffer, offset);
230 size_t Read ( value_type &value,
234 return DeserializeArray(value, buffer, offset);
241 template<
typename T,
245 struct Deserializer <std::vector<T, A>, BufferT, vector_trait>
247 typedef std::vector<T, A> vector_type;
249 vector_type::value_type value_type;
250 typedef BufferT buffer_type;
257 < value_type >::type data_type_trait;
260 size_t Read ( vector_type &value,
265 return DeserializeByItem(value, buffer, offset);
269 size_t Read ( value_type &value,
273 size_t bytes_written =
274 DeserializeVector(value, value.size(), buffer, offset);
276 return bytes_written;
289 size_t DeserializeInBulk( std::vector<T,A> &value,
294 typedef std::vector<T,A> vector_type;
297 vector_type::value_type data_type;
299 vector_type::allocator_type allocator_type;
306 < data_type >::type data_type_trait;
315 deserializer_t deserializer;
316 size_t bytes_written = 0;
320 for (
size_t index = 0; index < count; ++index)
324 size_t item_offset = offset + bytes_written;
328 deserializer.Read( value[index], buffer, item_offset);
330 bytes_written += read_len;
333 return bytes_written;
349 size_t DeserializeByItem( std::vector<T,A> &value,
353 typedef std::vector<T,A> vector_type;
356 vector_type::value_type data_type;
358 vector_type::allocator_type allocator_type;
365 < data_type >::type data_type_trait;
367 Vector::Deserializer< vector_type,
369 data_type_trait> deserializer;
371 size_t count = value.size();
372 size_t bytes_written = 0;
375 for (
size_t index = 0; index < count; ++index)
379 size_t item_offset = offset + bytes_written;
383 deserializer.Read( value[index], buffer, item_offset);
385 bytes_written += read_len;
388 return bytes_written;
397 template <
typename,
typename>
class VectorT
399 size_t DeserializeVector (VectorT<T, A> &value,
407 typedef VectorT<T, A> vector_type;
409 typedef T value_type;
413 < value_type >::type value_type_trait;
418 typedef Vector::Deserializer< vector_type,
423 deserializer_t deserializer;
424 return deserializer.Read(value, count, buffer, offset);
438 template<
size_t IdxT,
442 struct UnpackDatum< IdxT,
451 typename MsgT::format_type
455 proxy_type::value_type value_type;
457 value_type::value_type data_type;
459 typedef MsgT message_type;
461 typedef BufferT buffer_type;
473 void operator()( message_type &msg,
474 const buffer_type &buffer,
475 size_t &dynamic_offset)
481 size_t count = msg.Size(buffer, &msg.template FieldAt<IdxT>());
490 value_type& value = msg.template FieldAt<IdxT>().
get();
494 DeserializeVector(value, count, buffer, offset);
496 dynamic_offset += bytes_read;