25 #include <boost/bind/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
81 info->isRecognized =
true;
82 info->canIgnore =
false;
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));
95 (tlvType & 0x03) == 0x00;
100 compareFieldSortOrder(
const FieldInfo& first,
const FieldInfo& second) noexcept
102 return (first.locationSortOrder < second.locationSortOrder) ||
103 (first.locationSortOrder == second.locationSortOrder && first.tlvType < second.tlvType);
124 elements.front().parse();
125 return elements.front().elements().front();
137 add<FragmentField>({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);
Copyright (c) 2011-2015 Regents of the University of California.
std::string to_string(const T &val)
const_iterator begin() const
Get begin iterator of encoded wire.
void parse() const
Parse TLV-VALUE into sub-elements.
bool canIgnore
can this unknown field be ignored
Represents a TLV element of the NDN packet format.
const element_container & elements() const
Get container of sub-elements.
upper bound of 3-octet header field
void wireDecode(const Block &wire)
decode packet from wire format
bool isRecognized
is this field known
bool isRepeatable
is the field repeatable
lower bound of 3-octet header field
uint64_t tlvType
TLV-TYPE of the field; 0 if field does not exist.
uint32_t type() const noexcept
Return the TLV-TYPE of the Block.
void encode()
Encode sub-elements into TLV-VALUE.
Block wireEncode() const
encode packet into wire format
int locationSortOrder
sort order of field_location_tag
const_iterator end() const
Get end iterator of encoded wire.
std::vector< Block > element_container