8 #ifndef PACK_ARRAY_H_INCLUDED
9 #define PACK_ARRAY_H_INCLUDED
12 #ifndef PACK_MESSAGE_H_INCLUDED
13 # error Do not include this file directly. Use <detail/pack_message.h> instead
23 template<
typename ValueT,
26 size_t SerializeInBulk( ValueT &value,
35 size_t SerializeByItem( std::array<T,N> &value,
45 template <
class,
class>
class VectorT
47 size_t SerializeVector (VectorT<T, A> &value,
58 template<
typename ArrayT,
60 typename SerializerTraitT
64 typedef ArrayT array_type;
67 array_type::value_type value_type;
69 typedef BufferT buffer_type;
71 typedef SerializerTraitT data_type_trait;
74 template <
typename TraitT>
75 size_t WriteMany( array_type &value,
80 size_t size = value.size() *
sizeof(value_type);
82 const value_type *pFirst = &value[0];
83 const value_type *pLast = pFirst;
85 std::advance(pLast, size);
86 buffer.set_range( pFirst,
95 size_t Write( value_type &value,
99 buffer.set_data( value, offset);
100 return sizeof(value_type);
109 template<
typename T,
113 struct Serializer <Hg::BitFieldArray<T,N>, BufferT, packed_trait>
118 array_type::value_type value_type;
120 typedef BufferT buffer_type;
122 typedef packed_trait data_type_trait;
125 template <
typename TraitT>
126 size_t WriteMany( array_type &value,
131 size_t size = value.
size() *
sizeof(value_type);
133 const value_type *pFirst = value.data();
134 const value_type *pLast = pFirst;
136 std::advance(pLast, size);
137 buffer.set_range( pFirst,
146 size_t Write( value_type &value,
150 buffer.set_data( value, offset);
151 return sizeof(value_type);
160 template<
typename T,
164 struct Serializer <std::array<T,N>, BufferT, nested_trait>
167 T::format_type format_type;
169 typedef std::array<T,N> array_type;
172 array_type::value_type value_type;
174 typedef BufferT buffer_type;
176 typedef nested_trait data_type_trait;
179 template <
typename TraitT>
180 size_t WriteMany( array_type &value,
187 message_size_trait<format_type>::type size_trait;
189 size_t bytes_written = 0;
192 for (
size_t index = 0; index < N; ++index)
196 size_t item_offset = offset + bytes_written;
199 pack_message< value_type,
202 >(value[index], buffer, item_offset);
204 bytes_written += write_len;
207 return bytes_written;
216 template<
typename T,
220 struct Serializer <std::array<T,N>, BufferT, array_trait>
222 typedef std::array<T,N> array_type;
225 array_type::value_type value_type;
227 typedef BufferT buffer_type;
234 < value_type >::type data_type_trait;
237 template <
typename TraitT>
238 size_t WriteMany( array_type &value,
242 return SerializeInBulk(value, buffer, offset);
246 size_t Write( value_type &value,
250 return SerializeByItem(value, buffer, offset);
257 template<
typename T,
261 struct Serializer <std::array<T,N>, BufferT, vector_trait>
263 typedef std::array<T,N> array_type;
266 array_type::value_type value_type;
268 typedef BufferT buffer_type;
275 < value_type >::type data_type_trait;
278 template <
typename TraitT>
279 size_t WriteMany( array_type &value,
283 return SerializeByItem(value, buffer, offset);
287 size_t Write( value_type &value,
292 value_type::value_type data_type;
295 value_type::allocator_type allocator_type;
300 size_t bytes_written =
301 SerializeVector < data_type,
308 return bytes_written;
319 template<
typename ValueT,
322 size_t SerializeInBulk( ValueT &value,
326 typedef ValueT array_type;
329 array_type::value_type data_type;
336 < data_type >::type data_type_trait;
338 Array::Serializer < array_type,
340 data_type_trait> serializer;
342 size_t bytes_written = 0;
345 for (
size_t index = 0; index < value.size(); ++index)
349 size_t item_offset = offset + bytes_written;
353 serializer.Write( value[index],
357 bytes_written += write_len;
360 return bytes_written;
376 size_t SerializeByItem( std::array<T,N> &value,
380 typedef std::array<T,N> array_type;
383 array_type::value_type data_type;
390 < data_type >::type data_type_trait;
392 Array::Serializer < array_type,
394 data_type_trait> serializer;
396 size_t bytes_written = 0;
399 for (
size_t index = 0; index < N; ++index)
403 size_t item_offset = offset + bytes_written;
407 serializer.Write( value[index],
411 bytes_written += write_len;
414 return bytes_written;
420 template<
typename T,
423 template <
typename,
size_t>
class ArrayT
425 size_t SerializeArray(ArrayT<T,N> &value,
432 typedef ArrayT<T,N> array_type;
434 typedef T value_type;
438 < value_type >::type value_type_trait;
442 typedef Array::Serializer < array_type,
447 serializer_t::data_type_trait data_type_trait;
449 serializer_t serializer;
450 return serializer.template WriteMany<data_type_trait>(value, buffer, offset);
461 template<
size_t IdxT,
465 struct PackDatum< IdxT,
474 typename MsgT::format_type
478 proxy_type::value_type value_type;
480 value_type::value_type data_type;
482 typedef MsgT message_type;
484 typedef BufferT buffer_type;
497 void operator()( MsgT& msg,
499 size_t& dynamic_offset)
501 value_type &value = msg.template FieldAt<IdxT>().
get();
513 size_t bytes_written =
514 SerializeArray(value, buffer, offset);
518 dynamic_offset += bytes_written;