8 #ifndef UNPACK_ARRAY_H_INCLUDED
9 #define UNPACK_ARRAY_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::array<T,N>&, BufferT&,
size_t);
34 size_t DeserializeByItem( std::array<T,N>&, BufferT&,
size_t);
42 template <
typename,
typename>
class VectorT
44 size_t DeserializeVector (VectorT<T, A> &value,
53 template <
typename,
size_t>
class ArrayT
55 size_t DeserializeArray ( ArrayT<T, N> &value,
68 template<
typename ArrayT,
74 typedef ArrayT array_type;
77 array_type::value_type value_type;
79 typedef BufferT buffer_type;
81 typedef TraitT data_type_trait;
84 const size_t value = Hg::detail::array_size<array_type>::value;
87 size_t Read ( array_type &value,
98 size_t size = count *
sizeof(value_type);
100 value_type *pFirst = &value[0];
101 return buffer.get_range(pFirst, size, offset);
106 size_t Read ( value_type &value,
110 return buffer.get_data( value, offset);
119 template<
typename T,
123 struct Deserializer <Hg::BitFieldArray<T,N>, BufferT, packed_trait>
124 :
public std::integral_constant<size_t, N>
128 array_type::value_type value_type;
129 typedef BufferT buffer_type;
130 typedef packed_trait data_type_trait;
133 size_t Read ( array_type &value,
144 size_t size = count *
sizeof(value_type);
146 value_type *pFirst = &(value[0].value());
148 return buffer.get_range(pFirst, size, offset);
152 size_t Read ( value_type &value,
156 return buffer.get_data( value, offset);
164 template<
typename T,
168 struct Deserializer <std::array<T,N>, BufferT, nested_trait>
169 :
public std::integral_constant<size_t, N>
171 typedef std::array<T,N> array_type;
172 typedef T value_type;
173 typedef BufferT buffer_type;
174 typedef nested_trait data_type_trait;
177 size_t Read ( array_type &value,
187 size_t bytes_read = 0;
190 for (
size_t index = 0; index < count; ++index)
194 size_t item_offset = offset + bytes_read;
196 bytes_read += Read(value[index], buffer, item_offset);
203 size_t Read ( value_type &value,
210 message_size_trait<typename value_type::format_type>::type size_trait;
215 >(value, buffer, offset);
228 struct Deserializer <std::array<T,N>, BufferT, array_trait>
229 :
public std::integral_constant<size_t, N>
231 typedef std::array<T,N> array_type;
234 array_type::value_type value_type;
236 typedef BufferT buffer_type;
243 < value_type >::type data_type_trait;
246 size_t Read ( array_type &value,
251 return DeserializeByItem(value, buffer, offset);
255 template<
class SubT,
258 template <
class,
size_t>
class ArrayT
260 size_t Read ( ArrayT<SubT,SubN> &value,
265 ArrayT<SubT,SubN> sub_array_type;
267 sub_array_type::value_type data_type;
269 const size_t k_sub_count = Hg::detail::array_size<sub_array_type>::value;
276 size_t bytes_written =
277 DeserializeArray( value, buffer, offset);
279 return bytes_written;
286 template<
typename T,
290 struct Deserializer <std::array<T,N>, BufferT, vector_trait>
291 :
public std::integral_constant<size_t, N>
293 typedef std::array<T,N> array_type;
294 typedef T value_type;
295 typedef BufferT buffer_type;
302 < value_type >::type data_type_trait;
305 size_t Read ( array_type &value,
310 return DeserializeByItem(value, count, buffer, offset);
314 size_t Read ( value_type &value,
319 value_type::value_type data_type;
324 size_t bytes_written =
325 DeserializeVector< data_type,
327 >(value, value.size(), buffer, offset);
329 return bytes_written;
342 size_t DeserializeInBulk( std::array<T,N> &value,
346 typedef std::array<T,N> array_type;
349 array_type::value_type data_type;
356 < data_type >::type data_type_trait;
362 data_type_trait> deserializer_t;
364 const size_t k_count = value.size();
365 deserializer_t deserializer;
366 size_t bytes_written = 0;
370 for (
size_t index = 0; index < k_count; ++index)
374 size_t item_offset = offset + bytes_written;
378 deserializer.Read( value[index], buffer, item_offset);
380 bytes_written += read_len;
383 return bytes_written;
399 size_t DeserializeByItem( std::array<T,N> &value,
403 typedef std::array<T,N> array_type;
406 array_type::value_type data_type;
413 < data_type >::type data_type_trait;
415 Array::Deserializer < data_type,
417 data_type_trait> deserializer;
419 size_t bytes_written = 0;
422 for (
size_t index = 0; index < N; ++index)
426 size_t item_offset = offset + bytes_written;
430 deserializer.Read( value[index], buffer, item_offset);
432 bytes_written += read_len;
435 return bytes_written;
444 template <
typename,
size_t>
class ArrayT
446 size_t DeserializeArray ( ArrayT<T, N> &value,
453 typedef ArrayT<T,N> array_type;
455 typedef T value_type;
459 < value_type >::type value_type_trait;
463 typedef Array::Deserializer < array_type,
468 deserializer_t deserializer;
469 return deserializer.Read(value, N, buffer, offset);
481 template<
size_t IdxT,
485 struct UnpackDatum< IdxT,
494 typename MsgT::format_type
498 proxy_type::value_type value_type;
500 value_type::value_type data_type;
504 < data_type >::type data_type_trait;
517 void operator()( MsgT &msg,
518 const BufferT &buffer,
519 size_t &dynamic_offset)
526 DeserializeArray(msg.template FieldAt<IdxT>().get(), buffer, offset);
528 dynamic_offset += bytes_read;