8 #ifndef MESSAGE_DYNAMIC_DETAIL_H_INCLUDED
9 #define MESSAGE_DYNAMIC_DETAIL_H_INCLUDED
11 #include <Pb/dynamic.h>
13 #include <Pb/type_at.h>
14 #include <Hg/deduce_type_trait.h>
24 template<
typename MsgT,
27 struct DynamicSizeWorker;
40 template<
class TypeT,
42 template <
class,
class>
class VectorT
44 size_t operator()(
const VectorT<TypeT,AllocT>& field)
46 return field.size() *
sizeof(TypeT);
60 struct HelperSizeOfVector
62 static size_t size(
const std::vector<T,A>& field)
64 size_t total_size = 0;
70 for (
size_t index = 0; index < field.size(); ++index)
77 total_size += k_fixed_size
78 + DynamicSizeWorker<T, true>().size(field[index]);
91 struct HelperSizeOfVector <T, A, false>
93 static size_t size(
const std::vector<T,A>& field)
111 size_t operator()(
const std::vector<T,A>& field)
114 T::format_type format_type;
116 return nested::HelperSizeOfVector<T, A, has_dynamic<format_type>::value>::size(field);
124 template<
typename T,
130 size_t operator()(
const std::vector<T,A>& field)
132 size_t total_size = 0;
135 typename T::allocator_type,
139 for (
size_t index = 0; index < field.size(); ++index)
141 total_size += Size(field[index]);
165 size_t dynamic_size(
const std::vector<T,A>& field)
167 SizeOfVector<T,A, typename DeduceTypeTrait<T>::type> Size;
174 template <
typename T>
175 size_t dynamic_size(
const T& field)
181 template<
typename MsgT >
182 struct DynamicSizeFunctor
185 typedef MsgT message_type;
187 message_type::format_type format_type;
190 dynamic_fields<format_type>::type dynamic_field_indices;
193 const message_type &message;
194 size_t m_dynamic_size;
202 DynamicSizeFunctor(
const message_type& rhs)
218 template<
size_t IdxT,
221 void operator()(
const value_t*)
225 format_type>::type proxy_type;
227 proxy_type::value_type value_type;
229 message_type &msg =
const_cast<message_type&
>(message);
230 value_type &value = msg.template FieldAt<IdxT>().
get();
231 m_dynamic_size += dynamic_size(value);
239 return m_dynamic_size;
248 template<
typename MsgT,
251 struct DynamicSizeWorker
254 size_t size(
const MsgT& msg)
256 typedef MsgT message_type;
258 message_type::format_type format_type;
261 detail::DynamicSizeFunctor< message_type > ftor(msg);
274 template<
typename MsgT >
275 struct DynamicSizeWorker<MsgT, false>
278 size_t size(
const MsgT& msg)