8 #ifndef PACK_VECTOR_H_INCLUDED
9 #define PACK_VECTOR_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,
34 size_t SerializeByItem( std::vector<T,A> &value,
44 template<
typename VectorT,
46 typename SerializerTraitT
52 template<
typename VectorT,
55 struct Serializer <VectorT, BufferT, fundamental_trait>
57 typedef VectorT vector_type;
60 vector_type::value_type value_type;
62 typedef BufferT buffer_type;
64 typedef fundamental_trait data_type_trait;
67 size_t Write( vector_type &value,
72 size_t size = value.size() *
sizeof(value_type);
74 const value_type *pFirst = &value[0];
75 const value_type *pLast = pFirst;
77 std::advance(pLast, size);
78 buffer.set_range( pFirst,
86 size_t Write( value_type &value,
90 buffer.set_data( value, offset);
91 return sizeof(value_type);
103 struct Serializer <Hg::BitFieldVector<T,A>, BufferT, packed_trait>
108 vector_type::value_type value_type;
110 typedef BufferT buffer_type;
112 typedef packed_trait data_type_trait;
115 size_t Write( vector_type &value,
120 size_t size = value.
size() *
sizeof(value_type);
122 value_type *pFirst = value.data();
123 value_type *pLast = pFirst;
125 std::advance(pLast, size);
126 buffer.set_range( pFirst,
134 size_t Write( value_type &value,
138 return buffer.set_data( value, offset);
146 template<
typename ValueT,
150 struct Serializer <std::vector<ValueT, AllocatorT>, BufferT, nested_trait>
152 typedef std::vector<ValueT,
153 AllocatorT> vector_type;
155 vector_type::value_type value_type;
157 typedef BufferT buffer_type;
159 typedef nested_trait data_type_trait;
162 size_t Write( vector_type &value,
169 message_size_trait<typename value_type::format_type>::type size_trait;
171 size_t bytes_written = 0;
174 for (
size_t index = 0; index < value.size(); ++index)
178 size_t item_offset = offset + bytes_written;
181 pack_message< value_type,
184 >(value[index], buffer, item_offset);
186 bytes_written += write_len;
189 return bytes_written;
198 template<
typename ValueT,
202 struct Serializer <std::vector<ValueT, AllocatorT>, BufferT, array_trait>
204 typedef std::vector<ValueT,
205 AllocatorT> vector_type;
207 vector_type::value_type value_type;
209 typedef BufferT buffer_type;
216 < value_type >::type data_type_trait;
219 size_t Write( vector_type &items,
223 return SerializeByItem(items, buffer, offset);
227 size_t Write( value_type &value,
231 return SerializeArray(value, buffer, offset);
239 template<
typename ValueT,
243 struct Serializer <std::vector<ValueT, AllocatorT>, BufferT, vector_trait>
245 typedef std::vector<ValueT,
246 AllocatorT> vector_type;
248 vector_type::value_type value_type;
250 typedef BufferT buffer_type;
257 < value_type >::type data_type_trait;
260 size_t Write( vector_type &value,
264 return SerializeByItem(value, buffer, offset);
268 size_t Write( value_type &value,
272 size_t bytes_written =
273 SerializeVector(value, buffer, offset);
275 return bytes_written;
288 size_t SerializeInBulk(
const std::vector<T,A> &value,
292 typedef std::vector<T,A> vector_type;
295 vector_type::value_type data_type;
297 vector_type::allocator_type allocator_type;
304 < data_type >::type data_type_trait;
306 Vector::Serializer< vector_type,
308 data_type_trait> serializer;
310 size_t bytes_written = 0;
313 for (
size_t index = 0; index < value.size(); ++index)
317 size_t item_offset = offset + bytes_written;
321 serializer.Write( value[index], buffer, item_offset);
323 bytes_written += write_len;
326 return bytes_written;
342 size_t SerializeByItem( std::vector<T,A> &value,
346 typedef std::vector<T,A> vector_type;
349 vector_type::value_type data_type;
351 vector_type::allocator_type allocator_type;
358 < data_type >::type data_type_trait;
360 Vector::Serializer< vector_type,
362 data_type_trait> serializer;
364 size_t bytes_written = 0;
367 for (
size_t index = 0; index < value.size(); ++index)
371 size_t item_offset = offset + bytes_written;
375 serializer.Write( value[index], buffer, item_offset);
377 bytes_written += write_len;
380 return bytes_written;
389 template <
class,
class>
class VectorT
391 size_t SerializeVector (VectorT<T, A> &value,
398 typedef VectorT<T, A> vector_type;
400 typedef T value_type;
404 < value_type >::type value_type_trait;
409 typedef Vector::Serializer
415 serializer_t serializer;
416 return serializer.Write(value, buffer, offset);
428 template<
size_t IdxT,
432 struct PackDatum< IdxT,
441 typename MsgT::format_type
445 proxy_type::value_type value_type;
447 value_type::value_type data_type;
449 typedef MsgT message_type;
451 typedef BufferT buffer_type;
463 void operator()(message_type& msg,
465 size_t& dynamic_offset)
467 value_type &value = msg.template FieldAt<IdxT>().
get();
479 size_t bytes_written =
480 SerializeVector(value, buffer, offset);
484 dynamic_offset += bytes_written;