6#include <bond/core/config.h>
9#include <bond/core/reflection.h>
11#include <boost/utility/enable_if.hpp>
21template <
typename TContainer,
typename TElement,
typename Enable =
void>
22struct is_deserialize_direct
25template <
typename TContainer,
typename TElement>
26struct is_deserialize_direct<TContainer, TElement,
27 typename boost::enable_if_c<require_modify_element<TContainer>::value
28 && is_element_matching<TElement, TContainer>::value>::type>
31template <
typename TContainer,
typename TElement>
32struct is_deserialize_direct<TContainer, TElement,
33 typename boost::enable_if_c<is_list_container<TContainer>::value
34 && !is_nullable<TContainer>::value
35 && is_basic_type<typename remove_bonded_value<TElement>::type>::value
36 && !require_modify_element<TContainer>::value
37 && is_element_matching<TElement, TContainer>::value>::type>
40template <
typename TContainer,
typename TElement,
typename Enable =
void>
41struct is_deserialize_incremental
44template <
typename TElement>
45struct is_deserialize_incremental<nullable<TElement>, TElement>
48template <
typename TContainer,
typename TElement>
49struct is_deserialize_incremental<TContainer, TElement,
50 typename boost::enable_if_c<is_list_container<TContainer>::value
51 && !is_basic_type<typename remove_bonded_value<TElement>::type>::value
52 && is_element_matching<TElement, TContainer>::value
53 && !require_modify_element<TContainer>::value>::type>
57template <
typename Protocols,
typename X,
typename Key,
typename T>
58typename boost::enable_if<is_map_key_matching<Key, X> >::type
59inline DeserializeMapElements(X& var,
const Key& key,
const T& element, uint32_t size);
61template <
typename Protocols,
typename X,
typename Key,
typename T>
62typename boost::disable_if<is_map_key_matching<Key, X> >::type
63inline DeserializeMapElements(X&,
const Key& key,
const T& element, uint32_t size);
65template <
typename Protocols,
typename Transform,
typename Key,
typename T>
66inline void DeserializeMapElements(
const Transform& transform,
const Key& key,
const T& element, uint32_t size);
68template <
typename Protocols,
typename X,
typename T>
69typename boost::enable_if_c<detail::is_deserialize_direct<X, T>::value>::type
70inline DeserializeElements(X& var,
const T& element, uint32_t size);
72template <
typename Protocols,
typename X,
typename T>
73typename boost::enable_if_c<is_matching<T, X>::value>::type
74inline DeserializeElements(nullable<X>& var,
const T& element, uint32_t size);
76template <
typename Protocols,
typename X,
typename T>
77typename boost::enable_if_c<detail::is_deserialize_incremental<X, T>::value>::type
78inline DeserializeElements(X& var,
const T& element, uint32_t size);
80template <
typename Protocols,
typename Reader>
81inline void DeserializeElements(
blob& var,
const value<blob::value_type, Reader&>& element, uint32_t size);
83template <
typename Protocols,
typename X,
typename T>
84typename boost::enable_if_c<is_set_container<X>::value
85 && is_element_matching<T, X>::value>::type
86inline DeserializeElements(X& var,
const T& element, uint32_t size);
88template <
typename Protocols,
typename X,
typename T>
89typename boost::enable_if_c<!is_element_matching<T, X>::value >::type
90inline DeserializeElements(X&,
const T& element, uint32_t size);
92template <
typename Protocols,
typename Transform,
typename T>
93void inline DeserializeElements(
const Transform& transform,
const T& element, uint32_t size);
103bool IsMatching(BondDataType type)
108 return is_matching<bool, T>::value;
111 return is_matching<uint8_t, T>::value;
113 case bond::BT_UINT16:
114 return is_matching<uint16_t, T>::value;
116 case bond::BT_UINT32:
117 return is_matching<uint32_t, T>::value;
119 case bond::BT_UINT64:
120 return is_matching<uint64_t, T>::value;
123 return is_matching<float, T>::value;
125 case bond::BT_DOUBLE:
126 return is_matching<double, T>::value;
128 case bond::BT_STRING:
129 return is_matching<std::string, T>::value;
131 case bond::BT_WSTRING:
132 return is_matching<std::wstring, T>::value;
135 return is_matching<int8_t, T>::value;
138 return is_matching<int16_t, T>::value;
141 return is_matching<int32_t, T>::value;
144 return is_matching<int64_t, T>::value;
153template <
typename Transform,
typename Reader>
154inline bool BasicTypeField(uint16_t
id,
const Metadata& metadata, BondDataType type,
const Transform& transform, Reader& input)
159 return transform.Field(
id, metadata, value<bool, Reader&>(input));
162 return transform.Field(
id, metadata, value<uint8_t, Reader&>(input));
164 case bond::BT_UINT16:
165 return transform.Field(
id, metadata, value<uint16_t, Reader&>(input));
167 case bond::BT_UINT32:
168 return transform.Field(
id, metadata, value<uint32_t, Reader&>(input));
170 case bond::BT_UINT64:
171 return transform.Field(
id, metadata, value<uint64_t, Reader&>(input));
174 return transform.Field(
id, metadata, value<float, Reader&>(input));
176 case bond::BT_DOUBLE:
177 return transform.Field(
id, metadata, value<double, Reader&>(input));
179 case bond::BT_STRING:
180 return transform.Field(
id, metadata, value<std::string, Reader&>(input));
182 case bond::BT_WSTRING:
183 return transform.Field(
id, metadata, value<std::wstring, Reader&>(input));
186 return transform.Field(
id, metadata, value<int8_t, Reader&>(input));
189 return transform.Field(
id, metadata, value<int16_t, Reader&>(input));
192 return transform.Field(
id, metadata, value<int32_t, Reader&>(input));
195 return transform.Field(
id, metadata, value<int64_t, Reader&>(input));
204template <
typename Reader,
typename T = u
int8_t>
205inline void CheckInputData(Reader& input, uint32_t size)
207 if (!input.template CanReadArray<T>(size))
209 OutOfBoundObjectSizeException();
213template <
typename Protocols,
typename T,
typename E,
typename Reader>
214inline void DeserializeElementsChecked(T& var, Reader& input, uint32_t size)
216 CheckInputData<Reader, E>(input, size);
217 return DeserializeElements<Protocols>(var, value<E, Reader&>(input,
false), size);
221template <
typename Protocols,
typename T,
typename Reader>
222inline void BasicTypeContainer(T& var, BondDataType type, Reader& input, uint32_t size)
224 BOOST_STATIC_ASSERT(!is_container<T>::value);
229 return DeserializeElementsChecked<Protocols, T, bool, Reader>(var, input, size);
232 return DeserializeElementsChecked<Protocols, T, uint8_t, Reader>(var, input, size);
234 case bond::BT_UINT16:
235 return DeserializeElementsChecked<Protocols, T, uint16_t, Reader>(var, input, size);
237 case bond::BT_UINT32:
238 return DeserializeElementsChecked<Protocols, T, uint32_t, Reader>(var, input, size);
240 case bond::BT_UINT64:
241 return DeserializeElementsChecked<Protocols, T, uint64_t, Reader>(var, input, size);
244 return DeserializeElementsChecked<Protocols, T, float, Reader>(var, input, size);
246 case bond::BT_DOUBLE:
247 return DeserializeElementsChecked<Protocols, T, double, Reader>(var, input, size);
249 case bond::BT_STRING:
250 return DeserializeElementsChecked<Protocols, T, std::string, Reader>(var, input, size);
252 case bond::BT_WSTRING:
253 return DeserializeElementsChecked<Protocols, T, std::wstring, Reader>(var, input, size);
256 return DeserializeElementsChecked<Protocols, T, int8_t, Reader>(var, input, size);
259 return DeserializeElementsChecked<Protocols, T, int16_t, Reader>(var, input, size);
262 return DeserializeElementsChecked<Protocols, T, int32_t, Reader>(var, input, size);
265 return DeserializeElementsChecked<Protocols, T, int64_t, Reader>(var, input, size);
275inline void SkipElements(
const E& element, uint32_t size)
281template <
typename Reader>
282inline void SkipElements(BondDataType type, Reader& input, uint32_t size)
290template <
typename Protocols,
typename T,
typename Reader>
291typename boost::enable_if<is_type_alias<typename element_type<T>::type> >::type
292inline MatchingTypeContainer(T& var, BondDataType type, Reader& input, uint32_t size)
294 if (type == get_type_id<
typename element_type<T>::type>::value)
296 DeserializeElementsChecked<Protocols, T, typename element_type<T>::type, Reader>(var, input, size);
300 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type>(type));
302 SkipElements(type, input, size);
307template <
typename Protocols,
typename T,
typename Reader>
308typename boost::enable_if<std::is_same<bool, typename element_type<T>::type> >::type
309inline MatchingTypeContainer(T& var, BondDataType type, Reader& input, uint32_t size)
314 return DeserializeElementsChecked<Protocols, T, bool, Reader>(var, input, size);
317 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type>(type));
319 SkipElements(type, input, size);
325template <
typename Protocols,
typename T,
typename Reader>
326typename boost::enable_if<is_string<typename element_type<T>::type> >::type
327inline MatchingTypeContainer(T& var, BondDataType type, Reader& input, uint32_t size)
331 case bond::BT_STRING:
332 return DeserializeElementsChecked < Protocols, T, std::string, Reader > (var, input, size);
335 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type>(type));
337 SkipElements(type, input, size);
343template <
typename Protocols,
typename T,
typename Reader>
344typename boost::enable_if<is_wstring<typename element_type<T>::type> >::type
345inline MatchingTypeContainer(T& var, BondDataType type, Reader& input, uint32_t size)
349 case bond::BT_WSTRING:
350 return DeserializeElementsChecked<Protocols, T, std::wstring, Reader>(var, input, size);
353 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type>(type));
355 SkipElements(type, input, size);
361template <
typename Protocols,
typename T,
typename Reader>
362typename boost::enable_if<std::is_floating_point<typename element_type<T>::type> >::type
363inline MatchingTypeContainer(T& var, BondDataType type, Reader& input, uint32_t size)
368 return DeserializeElementsChecked<Protocols, T, float, Reader>(var, input, size);
370 case bond::BT_DOUBLE:
371 return DeserializeElementsChecked<Protocols, T, double, Reader>(var, input, size);
374 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type>(type));
376 SkipElements(type, input, size);
382template <
typename Protocols,
typename T,
typename Reader>
383typename boost::enable_if<is_matching<uint8_t, typename element_type<T>::type> >::type
384inline MatchingTypeContainer(T& var, BondDataType type, Reader& input, uint32_t size)
389 return DeserializeElementsChecked<Protocols, T, uint8_t, Reader>(var, input, size);
391 case bond::BT_UINT16:
392 return DeserializeElementsChecked<Protocols, T, uint16_t, Reader>(var, input, size);
394 case bond::BT_UINT32:
395 return DeserializeElementsChecked<Protocols, T, uint32_t, Reader>(var, input, size);
397 case bond::BT_UINT64:
398 return DeserializeElementsChecked<Protocols, T, uint64_t, Reader>(var, input, size);
401 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type>(type));
403 SkipElements(type, input, size);
409template <
typename Protocols,
typename T,
typename Reader>
410typename boost::enable_if<is_matching<int8_t, typename element_type<T>::type> >::type
411inline MatchingTypeContainer(T& var, BondDataType type, Reader& input, uint32_t size)
416 return DeserializeElementsChecked<Protocols, T, int8_t, Reader>(var, input, size);
419 return DeserializeElementsChecked<Protocols, T, int16_t, Reader>(var, input, size);
422 return DeserializeElementsChecked<Protocols, T, int32_t, Reader>(var, input, size);
425 return DeserializeElementsChecked<Protocols, T, int64_t, Reader>(var, input, size);
428 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type>(type));
430 SkipElements(type, input, size);
439template <
typename E,
typename Reader>
440inline void SkipElements(BondDataType keyType,
const E& element, Reader& input, uint32_t size)
449template <
typename Protocols,
typename T,
typename E,
typename Reader>
450typename boost::enable_if<is_type_alias<typename element_type<T>::type::first_type> >::type
451inline MatchingMapByKey(T& var, BondDataType keyType,
const E& element, Reader& input, uint32_t size)
453 if (keyType == get_type_id<
typename element_type<T>::type::first_type>::value)
455 return DeserializeMapElements<Protocols>(var, value<
typename element_type<T>::type::first_type, Reader&>(input,
false), element, size);
459 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::first_type>(keyType));
461 SkipElements(keyType, element, input, size);
466template <
typename Protocols,
typename T,
typename E,
typename Reader>
467typename boost::enable_if<std::is_same<bool, typename element_type<T>::type::first_type> >::type
468inline MatchingMapByKey(T& var, BondDataType keyType,
const E& element, Reader& input, uint32_t size)
473 return DeserializeMapElements<Protocols>(var, value<bool, Reader&>(input,
false), element, size);
476 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::first_type>(keyType));
478 SkipElements(keyType, element, input, size);
484template <
typename Protocols,
typename T,
typename E,
typename Reader>
485typename boost::enable_if<is_string<typename element_type<T>::type::first_type> >::type
486inline MatchingMapByKey(T& var, BondDataType keyType,
const E& element, Reader& input, uint32_t size)
490 case bond::BT_STRING:
491 return DeserializeMapElements<Protocols>(var, value<std::string, Reader&>(input,
false), element, size);
494 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::first_type>(keyType));
496 SkipElements(keyType, element, input, size);
502template <
typename Protocols,
typename T,
typename E,
typename Reader>
503typename boost::enable_if<is_wstring<typename element_type<T>::type::first_type> >::type
504inline MatchingMapByKey(T& var, BondDataType keyType,
const E& element, Reader& input, uint32_t size)
508 case bond::BT_WSTRING:
509 return DeserializeMapElements<Protocols>(var, value<std::wstring, Reader&>(input,
false), element, size);
512 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::first_type>(keyType));
514 SkipElements(keyType, element, input, size);
520template <
typename Protocols,
typename T,
typename E,
typename Reader>
521typename boost::enable_if<std::is_floating_point<typename element_type<T>::type::first_type> >::type
522inline MatchingMapByKey(T& var, BondDataType keyType,
const E& element, Reader& input, uint32_t size)
527 return DeserializeMapElements<Protocols>(var, value<float, Reader&>(input,
false), element, size);
529 case bond::BT_DOUBLE:
530 return DeserializeMapElements<Protocols>(var, value<double, Reader&>(input,
false), element, size);
533 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::first_type>(keyType));
535 SkipElements(keyType, element, input, size);
541template <
typename Protocols,
typename T,
typename E,
typename Reader>
542typename boost::enable_if<is_matching<uint8_t, typename element_type<T>::type::first_type> >::type
543inline MatchingMapByKey(T& var, BondDataType keyType,
const E& element, Reader& input, uint32_t size)
548 return DeserializeMapElements<Protocols>(var, value<uint8_t, Reader&>(input,
false), element, size);
550 case bond::BT_UINT16:
551 return DeserializeMapElements<Protocols>(var, value<uint16_t, Reader&>(input,
false), element, size);
553 case bond::BT_UINT32:
554 return DeserializeMapElements<Protocols>(var, value<uint32_t, Reader&>(input,
false), element, size);
556 case bond::BT_UINT64:
557 return DeserializeMapElements<Protocols>(var, value<uint64_t, Reader&>(input,
false), element, size);
560 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::first_type>(keyType));
562 SkipElements(keyType, element, input, size);
568template <
typename Protocols,
typename T,
typename E,
typename Reader>
569typename boost::enable_if<is_matching<int8_t, typename element_type<T>::type::first_type> >::type
570inline MatchingMapByKey(T& var, BondDataType keyType,
const E& element, Reader& input, uint32_t size)
575 return DeserializeMapElements<Protocols>(var, value<int8_t, Reader&>(input,
false), element, size);
578 return DeserializeMapElements<Protocols>(var, value<int16_t, Reader&>(input,
false), element, size);
581 return DeserializeMapElements<Protocols>(var, value<int32_t, Reader&>(input,
false), element, size);
584 return DeserializeMapElements<Protocols>(var, value<int64_t, Reader&>(input,
false), element, size);
587 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::first_type>(keyType));
589 SkipElements(keyType, element, input, size);
596template <
typename Protocols,
typename T,
typename E,
typename Reader>
597typename boost::disable_if<is_map_container<T> >::type
598inline MapByKey(T& var, BondDataType keyType,
const E& element, Reader& input, uint32_t size)
603 return DeserializeMapElements<Protocols>(var, value<bool, Reader&>(input,
false), element, size);
606 return DeserializeMapElements<Protocols>(var, value<uint8_t, Reader&>(input,
false), element, size);
608 case bond::BT_UINT16:
609 return DeserializeMapElements<Protocols>(var, value<uint16_t, Reader&>(input,
false), element, size);
611 case bond::BT_UINT32:
612 return DeserializeMapElements<Protocols>(var, value<uint32_t, Reader&>(input,
false), element, size);
614 case bond::BT_UINT64:
615 return DeserializeMapElements<Protocols>(var, value<uint64_t, Reader&>(input,
false), element, size);
618 return DeserializeMapElements<Protocols>(var, value<float, Reader&>(input,
false), element, size);
620 case bond::BT_DOUBLE:
621 return DeserializeMapElements<Protocols>(var, value<double, Reader&>(input,
false), element, size);
623 case bond::BT_STRING:
624 return DeserializeMapElements<Protocols>(var, value<std::string, Reader&>(input,
false), element, size);
626 case bond::BT_WSTRING:
627 return DeserializeMapElements<Protocols>(var, value<std::wstring, Reader&>(input,
false), element, size);
630 return DeserializeMapElements<Protocols>(var, value<int8_t, Reader&>(input,
false), element, size);
633 return DeserializeMapElements<Protocols>(var, value<int16_t, Reader&>(input,
false), element, size);
636 return DeserializeMapElements<Protocols>(var, value<int32_t, Reader&>(input,
false), element, size);
639 return DeserializeMapElements<Protocols>(var, value<int64_t, Reader&>(input,
false), element, size);
648template <
typename Protocols,
typename T,
typename E,
typename Reader>
649typename boost::enable_if<is_map_element_matching<E, T> >::type
650inline MapByKey(T& var, BondDataType keyType,
const E& element, Reader& input, uint32_t size)
652 return MatchingMapByKey<Protocols>(var, keyType, element, input, size);
656template <
typename Protocols,
typename T,
typename E,
typename Reader>
657typename boost::disable_if_c<!is_map_container<T>::value || is_map_element_matching<E, T>::value>::type
658inline MapByKey(T&, BondDataType keyType,
const E& element, Reader& input, uint32_t size)
668template <
typename Protocols,
typename T,
typename Reader>
669inline void MapByElement(T& var, BondDataType keyType, BondDataType elementType, Reader& input, uint32_t size)
674 return MapByKey<Protocols>(var, keyType, value<bool, Reader&>(input,
false), input, size);
677 return MapByKey<Protocols>(var, keyType, value<uint8_t, Reader&>(input,
false), input, size);
679 case bond::BT_UINT16:
680 return MapByKey<Protocols>(var, keyType, value<uint16_t, Reader&>(input,
false), input, size);
682 case bond::BT_UINT32:
683 return MapByKey<Protocols>(var, keyType, value<uint32_t, Reader&>(input,
false), input, size);
685 case bond::BT_UINT64:
686 return MapByKey<Protocols>(var, keyType, value<uint64_t, Reader&>(input,
false), input, size);
689 return MapByKey<Protocols>(var, keyType, value<float, Reader&>(input,
false), input, size);
691 case bond::BT_DOUBLE:
692 return MapByKey<Protocols>(var, keyType, value<double, Reader&>(input,
false), input, size);
694 case bond::BT_STRING:
695 return MapByKey<Protocols>(var, keyType, value<std::string, Reader&>(input,
false), input, size);
697 case bond::BT_WSTRING:
698 return MapByKey<Protocols>(var, keyType, value<std::wstring, Reader&>(input,
false), input, size);
701 return MapByKey<Protocols>(var, keyType, value<int8_t, Reader&>(input,
false), input, size);
704 return MapByKey<Protocols>(var, keyType, value<int16_t, Reader&>(input,
false), input, size);
707 return MapByKey<Protocols>(var, keyType, value<int32_t, Reader&>(input,
false), input, size);
710 return MapByKey<Protocols>(var, keyType, value<int64_t, Reader&>(input,
false), input, size);
722template <
typename Reader>
723inline void SkipElements(BondDataType keyType, BondDataType elementType, Reader& input, uint32_t size)
728 input.Skip(elementType);
732template <
typename Protocols,
typename T,
typename Reader>
733typename boost::enable_if<is_type_alias<typename element_type<T>::type::second_type> >::type
734inline MatchingMapByElement(T& var, BondDataType keyType, BondDataType elementType, Reader& input, uint32_t size)
736 if (elementType == get_type_id<
typename element_type<T>::type::second_type>::value)
738 MapByKey<Protocols>(var, keyType, value<
typename element_type<T>::type::second_type, Reader&>(input,
false), input, size);
742 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::second_type>(elementType));
744 SkipElements(keyType, elementType, input, size);
749template <
typename Protocols,
typename T,
typename Reader>
750typename boost::enable_if<std::is_same<bool, typename element_type<T>::type::second_type> >::type
751inline MatchingMapByElement(T& var, BondDataType keyType, BondDataType elementType, Reader& input, uint32_t size)
756 return MapByKey<Protocols>(var, keyType, value<bool, Reader&>(input,
false), input, size);
759 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::second_type>(elementType));
761 SkipElements(keyType, elementType, input, size);
767template <
typename Protocols,
typename T,
typename Reader>
768typename boost::enable_if<is_string<typename element_type<T>::type::second_type> >::type
769inline MatchingMapByElement(T& var, BondDataType keyType, BondDataType elementType, Reader& input, uint32_t size)
773 case bond::BT_STRING:
774 return MapByKey<Protocols>(var, keyType, value<std::string, Reader&>(input,
false), input, size);
777 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::second_type>(elementType));
779 SkipElements(keyType, elementType, input, size);
785template <
typename Protocols,
typename T,
typename Reader>
786typename boost::enable_if<is_wstring<typename element_type<T>::type::second_type> >::type
787inline MatchingMapByElement(T& var, BondDataType keyType, BondDataType elementType, Reader& input, uint32_t size)
791 case bond::BT_WSTRING:
792 return MapByKey<Protocols>(var, keyType, value<std::wstring, Reader&>(input,
false), input, size);
795 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::second_type>(elementType));
797 SkipElements(keyType, elementType, input, size);
803template <
typename Protocols,
typename T,
typename Reader>
804typename boost::enable_if<std::is_floating_point<typename element_type<T>::type::second_type> >::type
805inline MatchingMapByElement(T& var, BondDataType keyType, BondDataType elementType, Reader& input, uint32_t size)
810 return MapByKey<Protocols>(var, keyType, value<float, Reader&>(input,
false), input, size);
812 case bond::BT_DOUBLE:
813 return MapByKey<Protocols>(var, keyType, value<double, Reader&>(input,
false), input, size);
816 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::second_type>(elementType));
818 SkipElements(keyType, elementType, input, size);
824template <
typename Protocols,
typename T,
typename Reader>
825typename boost::enable_if<is_matching<uint8_t, typename element_type<T>::type::second_type> >::type
826inline MatchingMapByElement(T& var, BondDataType keyType, BondDataType elementType, Reader& input, uint32_t size)
831 return MapByKey<Protocols>(var, keyType, value<uint8_t, Reader&>(input,
false), input, size);
833 case bond::BT_UINT16:
834 return MapByKey<Protocols>(var, keyType, value<uint16_t, Reader&>(input,
false), input, size);
836 case bond::BT_UINT32:
837 return MapByKey<Protocols>(var, keyType, value<uint32_t, Reader&>(input,
false), input, size);
839 case bond::BT_UINT64:
840 return MapByKey<Protocols>(var, keyType, value<uint64_t, Reader&>(input,
false), input, size);
843 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::second_type>(elementType));
845 SkipElements(keyType, elementType, input, size);
851template <
typename Protocols,
typename T,
typename Reader>
852typename boost::enable_if<is_matching<int8_t, typename element_type<T>::type::second_type> >::type
853inline MatchingMapByElement(T& var, BondDataType keyType, BondDataType elementType, Reader& input, uint32_t size)
858 return MapByKey<Protocols>(var, keyType, value<int8_t, Reader&>(input,
false), input, size);
861 return MapByKey<Protocols>(var, keyType, value<int16_t, Reader&>(input,
false), input, size);
864 return MapByKey<Protocols>(var, keyType, value<int32_t, Reader&>(input,
false), input, size);
867 return MapByKey<Protocols>(var, keyType, value<int64_t, Reader&>(input,
false), input, size);
870 BOOST_ASSERT(!IsMatching<
typename element_type<T>::type::second_type>(elementType));
872 SkipElements(keyType, elementType, input, size);
884#if BOND_LIB_TYPE != BOND_LIB_TYPE_HEADER
885#include "typeid_value_extern.h"
888#error BOND_LIB_TYPE is undefined
Memory blob.
Definition blob.h:24
namespace bond
Definition apply.h:17