25 #include <boost/bind.hpp>
26 #include <boost/mpl/for_each.hpp>
27 #include <boost/range/adaptor/reversed.hpp>
34 template<
typename TAG>
36 getLocationSortOrder() noexcept;
40 getLocationSortOrder<field_location_tags::Header>() noexcept
47 getLocationSortOrder<field_location_tags::Fragment>() noexcept
56 FieldInfo() noexcept = default;
59 FieldInfo(uint64_t tlv) noexcept;
69 class ExtractFieldInfo
72 using result_type = void;
76 operator()(FieldInfo* info,
const T&)
const noexcept
78 if (T::TlvType::value != info->tlvType) {
81 info->isRecognized =
true;
82 info->canIgnore =
false;
83 info->isRepeatable = T::IsRepeatable::value;
84 info->locationSortOrder = getLocationSortOrder<typename T::FieldLocation>();
88 FieldInfo::FieldInfo(uint64_t tlv) noexcept
91 boost::mpl::for_each<FieldSet>(boost::bind(ExtractFieldInfo(),
this, _1));
100 compareFieldSortOrder(
const FieldInfo& first,
const FieldInfo& second) noexcept
102 return (first.locationSortOrder < second.locationSortOrder) ||
103 (first.locationSortOrder == second.locationSortOrder && first.tlvType < second.tlvType);
123 if (elements.size() == 1 && elements.front().type() == FragmentField::TlvType::value) {
124 elements.front().parse();
125 return elements.front().elements().front();
137 add<FragmentField>(make_pair(wire.
begin(), wire.
end()));
150 FieldInfo info(element.type());
152 if (!info.isRecognized && !info.canIgnore) {
157 if (info.tlvType == prev.tlvType && !info.isRepeatable) {
161 else if (info.tlvType != prev.tlvType && !compareFieldSortOrder(prev, info)) {
174 Packet::comparePos(uint64_t first,
const Block& second) noexcept
176 FieldInfo firstInfo(first);
177 FieldInfo secondInfo(second.type());
178 return compareFieldSortOrder(firstInfo, secondInfo);