22#ifndef NDN_CXX_ENCODING_TLV_HPP
23#define NDN_CXX_ENCODING_TLV_HPP
32#include <boost/endian/conversion.hpp>
53class Error :
public std::runtime_error
56 using std::runtime_error::runtime_error;
58 Error(
const char* expectedType, uint32_t actualType);
164 return type <= 31 || (type & 0x01);
178template<
typename Iterator>
179[[nodiscard]]
constexpr bool
180readVarNumber(Iterator& begin, Iterator end, uint64_t& number)
noexcept;
195template<
typename Iterator>
196[[nodiscard]]
constexpr bool
197readType(Iterator& begin, Iterator end, uint32_t& type)
noexcept;
209template<
typename Iterator>
225template<
typename Iterator>
227readType(Iterator& begin, Iterator end);
232[[nodiscard]]
constexpr size_t
255template<
typename Iterator>
257readNonNegativeInteger(
size_t size, Iterator& begin, Iterator end);
262[[nodiscard]]
constexpr size_t
286template<
typename Iterator,
287 typename DecayedIterator = std::decay_t<Iterator>,
288 typename ValueType =
typename std::iterator_traits<DecayedIterator>::value_type>
290#ifndef _LIBCPP_VERSION
294 std::bool_constant<
sizeof(ValueType) == 1>,
295 std::negation<std::is_same<ValueType, bool>>,
297 std::is_convertible<DecayedIterator, const ValueType*>,
298 std::is_convertible<DecayedIterator,
typename std::vector<ValueType>::const_iterator>>>
300#ifndef _LIBCPP_VERSION
303 std::is_same<ValueType, char>,
304 std::is_convertible<DecayedIterator,
typename std::basic_string<ValueType>::const_iterator>>>
308template<
typename Iterator>
310readNumber(
size_t size, Iterator& begin, Iterator end, uint64_t& number)
noexcept
314 if (begin + size > end) {
325 std::memcpy(&value, &*begin, 2);
327 number = boost::endian::big_to_native(value);
332 std::memcpy(&value, &*begin, 4);
334 number = boost::endian::big_to_native(value);
339 std::memcpy(&value, &*begin, 8);
341 number = boost::endian::big_to_native(value);
353 for (; begin != end && count < size; ++begin, ++count) {
354 number = (number << 8) | *begin;
356 return count == size;
362template<
typename Iterator>
369 uint8_t firstOctet = *begin;
371 if (firstOctet < 253) {
376 size_t len = 1U << (firstOctet & 0b11);
380template<
typename Iterator>
382readType(Iterator& begin, Iterator end, uint32_t& type)
noexcept
386 if (!isOk || number ==
Invalid || number > std::numeric_limits<uint32_t>::max()) {
390 type =
static_cast<uint32_t
>(number);
394template<
typename Iterator>
407template<
typename Iterator>
412 if (type ==
Invalid || type > std::numeric_limits<uint32_t>::max()) {
416 return static_cast<uint32_t
>(type);
422 return number < 253 ? 1 :
423 number <= std::numeric_limits<uint16_t>::max() ? 3 :
424 number <= std::numeric_limits<uint32_t>::max() ? 5 : 9;
427template<
typename Iterator>
429readNonNegativeInteger(
size_t len, Iterator& begin, Iterator end)
431 if (len != 1 && len != 2 && len != 4 && len != 8) {
432 NDN_THROW(
Error(
"Invalid NonNegativeInteger length " + to_string(len)));
438 NDN_THROW(
Error(
"Insufficient data during NonNegativeInteger parsing"));
447 return integer <= std::numeric_limits<uint8_t>::max() ? 1 :
448 integer <= std::numeric_limits<uint16_t>::max() ? 2 :
449 integer <= std::numeric_limits<uint32_t>::max() ? 4 : 8;
#define NDN_CXX_UNREACHABLE
Represents a Data packet.
Represents an Interest packet.
Represents an absolute name.
Represents a SignatureInfo or InterestSignatureInfo TLV element.
Represents an error in TLV encoding or decoding.
Common includes and macros used throughout the library.
std::disjunction< std::conjunction< std::bool_constant< sizeof(ValueType)==1 >, std::negation< std::is_same< ValueType, bool > >, std::disjunction< std::is_convertible< DecayedIterator, const ValueType * >, std::is_convertible< DecayedIterator, typename std::vector< ValueType >::const_iterator > > >, std::conjunction< std::is_same< ValueType, char >, std::is_convertible< DecayedIterator, typename std::basic_string< ValueType >::const_iterator > > > IsContiguousIterator
Determine whether to select the readNumber() implementation for ContiguousIterator.
constexpr bool readNumber(size_t size, Iterator &begin, Iterator end, uint64_t &number) noexcept
@ ByteOffsetNameComponent
@ SequenceNumNameComponent
@ ParametersSha256DigestComponent
@ ImplicitSha256DigestComponent
constexpr size_t sizeOfVarNumber(uint64_t number) noexcept
Get the number of bytes necessary to hold the value of number encoded as VAR-NUMBER.
constexpr bool readVarNumber(Iterator &begin, Iterator end, uint64_t &number) noexcept
Read VAR-NUMBER in NDN-TLV encoding.
constexpr bool readType(Iterator &begin, Iterator end, uint32_t &type) noexcept
Read TLV-TYPE.
constexpr bool isCriticalType(uint32_t type) noexcept
Determine whether a TLV-TYPE is "critical" for evolvability purpose.
ContentTypeValue
ContentType values.
@ ContentType_Key
public key, certificate
@ ContentType_Link
another name that identifies the actual data content
@ ContentType_Blob
payload
@ ContentType_Flic
File-Like ICN Collection.
@ ContentType_PrefixAnn
prefix announcement
@ ContentType_Nack
application-level nack
size_t writeNonNegativeInteger(std::ostream &os, uint64_t integer)
Write a NonNegativeInteger to the specified stream.
std::ostream & operator<<(std::ostream &os, SignatureTypeValue st)
size_t writeVarNumber(std::ostream &os, uint64_t number)
Write VAR-NUMBER to the specified stream.
constexpr size_t sizeOfNonNegativeInteger(uint64_t integer) noexcept
Get the number of bytes necessary to hold the value of integer encoded as NonNegativeInteger.
SignatureTypeValue
SignatureType values.
@ SignatureHmacWithSha256
@ SignatureSha256WithEcdsa
constexpr size_t MAX_NDN_PACKET_SIZE
Practical size limit of a network-layer packet.