Browse Source

encoding: Refactoring EncodingBuffer

Breaks: nfd:commit:c0273e3505ac2ccf843401be77a513d8eb663127
Breaks: ChronoSync:commit:e042f83a1df184a8e7a90ef00034d11026891cd1

Change-Id: I8275c6276c5ecfa280f87f584189907521febf5f
Refs: #2494, #2490
pull/2/head
Alexander Afanasyev 11 years ago committed by Alex Afanasyev
parent
commit
746338985a
  1. 6
      AUTHORS.md
  2. 26
      src/data.cpp
  3. 6
      src/data.hpp
  4. 152
      src/encoding/block-helpers.hpp
  5. 2
      src/encoding/block.cpp
  6. 19
      src/encoding/block.hpp
  7. 283
      src/encoding/encoder.cpp
  8. 343
      src/encoding/encoder.hpp
  9. 58
      src/encoding/encoding-buffer-fwd.hpp
  10. 616
      src/encoding/encoding-buffer.hpp
  11. 140
      src/encoding/estimator.cpp
  12. 162
      src/encoding/estimator.hpp
  13. 10
      src/exclude.cpp
  14. 6
      src/exclude.hpp
  15. 12
      src/interest.cpp
  16. 8
      src/interest.hpp
  17. 10
      src/key-locator.cpp
  18. 6
      src/key-locator.hpp
  19. 12
      src/management/nfd-channel-status.cpp
  20. 6
      src/management/nfd-channel-status.hpp
  21. 10
      src/management/nfd-control-parameters.cpp
  22. 6
      src/management/nfd-control-parameters.hpp
  23. 10
      src/management/nfd-face-event-notification.cpp
  24. 6
      src/management/nfd-face-event-notification.hpp
  25. 16
      src/management/nfd-face-query-filter.cpp
  26. 6
      src/management/nfd-face-query-filter.hpp
  27. 15
      src/management/nfd-face-status.cpp
  28. 6
      src/management/nfd-face-status.hpp
  29. 18
      src/management/nfd-fib-entry.cpp
  30. 10
      src/management/nfd-fib-entry.hpp
  31. 12
      src/management/nfd-forwarder-status.cpp
  32. 6
      src/management/nfd-forwarder-status.hpp
  33. 10
      src/management/nfd-local-control-header.hpp
  34. 18
      src/management/nfd-rib-entry.cpp
  35. 10
      src/management/nfd-rib-entry.hpp
  36. 10
      src/management/nfd-strategy-choice.cpp
  37. 6
      src/management/nfd-strategy-choice.hpp
  38. 22
      src/meta-info.cpp
  39. 6
      src/meta-info.hpp
  40. 10
      src/name-component.cpp
  41. 30
      src/name-component.hpp
  42. 8
      src/name.cpp
  43. 17
      src/name.hpp
  44. 10
      src/selectors.cpp
  45. 6
      src/selectors.hpp
  46. 10
      src/signature-info.cpp
  47. 6
      src/signature-info.hpp
  48. 171
      tests/unit-tests/encoding/encoder.t.cpp
  49. 120
      tests/unit-tests/encoding/estimator.t.cpp
  50. 147
      tests/unit-tests/test-block.cpp
  51. 31
      tests/unit-tests/test-name.cpp
  52. 41
      tests/unit-tests/util/simple-notification.hpp

6
AUTHORS.md

@ -3,10 +3,11 @@ ndn-cxx authors
## The primary authors are (and/or have been):
* Jeff Thompson <jefft0@remap.ucla.edu>
* Zhenkai Zhu <http://irl.cs.ucla.edu/~zhenkai/>
* Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
* Yingdi Yu <http://irl.cs.ucla.edu/~yingdi/>
* Junxiao Shi <http://www.cs.arizona.edu/people/shijunxiao/>
* Jeff Thompson <jefft0@remap.ucla.edu>
* Zhenkai Zhu <http://irl.cs.ucla.edu/~zhenkai/>
## All project authors and contributors
@ -15,7 +16,6 @@ people who have reported bugs, submitted patches, and implemented new features
in the library:
* Wentao Shang <http://irl.cs.ucla.edu/~wentao/>
* Junxiao Shi <http://www.cs.arizona.edu/people/shijunxiao/>
* Steve DiBenedetto <http://www.cs.colostate.edu/~dibenede/>
* Davide Pesavento <http://www.lip6.fr/actualite/personnes-fiche.php?ident=D1469>
* Syed Obaid Amin <http://obaidamin.weebly.com/>

26
src/data.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -47,9 +47,9 @@ Data::Data(const Block& wire)
wireDecode(wire);
}
template<bool T>
template<encoding::Tag TAG>
size_t
Data::wireEncode(EncodingImpl<T>& block, bool unsignedPortion/* = false*/) const
Data::wireEncode(EncodingImpl<TAG>& encoder, bool unsignedPortion/* = false*/) const
{
size_t totalLength = 0;
@ -69,35 +69,37 @@ Data::wireEncode(EncodingImpl<T>& block, bool unsignedPortion/* = false*/) const
if (!unsignedPortion)
{
// SignatureValue
totalLength += prependBlock(block, m_signature.getValue());
totalLength += encoder.prependBlock(m_signature.getValue());
}
// SignatureInfo
totalLength += prependBlock(block, m_signature.getInfo());
totalLength += encoder.prependBlock(m_signature.getInfo());
// Content
totalLength += prependBlock(block, getContent());
totalLength += encoder.prependBlock(getContent());
// MetaInfo
totalLength += getMetaInfo().wireEncode(block);
totalLength += getMetaInfo().wireEncode(encoder);
// Name
totalLength += getName().wireEncode(block);
totalLength += getName().wireEncode(encoder);
if (!unsignedPortion)
{
totalLength += block.prependVarNumber(totalLength);
totalLength += block.prependVarNumber(tlv::Data);
totalLength += encoder.prependVarNumber(totalLength);
totalLength += encoder.prependVarNumber(tlv::Data);
}
return totalLength;
}
template size_t
Data::wireEncode<true>(EncodingImpl<true>& block, bool unsignedPortion) const;
Data::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block,
bool unsignedPortion) const;
template size_t
Data::wireEncode<false>(EncodingImpl<false>& block, bool unsignedPortion) const;
Data::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block,
bool unsignedPortion) const;
const Block&

6
src/data.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -97,9 +97,9 @@ public:
* blocks will be encoded into the block. Note that there
* will be no outer TLV header of the Data packet.
*/
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block, bool wantUnsignedPortionOnly = false) const;
wireEncode(EncodingImpl<TAG>& block, bool wantUnsignedPortionOnly = false) const;
/**
* @brief Encode to a wire format

152
src/encoding/block-helpers.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -17,8 +17,6 @@
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*
* @author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
*/
#ifndef NDN_ENCODING_BLOCK_HELPERS_HPP
@ -27,8 +25,66 @@
#include "block.hpp"
#include "encoding-buffer.hpp"
#include <iterator>
namespace ndn {
/**
* @deprecated Use Encoder::prependBlock and Estimator::prependBlock instead
*/
template<bool P>
inline size_t
prependBlock(EncodingImpl<P>& encoder, const Block& block)
{
return encoder.prependBlock(block);
}
/**
* @deprecated Use Encoder::prependByteArrayBlock and Estimator::prependByteArrayBlock instead
*/
template<bool P>
inline size_t
prependByteArrayBlock(EncodingImpl<P>& encoder,
uint32_t type, const uint8_t* array, size_t arraySize)
{
return encoder.prependByteArrayBlock(type, array, arraySize);
}
template<bool P>
inline size_t
prependNonNegativeIntegerBlock(EncodingImpl<P>& encoder, uint32_t type, uint64_t number)
{
size_t valueLength = encoder.prependNonNegativeInteger(number);
size_t totalLength = valueLength;
totalLength += encoder.prependVarNumber(valueLength);
totalLength += encoder.prependVarNumber(type);
return totalLength;
}
template<bool P>
inline size_t
prependBooleanBlock(EncodingImpl<P>& encoder, uint32_t type)
{
size_t totalLength = encoder.prependVarNumber(0);
totalLength += encoder.prependVarNumber(type);
return totalLength;
}
template<bool P, class U>
inline size_t
prependNestedBlock(EncodingImpl<P>& encoder, uint32_t type, const U& nestedBlock)
{
size_t valueLength = nestedBlock.wireEncode(encoder);
size_t totalLength = valueLength;
totalLength += encoder.prependVarNumber(valueLength);
totalLength += encoder.prependVarNumber(type);
return totalLength;
}
inline Block
nonNegativeIntegerBlock(uint32_t type, uint64_t value)
{
@ -64,10 +120,10 @@ inline Block
dataBlock(uint32_t type, const uint8_t* data, size_t dataSize)
{
EncodingEstimator estimator;
size_t totalLength = prependByteArrayBlock(estimator, type, data, dataSize);
size_t totalLength = estimator.prependByteArrayBlock(type, data, dataSize);
EncodingBuffer encoder(totalLength, 0);
prependByteArrayBlock(encoder, type, data, dataSize);
encoder.prependByteArrayBlock(type, data, dataSize);
return encoder.block();
}
@ -78,21 +134,77 @@ dataBlock(uint32_t type, const char* data, size_t dataSize)
return dataBlock(type, reinterpret_cast<const uint8_t*>(data), dataSize);
}
// template<class InputIterator>
// inline Block
// dataBlock(uint32_t type, InputIterator first, InputIterator last)
// {
// size_t dataSize = 0;
// for (InputIterator i = first; i != last; i++)
// ++dataSize;
// OBufferStream os;
// tlv::writeVarNumber(os, type);
// tlv::writeVarNumber(os, dataSize);
// std::copy(first, last, std::ostream_iterator<uint8_t>(os));
// return Block(os.buf());
// }
/**
* @brief Helper class template to create a data block when RandomAccessIterator is used
*/
template<class Iterator>
class DataBlockFast
{
public:
BOOST_CONCEPT_ASSERT((boost::RandomAccessIterator<Iterator>));
static Block
makeBlock(uint32_t type, Iterator first, Iterator last)
{
EncodingEstimator estimator;
size_t valueLength = last - first;
size_t totalLength = valueLength;
totalLength += estimator.prependVarNumber(valueLength);
totalLength += estimator.prependVarNumber(type);
EncodingBuffer encoder(totalLength, 0);
encoder.prependRange(first, last);
encoder.prependVarNumber(valueLength);
encoder.prependVarNumber(type);
return encoder.block();
}
};
/**
* @brief Helper class template to create a data block when generic InputIterator is used
*/
template<class Iterator>
class DataBlockSlow
{
public:
BOOST_CONCEPT_ASSERT((boost::InputIterator<Iterator>));
static Block
makeBlock(uint32_t type, Iterator first, Iterator last)
{
// reserve 4 bytes in front (common for 1(type)-3(length) encoding
// Actual size will be adjusted as necessary by the encoder
EncodingBuffer encoder(4, 4);
size_t valueLength = encoder.appendRange(first, last);
encoder.prependVarNumber(valueLength);
encoder.prependVarNumber(type);
return encoder.block();
}
};
/**
* @brief Free function to create a block given @p type and range [@p first, @p last) of bytes
* @tparam Iterator iterator type satisfying at least InputIterator concept. Implementation
* is more optimal when the iterator type satisfies RandomAccessIterator concept
* It is required that sizeof(std::iterator_traits<Iterator>::value_type) == 1.
*/
template<class Iterator>
inline Block
dataBlock(uint32_t type, Iterator first, Iterator last)
{
static_assert(sizeof(typename std::iterator_traits<Iterator>::value_type) == 1,
"Iterator should point only to char or unsigned char");
typedef typename boost::mpl::if_<
std::is_base_of<std::random_access_iterator_tag,
typename std::iterator_traits<Iterator>::iterator_category>,
DataBlockFast<Iterator>,
DataBlockSlow<Iterator>>::type DataBlock;
return DataBlock::makeBlock(type, first, last);
}
} // namespace ndn

2
src/encoding/block.cpp

@ -51,7 +51,7 @@ Block::Block()
}
Block::Block(const EncodingBuffer& buffer)
: m_buffer(buffer.m_buffer)
: m_buffer(const_cast<EncodingBuffer&>(buffer).getBuffer())
, m_begin(buffer.begin())
, m_end(buffer.end())
, m_size(m_end - m_begin)

19
src/encoding/block.hpp

@ -28,6 +28,7 @@
#include "buffer.hpp"
#include "tlv.hpp"
#include "encoding-buffer-fwd.hpp"
namespace boost {
namespace asio {
@ -37,9 +38,6 @@ class const_buffer;
namespace ndn {
template<bool> class EncodingImpl;
typedef EncodingImpl<true> EncodingBuffer;
/** @brief Class representing a wire element of NDN-TLV packet format
*/
class Block
@ -247,6 +245,12 @@ public: // sub elements
Block
blockFromValue() const;
/**
* @brief Get underlying buffer
*/
shared_ptr<const Buffer>
getBuffer() const;
public: // EqualityComparable concept
bool
operator==(const Block& other) const;
@ -258,7 +262,7 @@ public: // ConvertibleToConstBuffer
operator boost::asio::const_buffer() const;
protected:
ConstBufferPtr m_buffer;
shared_ptr<const Buffer> m_buffer;
uint32_t m_type;
@ -270,13 +274,18 @@ protected:
Buffer::const_iterator m_value_end;
mutable element_container m_subBlocks;
friend class EncodingImpl<true>;
};
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
inline shared_ptr<const Buffer>
Block::getBuffer() const
{
return m_buffer;
}
inline bool
Block::empty() const
{

283
src/encoding/encoder.cpp

@ -0,0 +1,283 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received copies of the GNU General Public License and GNU Lesser
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*/
#include "encoder.hpp"
namespace ndn {
namespace encoding {
Encoder::Encoder(size_t totalReserve/* = 8800*/, size_t reserveFromBack/* = 400*/)
: m_buffer(new Buffer(totalReserve))
{
m_begin = m_end = m_buffer->end() - (reserveFromBack < totalReserve ? reserveFromBack : 0);
}
Encoder::Encoder(const Block& block)
: m_buffer(const_pointer_cast<Buffer>(block.getBuffer()))
, m_begin(m_buffer->begin() + (block.begin() - m_buffer->begin()))
, m_end(m_buffer->begin() + (block.end() - m_buffer->begin()))
{
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
void
Encoder::reserveBack(size_t size)
{
if ((m_end + size) > m_buffer->end())
reserve(m_buffer->size() * 2 + size, false);
}
void
Encoder::reserveFront(size_t size)
{
if ((m_buffer->begin() + size) > m_begin)
reserve(m_buffer->size() * 2 + size, true);
}
Block
Encoder::block(bool verifyLength/* = true*/) const
{
return Block(m_buffer,
m_begin, m_end,
verifyLength);
}
void
Encoder::reserve(size_t size, bool addInFront)
{
if (size < m_buffer->size()) {
size = m_buffer->size();
}
if (addInFront) {
size_t diffEnd = m_buffer->end() - m_end;
size_t diffBegin = m_buffer->end() - m_begin;
Buffer* buf = new Buffer(size);
std::copy_backward(m_buffer->begin(), m_buffer->end(), buf->end());
m_buffer.reset(buf);
m_end = m_buffer->end() - diffEnd;
m_begin = m_buffer->end() - diffBegin;
}
else {
size_t diffEnd = m_end - m_buffer->begin();
size_t diffBegin = m_begin - m_buffer->begin();
Buffer* buf = new Buffer(size);
std::copy(m_buffer->begin(), m_buffer->end(), buf->begin());
m_buffer.reset(buf);
m_end = m_buffer->begin() + diffEnd;
m_begin = m_buffer->begin() + diffBegin;
}
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
size_t
Encoder::prependByte(uint8_t value)
{
reserveFront(1);
m_begin--;
*m_begin = value;
return 1;
}
size_t
Encoder::appendByte(uint8_t value)
{
reserveBack(1);
*m_end = value;
m_end++;
return 1;
}
size_t
Encoder::prependByteArray(const uint8_t* array, size_t length)
{
reserveFront(length);
m_begin -= length;
std::copy(array, array + length, m_begin);
return length;
}
size_t
Encoder::appendByteArray(const uint8_t* array, size_t length)
{
reserveBack(length);
std::copy(array, array + length, m_end);
m_end += length;
return length;
}
size_t
Encoder::prependVarNumber(uint64_t varNumber)
{
if (varNumber < 253) {
prependByte(static_cast<uint8_t>(varNumber));
return 1;
}
else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
uint16_t value = htobe16(static_cast<uint16_t>(varNumber));
prependByteArray(reinterpret_cast<const uint8_t*>(&value), 2);
prependByte(253);
return 3;
}
else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
uint32_t value = htobe32(static_cast<uint32_t>(varNumber));
prependByteArray(reinterpret_cast<const uint8_t*>(&value), 4);
prependByte(254);
return 5;
}
else {
uint64_t value = htobe64(varNumber);
prependByteArray(reinterpret_cast<const uint8_t*>(&value), 8);
prependByte(255);
return 9;
}
}
size_t
Encoder::appendVarNumber(uint64_t varNumber)
{
if (varNumber < 253) {
appendByte(static_cast<uint8_t>(varNumber));
return 1;
}
else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
appendByte(253);
uint16_t value = htobe16(static_cast<uint16_t>(varNumber));
appendByteArray(reinterpret_cast<const uint8_t*>(&value), 2);
return 3;
}
else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
appendByte(254);
uint32_t value = htobe32(static_cast<uint32_t>(varNumber));
appendByteArray(reinterpret_cast<const uint8_t*>(&value), 4);
return 5;
}
else {
appendByte(255);
uint64_t value = htobe64(varNumber);
appendByteArray(reinterpret_cast<const uint8_t*>(&value), 8);
return 9;
}
}
size_t
Encoder::prependNonNegativeInteger(uint64_t varNumber)
{
if (varNumber <= std::numeric_limits<uint8_t>::max()) {
return prependByte(static_cast<uint8_t>(varNumber));
}
else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
uint16_t value = htobe16(static_cast<uint16_t>(varNumber));
return prependByteArray(reinterpret_cast<const uint8_t*>(&value), 2);
}
else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
uint32_t value = htobe32(static_cast<uint32_t>(varNumber));
return prependByteArray(reinterpret_cast<const uint8_t*>(&value), 4);
}
else {
uint64_t value = htobe64(varNumber);
return prependByteArray(reinterpret_cast<const uint8_t*>(&value), 8);
}
}
size_t
Encoder::appendNonNegativeInteger(uint64_t varNumber)
{
if (varNumber <= std::numeric_limits<uint8_t>::max()) {
return appendByte(static_cast<uint8_t>(varNumber));
}
else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
uint16_t value = htobe16(static_cast<uint16_t>(varNumber));
return appendByteArray(reinterpret_cast<const uint8_t*>(&value), 2);
}
else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
uint32_t value = htobe32(static_cast<uint32_t>(varNumber));
return appendByteArray(reinterpret_cast<const uint8_t*>(&value), 4);
}
else {
uint64_t value = htobe64(varNumber);
return appendByteArray(reinterpret_cast<const uint8_t*>(&value), 8);
}
}
size_t
Encoder::prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize)
{
size_t totalLength = prependByteArray(array, arraySize);
totalLength += prependVarNumber(arraySize);
totalLength += prependVarNumber(type);
return totalLength;
}
size_t
Encoder::appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize)
{
size_t totalLength = appendVarNumber(type);
totalLength += appendVarNumber(arraySize);
totalLength += appendByteArray(array, arraySize);
return totalLength;
}
size_t
Encoder::prependBlock(const Block& block)
{
if (block.hasWire()) {
return prependByteArray(block.wire(), block.size());
}
else {
return prependByteArrayBlock(block.type(), block.value(), block.value_size());
}
}
size_t
Encoder::appendBlock(const Block& block)
{
if (block.hasWire()) {
return appendByteArray(block.wire(), block.size());
}
else {
return appendByteArrayBlock(block.type(), block.value(), block.value_size());
}
}
} // namespace encoding
} // namespace ndn

343
src/encoding/encoder.hpp

@ -0,0 +1,343 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received copies of the GNU General Public License and GNU Lesser
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*/
#ifndef NDN_ENCODING_ENCODER_HPP
#define NDN_ENCODING_ENCODER_HPP
#include "../common.hpp"
#include "block.hpp"
namespace ndn {
namespace encoding {
/**
* @brief Helper class to perform TLV encoding
* Interface of this class (mostly) matches interface of Estimator class
* @sa Estimator
*/
class Encoder
{
public: // common interface between Encoder and Estimator
/**
* @brief Create instance of the encoder with the specified reserved sizes
* @param totalReserve initial buffer size to reserve
* @param totalFromBack number of bytes to reserve for append* operations
*/
explicit
Encoder(size_t totalReserve = 8800, size_t reserveFromBack = 400);
Encoder(const Encoder&) = delete;
Encoder&
operator=(const Encoder&) = delete;
/**
* @brief Prepend a byte
*/
size_t
prependByte(uint8_t value);
/**
* @brief Append a byte
*/
size_t
appendByte(uint8_t value);
/**
* @brief Prepend a byte array @p array of length @p length
*/
size_t
prependByteArray(const uint8_t* array, size_t length);
/**
* @brief Append a byte array @p array of length @p length
*/
size_t
appendByteArray(const uint8_t* array, size_t length);
/**
* @brief Prepend range of bytes from the range [@p first, @p last)
*/
template<class Iterator>
size_t
prependRange(Iterator first, Iterator last);
/**
* @brief Append range of bytes from the range [@p first, @p last)
*/
template<class Iterator>
size_t
appendRange(Iterator first, Iterator last);
/**
* @brief Prepend VarNumber @p varNumber of NDN TLV encoding
* @sa http://named-data.net/doc/ndn-tlv/
*/
size_t
prependVarNumber(uint64_t varNumber);
/**
* @brief Prepend VarNumber @p varNumber of NDN TLV encoding
* @sa http://named-data.net/doc/ndn-tlv/
*/
size_t
appendVarNumber(uint64_t varNumber);
/**
* @brief Prepend non-negative integer @p integer of NDN TLV encoding
* @sa http://named-data.net/doc/ndn-tlv/
*/
size_t
prependNonNegativeInteger(uint64_t integer);
/**
* @brief Append non-negative integer @p integer of NDN TLV encoding
* @sa http://named-data.net/doc/ndn-tlv/
*/
size_t
appendNonNegativeInteger(uint64_t integer);
/**
* @brief Prepend TLV block of type @p type and value from buffer @p array of size @p arraySize
*/
size_t
prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize);
/**
* @brief Append TLV block of type @p type and value from buffer @p array of size @p arraySize
*/
size_t
appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize);
/**
* @brief Prepend TLV block @p block
*/
size_t
prependBlock(const Block& block);
/**
* @brief Append TLV block @p block
*/
size_t
appendBlock(const Block& block);
public: // unique interface to the Encoder
typedef Buffer::value_type value_type;
typedef Buffer::iterator iterator;
typedef Buffer::const_iterator const_iterator;
/**
* @brief Create EncodingBlock from existing block
*
* This is a dangerous constructor and should be used with caution.
* It will modify contents of the buffer that is used by block and may
* impact data in other blocks.
*
* The primary purpose for this method is to be used to extend Block
* after sign operation.
*/
explicit
Encoder(const Block& block);
/**
* @brief Reserve @p size bytes for the underlying buffer
* @param addInFront if true, then @p size bytes will be available in front (i.e., subsequent call
* to prepend* will not need to allocate memory). If false, then reservation will be done
* at the end of the buffer (i.d., for subsequent append* calls)
* @note Reserve size is exact, unlike reserveFront and reserveBack methods
* @sa reserveFront, reserveBack
*/
void
reserve(size_t size, bool addInFront);
/**
* @brief Reserve at least @p size bytes at the back of the underlying buffer
* @note the actual reserve size can be (and in most cases is) larger than specified reservation
* length
*/
void
reserveBack(size_t size);
/**
* @brief Reserve at least @p isze bytes at the beginning of the underlying buffer
* @note the actual reserve size can be (and in most cases is) larger than specified reservation
* length
*/
void
reserveFront(size_t size);
/**
* @brief Get size of the underlying buffer
*/
size_t
capacity() const;
/**
* @brief Get underlying buffer
*/
shared_ptr<Buffer>
getBuffer();
public: // accessors
/**
* @brief Get an iterator pointing to the first byte of the encoded buffer
*/
iterator
begin();
/**
* @brief Get an iterator pointing to the past-the-end byte of the encoded buffer
*/
iterator
end();
/**
* @brief Get an iterator pointing to the first byte of the encoded buffer
*/
const_iterator
begin() const;
const_iterator
end() const;
/**
* @brief Get a pointer to the first byte of the encoded buffer
*/
uint8_t*
buf();
/**
* @brief Get a pointer to the first byte of the encoded buffer
*/
const uint8_t*
buf() const;
/**
* @brief Get size of the encoded buffer
*/
size_t
size() const;
/**
* @brief Create Block from the underlying buffer
*
* @param verifyLength If this parameter set to true, Block's constructor
* will be requested to verify consistency of the encoded
* length in the Block, otherwise ignored
*/
Block
block(bool verifyLength = true) const;
private:
shared_ptr<Buffer> m_buffer;
// invariant: m_begin always points to the position of last-written byte (if prepending data)
iterator m_begin;
// invariant: m_end always points to the position of next unwritten byte (if appending data)
iterator m_end;
};
inline size_t
Encoder::size() const
{
return m_end - m_begin;
}
inline shared_ptr<Buffer>
Encoder::getBuffer()
{
return m_buffer;
}
inline size_t
Encoder::capacity() const
{
return m_buffer->size();
}
inline Buffer::iterator
Encoder::begin()
{
return m_begin;
}
inline Buffer::iterator
Encoder::end()
{
return m_end;
}
inline Buffer::const_iterator
Encoder::begin() const
{
return m_begin;
}
inline Buffer::const_iterator
Encoder::end() const
{
return m_end;
}
inline uint8_t*
Encoder::buf()
{
return &(*m_begin);
}
inline const uint8_t*
Encoder::buf() const
{
return &(*m_begin);
}
template<class Iterator>
inline size_t
Encoder::prependRange(Iterator first, Iterator last)
{
size_t length = std::distance(first, last);
reserveFront(length);
m_begin -= length;
std::copy(first, last, m_begin);
return length;
}
template<class Iterator>
inline size_t
Encoder::appendRange(Iterator first, Iterator last)
{
size_t length = std::distance(first, last);
reserveBack(length);
std::copy(first, last, m_end);
m_end += length;
return length;
}
} // namespace encoding
} // namespace ndn
#endif // NDN_ENCODING_ENCODER_HPP

58
src/encoding/encoding-buffer-fwd.hpp

@ -0,0 +1,58 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received copies of the GNU General Public License and GNU Lesser
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*/
#ifndef NDN_ENCODING_ENCODING_BUFFER_FWD_HPP
#define NDN_ENCODING_ENCODING_BUFFER_FWD_HPP
namespace ndn {
namespace encoding {
typedef bool Tag;
/**
* @brief Tag for EncodingImpl to indicate that Encoder is requested
* Implementation of the tag may change to class. Use of true directly
* as a template parameter is discouraged.
*/
static const Tag EncoderTag = true;
/**
* @brief Tag for EncodingImpl to indicate that Estimator is requested
* Implementation of the tag may change to class. Use of false directly
* as a template parameter is discouraged.
*/
static const Tag EstimatorTag = false;
template<Tag TAG>
class EncodingImpl;
typedef EncodingImpl<EncoderTag> EncodingBuffer;
typedef EncodingImpl<EstimatorTag> EncodingEstimator;
} // namespace encoding
using encoding::EncodingImpl;
using encoding::EncodingBuffer;
using encoding::EncodingEstimator;
} // namespace ndn
#endif // NDN_ENCODING_ENCODING_BUFFER_FWD_HPP

616
src/encoding/encoding-buffer.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -17,636 +17,54 @@
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*
* @author Wentao Shang <http://irl.cs.ucla.edu/~wentao/>
* @author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
*/
#ifndef NDN_ENCODING_ENCODING_BUFFER_HPP
#define NDN_ENCODING_ENCODING_BUFFER_HPP
#include "../common.hpp"
#include "buffer.hpp"
#include "block.hpp"
#include "encoding-buffer-fwd.hpp"
#include "encoder.hpp"
#include "estimator.hpp"
namespace ndn {
namespace encoding {
static const bool Buffer = true;
static const bool Estimator = false;
} // encoding
template<bool isRealEncoderNotEstimator>
class EncodingImpl;
typedef EncodingImpl<encoding::Buffer> EncodingBuffer;
typedef EncodingImpl<encoding::Estimator> EncodingEstimator;
/**
* @brief Class representing wire element of the NDN packet
* @brief EncodingImpl specialization for real TLV encoding
*/
template<>
class EncodingImpl<encoding::Buffer>
class EncodingImpl<EncoderTag> : public encoding::Encoder
{
public:
/**
* @brief Constructor to create a EncodingImpl with specified reserved sizes
*
* The caller should make sure that that reserveFromBack does not exceed totalReserve,
* otherwise behavior is undefined.
*/
EncodingImpl(size_t totalReserve = 8800,
size_t reserveFromBack = 400)
: m_buffer(new Buffer(totalReserve))
explicit
EncodingImpl(size_t totalReserve = 8800, size_t reserveFromBack = 400)
: Encoder(totalReserve, reserveFromBack)
{
m_begin = m_end = m_buffer->end() - (reserveFromBack < totalReserve ? reserveFromBack : 0);
}
/**
* @brief Create EncodingBlock from existing block
*
* This is a dangerous constructor and should be used with caution.
* It will modify contents of the buffer that is used by block and may
* impact data in other blocks.
*
* The primary purpose for this method is to be used to extend Block
* after sign operation.
*/
explicit
EncodingImpl(const Block& block)
: m_buffer(const_pointer_cast<Buffer>(block.m_buffer))
, m_begin(m_buffer->begin() + (block.begin() - m_buffer->begin()))
, m_end(m_buffer->begin() + (block.end() - m_buffer->begin()))
: Encoder(block)
{
}
inline size_t
size() const;
inline size_t
capacity() const;
inline uint8_t*
buf();
inline const uint8_t*
buf() const;
/**
* @brief Create Block from the underlying EncodingBuffer
*
* @param verifyLength If this parameter set to true, Block's constructor
* will be requested to verify consistency of the encoded
* length in the Block, otherwise ignored
*/
inline Block
block(bool verifyLength = true) const;
inline void
resize(size_t size, bool addInFront);
inline Buffer::iterator
begin();
inline Buffer::iterator
end();
inline Buffer::const_iterator
begin() const;
inline Buffer::const_iterator
end() const;
inline size_t
prependByte(uint8_t value);
inline size_t
prependByteArray(const uint8_t* array, size_t length);
inline size_t
prependNonNegativeInteger(uint64_t varNumber);
inline size_t
prependVarNumber(uint64_t varNumber);
inline size_t
prependBlock(const Block& block);
inline size_t
appendByte(uint8_t value);
inline size_t
appendByteArray(const uint8_t* array, size_t length);
inline size_t
appendNonNegativeInteger(uint64_t varNumber);
inline size_t
appendVarNumber(uint64_t varNumber);
inline size_t
appendBlock(const Block& block);
// inline void
// removeByteFromFront();
// inline void
// removeByteFromEnd();
// inline void
// removeVarNumberFromFront(uint64_t varNumber);
// inline void
// removeVarNumberFromBack(uint64_t varNumber);
private:
BufferPtr m_buffer;
// invariant: m_begin always points to the position of last-written byte (if prepending data)
Buffer::iterator m_begin;
// invariant: m_end always points to the position of next unwritten byte (if appending data)
Buffer::iterator m_end;
friend class Block;
};
/**
* @brief Class representing wire element of the NDN packet
* @brief EncodingImpl specialization TLV size estimation
*/
template<>
class EncodingImpl<encoding::Estimator>
class EncodingImpl<EstimatorTag> : public encoding::Estimator
{
public:
EncodingImpl(size_t totalReserve = 8800,
size_t reserveFromBack = 400)
explicit
EncodingImpl(size_t totalReserve = 0, size_t totalFromBack = 0)
: Estimator(totalReserve, totalFromBack)
{
}
inline size_t
prependByte(uint8_t value);
inline size_t
prependByteArray(const uint8_t* array, size_t length);
inline size_t
prependNonNegativeInteger(uint64_t varNumber);
inline size_t
prependVarNumber(uint64_t varNumber);
inline size_t
prependBlock(const Block& block);
inline size_t
appendByte(uint8_t value);
inline size_t
appendByteArray(const uint8_t* array, size_t length);
inline size_t
appendNonNegativeInteger(uint64_t varNumber);
inline size_t
appendVarNumber(uint64_t varNumber);
inline size_t
appendBlock(const Block& block);
};
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
/// helper methods
template<bool P>
inline size_t
prependNonNegativeIntegerBlock(EncodingImpl<P>& encoder, uint32_t type, uint64_t number)
{
size_t valueLength = encoder.prependNonNegativeInteger(number);
size_t totalLength = valueLength;
totalLength += encoder.prependVarNumber(valueLength);
totalLength += encoder.prependVarNumber(type);
return totalLength;
}
template<bool P>
inline size_t
prependByteArrayBlock(EncodingImpl<P>& encoder, uint32_t type,
const uint8_t* array, size_t arraySize)
{
size_t valueLength = encoder.prependByteArray(array, arraySize);
size_t totalLength = valueLength;
totalLength += encoder.prependVarNumber(valueLength);
totalLength += encoder.prependVarNumber(type);
return totalLength;
}
template<bool P>
inline size_t
prependBooleanBlock(EncodingImpl<P>& encoder, uint32_t type)
{
size_t totalLength = encoder.prependVarNumber(0);
totalLength += encoder.prependVarNumber(type);
return totalLength;
}
template<bool P, class U>
inline size_t
prependNestedBlock(EncodingImpl<P>& encoder, uint32_t type, const U& nestedBlock)
{
size_t valueLength = nestedBlock.wireEncode(encoder);
size_t totalLength = valueLength;
totalLength += encoder.prependVarNumber(valueLength);
totalLength += encoder.prependVarNumber(type);
return totalLength;
}
template<bool P>
inline size_t
prependBlock(EncodingImpl<P>& encoder, const Block& block)
{
return encoder.prependByteArray(block.wire(), block.size());
}
template<bool P>
inline size_t
appendByteArrayBlock(EncodingImpl<P>& encoder, uint32_t type,
const uint8_t* array, size_t arraySize)
{
size_t totalLength = encoder.appendVarNumber(type);
totalLength += encoder.appendVarNumber(arraySize);
totalLength += encoder.appendByteArray(array, arraySize);
return totalLength;
}
template<bool P>
inline size_t
appendBlock(EncodingImpl<P>& encoder, const Block& block)
{
return encoder.appendByteArray(block.wire(), block.size());
}
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////
inline size_t
EncodingImpl<encoding::Buffer>::size() const
{
return m_end - m_begin;
}
inline size_t
EncodingImpl<encoding::Buffer>::capacity() const
{
return m_buffer->size();
}
inline uint8_t*
EncodingImpl<encoding::Buffer>::buf()
{
return &(*m_begin);
}
inline const uint8_t*
EncodingImpl<encoding::Buffer>::buf() const
{
return &(*m_begin);
}
inline Block
EncodingImpl<encoding::Buffer>::block(bool verifyLength/* = true*/) const
{
return Block(m_buffer,
m_begin, m_end,
verifyLength);
}
inline void
EncodingImpl<encoding::Buffer>::resize(size_t size, bool addInFront)
{
if (addInFront)
{
size_t diff_end = m_buffer->end() - m_end;
size_t diff_begin = m_buffer->end() - m_begin;
Buffer* buf = new Buffer(size);
std::copy_backward(m_buffer->begin(), m_buffer->end(), buf->end());
m_buffer.reset(buf);
m_end = m_buffer->end() - diff_end;
m_begin = m_buffer->end() - diff_begin;
}
else
{
size_t diff_end = m_end - m_buffer->begin();
size_t diff_begin = m_begin - m_buffer->begin();
Buffer* buf = new Buffer(size);
std::copy(m_buffer->begin(), m_buffer->end(), buf->begin());
m_buffer.reset(buf);
m_end = m_buffer->begin() + diff_end;
m_begin = m_buffer->begin() + diff_begin;
}
}
inline Buffer::iterator
EncodingImpl<encoding::Buffer>::begin()
{
return m_begin;
}
inline Buffer::iterator
EncodingImpl<encoding::Buffer>::end()
{
return m_end;
}
inline Buffer::const_iterator
EncodingImpl<encoding::Buffer>::begin() const
{
return m_begin;
}
inline Buffer::const_iterator
EncodingImpl<encoding::Buffer>::end() const
{
return m_end;
}
//////////////////////////////////////////////////////////
// Prepend to the back of the buffer. Resize if needed. //
//////////////////////////////////////////////////////////
inline size_t
EncodingImpl<encoding::Buffer>::prependByte(uint8_t value)
{
if (m_begin == m_buffer->begin())
resize(m_buffer->size() * 2, true);
m_begin--;
*m_begin = value;
return 1;
}
inline size_t
EncodingImpl<encoding::Estimator>::prependByte(uint8_t value)
{
return 1;
}
inline size_t
EncodingImpl<encoding::Buffer>::prependByteArray(const uint8_t* array, size_t length)
{
if ((m_buffer->begin() + length) > m_begin)
resize(m_buffer->size() * 2 + length, true);
m_begin -= length;
std::copy(array, array + length, m_begin);
return length;
}
inline size_t
EncodingImpl<encoding::Estimator>::prependByteArray(const uint8_t* array, size_t length)
{
return length;
}
inline size_t
EncodingImpl<encoding::Buffer>::prependNonNegativeInteger(uint64_t varNumber)
{
if (varNumber <= std::numeric_limits<uint8_t>::max()) {
return prependByte(static_cast<uint8_t>(varNumber));
}
else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
uint16_t value = htobe16(static_cast<uint16_t>(varNumber));
return prependByteArray(reinterpret_cast<const uint8_t*>(&value), 2);
}
else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
uint32_t value = htobe32(static_cast<uint32_t>(varNumber));
return prependByteArray(reinterpret_cast<const uint8_t*>(&value), 4);
}
else {
uint64_t value = htobe64(varNumber);
return prependByteArray(reinterpret_cast<const uint8_t*>(&value), 8);
}
}
inline size_t
EncodingImpl<encoding::Estimator>::prependNonNegativeInteger(uint64_t varNumber)
{
if (varNumber <= std::numeric_limits<uint8_t>::max()) {
return 1;
}
else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
return 2;
}
else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
return 4;
}
else {
return 8;
}
}
inline size_t
EncodingImpl<encoding::Buffer>::prependVarNumber(uint64_t varNumber)
{
if (varNumber < 253) {
prependByte(static_cast<uint8_t>(varNumber));
return 1;
}
else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
uint16_t value = htobe16(static_cast<uint16_t>(varNumber));
prependByteArray(reinterpret_cast<const uint8_t*>(&value), 2);
prependByte(253);
return 3;
}
else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
uint32_t value = htobe32(static_cast<uint32_t>(varNumber));
prependByteArray(reinterpret_cast<const uint8_t*>(&value), 4);
prependByte(254);
return 5;
}
else {
uint64_t value = htobe64(varNumber);
prependByteArray(reinterpret_cast<const uint8_t*>(&value), 8);
prependByte(255);
return 9;
}
}
inline size_t
EncodingImpl<encoding::Estimator>::prependVarNumber(uint64_t varNumber)
{
if (varNumber < 253) {
return 1;
}
else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
return 3;
}
else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
return 5;
}
else {
return 9;
}
}
inline size_t
EncodingImpl<encoding::Buffer>::prependBlock(const Block& block)
{
if (block.hasWire()) {
return prependByteArray(block.wire(), block.size());
}
else {
return prependByteArrayBlock(*this, block.type(), block.value(), block.value_size());
}
}
inline size_t
EncodingImpl<encoding::Estimator>::prependBlock(const Block& block)
{
if (block.hasWire()) {
return block.size();
}
else {
return prependByteArrayBlock(*this, block.type(), block.value(), block.value_size());
}
}
/////////////////////////////////////////////////////////
// Append to the back of the buffer. Resize if needed. //
/////////////////////////////////////////////////////////
inline size_t
EncodingImpl<encoding::Buffer>::appendByte(uint8_t value)
{
if (m_end == m_buffer->end())
resize(m_buffer->size() * 2, false);
*m_end = value;
m_end++;
return 1;
}
inline size_t
EncodingImpl<encoding::Estimator>::appendByte(uint8_t value)
{
return 1;
}
inline size_t
EncodingImpl<encoding::Buffer>::appendByteArray(const uint8_t* array, size_t length)
{
if ((m_end + length) > m_buffer->end())
resize(m_buffer->size() * 2 + length, false);
std::copy(array, array + length, m_end);
m_end += length;
return length;
}
inline size_t
EncodingImpl<encoding::Buffer>::appendBlock(const Block& block)
{
if (block.hasWire()) {
return appendByteArray(block.wire(), block.size());
}
else {
return appendByteArrayBlock(*this, block.type(), block.value(), block.value_size());
}
}
inline size_t
EncodingImpl<encoding::Estimator>::appendBlock(const Block& block)
{
if (block.hasWire()) {
return block.size();
}
else {
return appendByteArrayBlock(*this, block.type(), block.value(), block.value_size());
}
}
inline size_t
EncodingImpl<encoding::Estimator>::appendByteArray(const uint8_t* array, size_t length)
{
return prependByteArray(array, length);
}
inline size_t
EncodingImpl<encoding::Buffer>::appendNonNegativeInteger(uint64_t varNumber)
{
if (varNumber <= std::numeric_limits<uint8_t>::max()) {
return appendByte(static_cast<uint8_t>(varNumber));
}
else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
uint16_t value = htobe16(static_cast<uint16_t>(varNumber));
return appendByteArray(reinterpret_cast<const uint8_t*>(&value), 2);
}
else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
uint32_t value = htobe32(static_cast<uint32_t>(varNumber));
return appendByteArray(reinterpret_cast<const uint8_t*>(&value), 4);
}
else {
uint64_t value = htobe64(varNumber);
return appendByteArray(reinterpret_cast<const uint8_t*>(&value), 8);
}
}
inline size_t
EncodingImpl<encoding::Estimator>::appendNonNegativeInteger(uint64_t varNumber)
{
return prependNonNegativeInteger(varNumber);
}
inline size_t
EncodingImpl<encoding::Buffer>::appendVarNumber(uint64_t varNumber)
{
if (varNumber < 253) {
appendByte(static_cast<uint8_t>(varNumber));
return 1;
}
else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
appendByte(253);
uint16_t value = htobe16(static_cast<uint16_t>(varNumber));
appendByteArray(reinterpret_cast<const uint8_t*>(&value), 2);
return 3;
}
else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
appendByte(254);
uint32_t value = htobe32(static_cast<uint32_t>(varNumber));
appendByteArray(reinterpret_cast<const uint8_t*>(&value), 4);
return 5;
}
else {
appendByte(255);
uint64_t value = htobe64(varNumber);
appendByteArray(reinterpret_cast<const uint8_t*>(&value), 8);
return 9;
}
}
inline size_t
EncodingImpl<encoding::Estimator>::appendVarNumber(uint64_t varNumber)
{
return prependVarNumber(varNumber);
}
} // ndn
} // namespace encoding
} // namespace ndn
#endif // NDN_ENCODING_ENCODING_BUFFER_HPP

140
src/encoding/estimator.cpp

@ -0,0 +1,140 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received copies of the GNU General Public License and GNU Lesser
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*/
#include "estimator.hpp"
namespace ndn {
namespace encoding {
Estimator::Estimator(size_t totalReserve, size_t reserveFromBack)
{
}
size_t
Estimator::prependByte(uint8_t value)
{
return 1;
}
size_t
Estimator::appendByte(uint8_t value)
{
return 1;
}
size_t
Estimator::prependByteArray(const uint8_t* array, size_t length)
{
return length;
}
size_t
Estimator::appendByteArray(const uint8_t* array, size_t length)
{
return prependByteArray(array, length);
}
size_t
Estimator::prependVarNumber(uint64_t varNumber)
{
if (varNumber < 253) {
return 1;
}
else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
return 3;
}
else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
return 5;
}
else {
return 9;
}
}
size_t
Estimator::appendVarNumber(uint64_t varNumber)
{
return prependVarNumber(varNumber);
}
size_t
Estimator::prependNonNegativeInteger(uint64_t varNumber)
{
if (varNumber <= std::numeric_limits<uint8_t>::max()) {
return 1;
}
else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
return 2;
}
else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
return 4;
}
else {
return 8;
}
}
size_t
Estimator::appendNonNegativeInteger(uint64_t varNumber)
{
return prependNonNegativeInteger(varNumber);
}
size_t
Estimator::prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize)
{
size_t totalLength = arraySize;
totalLength += prependVarNumber(arraySize);
totalLength += prependVarNumber(type);
return totalLength;
}
size_t
Estimator::appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize)
{
return prependByteArrayBlock(type, array, arraySize);
}
size_t
Estimator::prependBlock(const Block& block)
{
if (block.hasWire()) {
return block.size();
}
else {
return prependByteArrayBlock(block.type(), block.value(), block.value_size());
}
}
size_t
Estimator::appendBlock(const Block& block)
{
return prependBlock(block);
}
} // namespace encoding
} // namespace ndn

162
src/encoding/estimator.hpp

@ -0,0 +1,162 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received copies of the GNU General Public License and GNU Lesser
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*/
#ifndef NDN_ENCODING_ESTIMATOR_HPP
#define NDN_ENCODING_ESTIMATOR_HPP
#include "../common.hpp"
#include "block.hpp"
namespace ndn {
namespace encoding {
/**
* @brief Helper class to estimate size of TLV encoding
* Interface of this class (mostly) matches interface of Encoder class
* @sa Encoder
*/
class Estimator
{
public: // common interface between Encoder and Estimator
/**
* @brief Create instance of the estimator
* @param totalReserve not used (for compatibility with the Encoder)
* @param totalFromBack not used (for compatibility with the Encoder)
*/
explicit
Estimator(size_t totalReserve = 0, size_t reserveFromBack = 0);
Estimator(const Estimator&) = delete;
Estimator&
operator=(const Estimator&) = delete;
/**
* @brief Prepend a byte
*/
size_t
prependByte(uint8_t value);
/**
* @brief Append a byte
*/
size_t
appendByte(uint8_t value);
/**
* @brief Prepend a byte array @p array of length @p length
*/
size_t
prependByteArray(const uint8_t* array, size_t length);
/**
* @brief Append a byte array @p array of length @p length
*/
size_t
appendByteArray(const uint8_t* array, size_t length);
/**
* @brief Prepend range of bytes from the range [@p first, @p last)
*/
template<class Iterator>
size_t
prependRange(Iterator first, Iterator last);
/**
* @brief Append range of bytes from the range [@p first, @p last)
*/
template<class Iterator>
size_t
appendRange(Iterator first, Iterator last);
/**
* @brief Prepend VarNumber @p varNumber of NDN TLV encoding
* @sa http://named-data.net/doc/ndn-tlv/
*/
size_t
prependVarNumber(uint64_t varNumber);
/**
* @brief Prepend VarNumber @p varNumber of NDN TLV encoding
* @sa http://named-data.net/doc/ndn-tlv/
*/
size_t
appendVarNumber(uint64_t varNumber);
/**
* @brief Prepend non-negative integer @p integer of NDN TLV encoding
* @sa http://named-data.net/doc/ndn-tlv/
*/
size_t
prependNonNegativeInteger(uint64_t integer);
/**
* @brief Append non-negative integer @p integer of NDN TLV encoding
* @sa http://named-data.net/doc/ndn-tlv/
*/
size_t
appendNonNegativeInteger(uint64_t integer);
/**
* @brief Prepend TLV block of type @p type and value from buffer @p array of size @p arraySize
*/
size_t
prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize);
/**
* @brief Append TLV block of type @p type and value from buffer @p array of size @p arraySize
*/
size_t
appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize);
/**
* @brief Prepend TLV block @p block
*/
size_t
prependBlock(const Block& block);
/**
* @brief Append TLV block @p block
*/
size_t
appendBlock(const Block& block);
};
template<class Iterator>
inline size_t
Estimator::prependRange(Iterator first, Iterator last)
{
return std::distance(first, last);
}
template<class Iterator>
inline size_t
Estimator::appendRange(Iterator first, Iterator last)
{
return prependRange(first, last);
}
} // namespace encoding
} // namespace ndn
#endif // NDN_ENCODING_ESTIMATOR_HPP

10
src/exclude.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -41,9 +41,9 @@ Exclude::Exclude(const Block& wire)
wireDecode(wire);
}
template<bool T>
template<encoding::Tag TAG>
size_t
Exclude::wireEncode(EncodingImpl<T>& block) const
Exclude::wireEncode(EncodingImpl<TAG>& block) const
{
if (m_exclude.empty()) {
throw Error("Exclude filter cannot be empty");
@ -72,10 +72,10 @@ Exclude::wireEncode(EncodingImpl<T>& block) const
}
template size_t
Exclude::wireEncode<true>(EncodingImpl<true>& block) const;
Exclude::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
template size_t
Exclude::wireEncode<false>(EncodingImpl<false>& block) const;
Exclude::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
const Block&
Exclude::wireEncode() const

6
src/exclude.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -62,9 +62,9 @@ public:
/**
* @brief Fast encoding or block size estimation
*/
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block) const;
wireEncode(EncodingImpl<TAG>& block) const;
/**
* @brief Encode to a wire format

12
src/interest.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -17,8 +17,6 @@
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*
* Based on code originally written by Jeff Thompson <jefft0@remap.ucla.edu>
*/
#include "interest.hpp"
@ -229,9 +227,9 @@ Interest::matchesData(const Data& data) const
return true;
}
template<bool T>
template<encoding::Tag TAG>
size_t
Interest::wireEncode(EncodingImpl<T>& block) const
Interest::wireEncode(EncodingImpl<TAG>& block) const
{
size_t totalLength = 0;
@ -278,10 +276,10 @@ Interest::wireEncode(EncodingImpl<T>& block) const
}
template size_t
Interest::wireEncode<true>(EncodingImpl<true>& block) const;
Interest::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
template size_t
Interest::wireEncode<false>(EncodingImpl<false>& block) const;
Interest::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
const Block&
Interest::wireEncode() const

8
src/interest.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -17,8 +17,6 @@
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*
* Based on code originally written by Jeff Thompson <jefft0@remap.ucla.edu>
*/
#ifndef NDN_INTEREST_HPP
@ -98,9 +96,9 @@ public:
/**
* @brief Fast encoding or block size estimation
*/
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block) const;
wireEncode(EncodingImpl<TAG>& block) const;
/**
* @brief Encode to a wire format

10
src/key-locator.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -46,9 +46,9 @@ KeyLocator::KeyLocator(const Name& name)
setName(name);
}
template<bool T>
template<encoding::Tag TAG>
size_t
KeyLocator::wireEncode(EncodingImpl<T>& block) const
KeyLocator::wireEncode(EncodingImpl<TAG>& block) const
{
// KeyLocator ::= KEY-LOCATOR-TYPE TLV-LENGTH (Name | KeyDigest)
// KeyDigest ::= KEY-DIGEST-TYPE TLV-LENGTH BYTE+
@ -74,10 +74,10 @@ KeyLocator::wireEncode(EncodingImpl<T>& block) const
}
template size_t
KeyLocator::wireEncode<true>(EncodingImpl<true>& estimator) const;
KeyLocator::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& estimator) const;
template size_t
KeyLocator::wireEncode<false>(EncodingImpl<false>& encoder) const;
KeyLocator::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
const Block&
KeyLocator::wireEncode() const

6
src/key-locator.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -74,9 +74,9 @@ public: // encode and decode
/** \brief prepend wire encoding
* \param block EncodingBuffer or Estimator
*/
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block) const;
wireEncode(EncodingImpl<TAG>& block) const;
/** \return wire encoding
*/

12
src/management/nfd-channel-status.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -42,13 +42,13 @@ ChannelStatus::ChannelStatus(const Block& payload)
this->wireDecode(payload);
}
template<bool T>
template<encoding::Tag TAG>
size_t
ChannelStatus::wireEncode(EncodingImpl<T>& encoder) const
ChannelStatus::wireEncode(EncodingImpl<TAG>& encoder) const
{
size_t totalLength = 0;
totalLength += prependByteArrayBlock(encoder, tlv::nfd::LocalUri,
totalLength += encoder.prependByteArrayBlock(tlv::nfd::LocalUri,
reinterpret_cast<const uint8_t*>(m_localUri.c_str()), m_localUri.size());
totalLength += encoder.prependVarNumber(totalLength);
@ -57,10 +57,10 @@ ChannelStatus::wireEncode(EncodingImpl<T>& encoder) const
}
template size_t
ChannelStatus::wireEncode<true>(EncodingImpl<true>& block) const;
ChannelStatus::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
template size_t
ChannelStatus::wireEncode<false>(EncodingImpl<false>& block) const;
ChannelStatus::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
const Block&
ChannelStatus::wireEncode() const

6
src/management/nfd-channel-status.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -50,9 +50,9 @@ public:
explicit
ChannelStatus(const Block& payload);
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& encoder) const;
wireEncode(EncodingImpl<TAG>& encoder) const;
const Block&
wireEncode() const;

10
src/management/nfd-control-parameters.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -44,9 +44,9 @@ ControlParameters::ControlParameters(const Block& block)
wireDecode(block);
}
template<bool T>
template<encoding::Tag TAG>
size_t
ControlParameters::wireEncode(EncodingImpl<T>& encoder) const
ControlParameters::wireEncode(EncodingImpl<TAG>& encoder) const
{
size_t totalLength = 0;
@ -90,10 +90,10 @@ ControlParameters::wireEncode(EncodingImpl<T>& encoder) const
}
template size_t
ControlParameters::wireEncode<true>(EncodingImpl<true>& encoder) const;
ControlParameters::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
template size_t
ControlParameters::wireEncode<false>(EncodingImpl<false>& estimator) const;
ControlParameters::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
const Block&
ControlParameters::wireEncode() const

6
src/management/nfd-control-parameters.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -89,9 +89,9 @@ public:
explicit
ControlParameters(const Block& block);
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& encoder) const;
wireEncode(EncodingImpl<TAG>& encoder) const;
const Block&
wireEncode() const;

10
src/management/nfd-face-event-notification.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -43,9 +43,9 @@ FaceEventNotification::FaceEventNotification(const Block& block)
this->wireDecode(block);
}
template<bool T>
template<encoding::Tag TAG>
size_t
FaceEventNotification::wireEncode(EncodingImpl<T>& encoder) const
FaceEventNotification::wireEncode(EncodingImpl<TAG>& encoder) const
{
size_t totalLength = 0;
@ -55,9 +55,9 @@ FaceEventNotification::wireEncode(EncodingImpl<T>& encoder) const
tlv::nfd::FacePersistency, m_facePersistency);
totalLength += prependNonNegativeIntegerBlock(encoder,
tlv::nfd::FaceScope, m_faceScope);
totalLength += prependByteArrayBlock(encoder, tlv::nfd::LocalUri,
totalLength += encoder.prependByteArrayBlock(tlv::nfd::LocalUri,
reinterpret_cast<const uint8_t*>(m_localUri.c_str()), m_localUri.size());
totalLength += prependByteArrayBlock(encoder, tlv::nfd::Uri,
totalLength += encoder.prependByteArrayBlock(tlv::nfd::Uri,
reinterpret_cast<const uint8_t*>(m_remoteUri.c_str()), m_remoteUri.size());
totalLength += prependNonNegativeIntegerBlock(encoder,
tlv::nfd::FaceId, m_faceId);

6
src/management/nfd-face-event-notification.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -51,9 +51,9 @@ public:
/** \brief prepend FaceEventNotification to the encoder
*/
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& encoder) const;
wireEncode(EncodingImpl<TAG>& encoder) const;
/** \brief encode FaceEventNotification
*/

16
src/management/nfd-face-query-filter.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -49,9 +49,9 @@ FaceQueryFilter::FaceQueryFilter(const Block& block)
this->wireDecode(block);
}
template<bool T>
template<encoding::Tag TAG>
size_t
FaceQueryFilter::wireEncode(EncodingImpl<T>& encoder) const
FaceQueryFilter::wireEncode(EncodingImpl<TAG>& encoder) const
{
size_t totalLength = 0;
@ -71,17 +71,17 @@ FaceQueryFilter::wireEncode(EncodingImpl<T>& encoder) const
}
if (m_hasLocalUri) {
totalLength += prependByteArrayBlock(encoder, tlv::nfd::LocalUri,
totalLength += encoder.prependByteArrayBlock(tlv::nfd::LocalUri,
reinterpret_cast<const uint8_t*>(m_localUri.c_str()), m_localUri.size());
}
if (m_hasRemoteUri) {
totalLength += prependByteArrayBlock(encoder, tlv::nfd::Uri,
totalLength += encoder.prependByteArrayBlock(tlv::nfd::Uri,
reinterpret_cast<const uint8_t*>(m_remoteUri.c_str()), m_remoteUri.size());
}
if (m_hasUriScheme) {
totalLength += prependByteArrayBlock(encoder, tlv::nfd::UriScheme,
totalLength += encoder.prependByteArrayBlock(tlv::nfd::UriScheme,
reinterpret_cast<const uint8_t*>(m_uriScheme.c_str()), m_uriScheme.size());
}
@ -96,10 +96,10 @@ FaceQueryFilter::wireEncode(EncodingImpl<T>& encoder) const
}
template size_t
FaceQueryFilter::wireEncode<true>(EncodingImpl<true>& block) const;
FaceQueryFilter::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
template size_t
FaceQueryFilter::wireEncode<false>(EncodingImpl<false>& block) const;
FaceQueryFilter::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
const Block&
FaceQueryFilter::wireEncode() const

6
src/management/nfd-face-query-filter.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -53,9 +53,9 @@ public:
/** \brief prepend FaceQueryFilter to the encoder
*/
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& encoder) const;
wireEncode(EncodingImpl<TAG>& encoder) const;
/** \brief encode FaceQueryFilter
*/

15
src/management/nfd-face-status.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -49,9 +49,9 @@ FaceStatus::FaceStatus(const Block& block)
this->wireDecode(block);
}
template<bool T>
template<encoding::Tag TAG>
size_t
FaceStatus::wireEncode(EncodingImpl<T>& encoder) const
FaceStatus::wireEncode(EncodingImpl<TAG>& encoder) const
{
size_t totalLength = 0;
@ -77,9 +77,9 @@ FaceStatus::wireEncode(EncodingImpl<T>& encoder) const
totalLength += prependNonNegativeIntegerBlock(encoder,
tlv::nfd::ExpirationPeriod, m_expirationPeriod.count());
}
totalLength += prependByteArrayBlock(encoder, tlv::nfd::LocalUri,
totalLength += encoder.prependByteArrayBlock(tlv::nfd::LocalUri,
reinterpret_cast<const uint8_t*>(m_localUri.c_str()), m_localUri.size());
totalLength += prependByteArrayBlock(encoder, tlv::nfd::Uri,
totalLength += encoder.prependByteArrayBlock(tlv::nfd::Uri,
reinterpret_cast<const uint8_t*>(m_remoteUri.c_str()), m_remoteUri.size());
totalLength += prependNonNegativeIntegerBlock(encoder,
tlv::nfd::FaceId, m_faceId);
@ -90,10 +90,10 @@ FaceStatus::wireEncode(EncodingImpl<T>& encoder) const
}
template size_t
FaceStatus::wireEncode<true>(EncodingImpl<true>& block) const;
FaceStatus::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
template size_t
FaceStatus::wireEncode<false>(EncodingImpl<false>& block) const;
FaceStatus::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
const Block&
FaceStatus::wireEncode() const
@ -321,4 +321,3 @@ operator<<(std::ostream& os, const FaceStatus& status)
} // namespace nfd
} // namespace ndn

6
src/management/nfd-face-status.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -44,9 +44,9 @@ public:
/** \brief prepend FaceStatus to the encoder
*/
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& encoder) const;
wireEncode(EncodingImpl<TAG>& encoder) const;
/** \brief encode FaceStatus
*/

18
src/management/nfd-fib-entry.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -71,9 +71,9 @@ NextHopRecord::setCost(uint64_t cost)
return *this;
}
template<bool T>
template<encoding::Tag TAG>
size_t
NextHopRecord::wireEncode(EncodingImpl<T>& block) const
NextHopRecord::wireEncode(EncodingImpl<TAG>& block) const
{
size_t totalLength = 0;
totalLength += prependNonNegativeIntegerBlock(block,
@ -90,10 +90,10 @@ NextHopRecord::wireEncode(EncodingImpl<T>& block) const
}
template size_t
NextHopRecord::wireEncode<true>(EncodingImpl<true>& block) const;
NextHopRecord::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
template size_t
NextHopRecord::wireEncode<false>(EncodingImpl<false>& block) const;
NextHopRecord::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
const Block&
NextHopRecord::wireEncode() const
@ -182,9 +182,9 @@ FibEntry::addNextHopRecord(const NextHopRecord& nextHopRecord)
return *this;
}
template<bool T>
template<encoding::Tag TAG>
size_t
FibEntry::wireEncode(EncodingImpl<T>& block) const
FibEntry::wireEncode(EncodingImpl<TAG>& block) const
{
size_t totalLength = 0;
@ -200,10 +200,10 @@ FibEntry::wireEncode(EncodingImpl<T>& block) const
}
template size_t
FibEntry::wireEncode<true>(EncodingImpl<true>& block) const;
FibEntry::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
template size_t
FibEntry::wireEncode<false>(EncodingImpl<false>& block) const;
FibEntry::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
const Block&
FibEntry::wireEncode() const

10
src/management/nfd-fib-entry.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -67,9 +67,9 @@ public:
NextHopRecord&
setCost(uint64_t cost);
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block) const;
wireEncode(EncodingImpl<TAG>& block) const;
const Block&
wireEncode() const;
@ -132,9 +132,9 @@ public:
return *this;
}
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block) const;
wireEncode(EncodingImpl<TAG>& block) const;
const Block&
wireEncode() const;

12
src/management/nfd-forwarder-status.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -53,9 +53,9 @@ ForwarderStatus::ForwarderStatus(const Block& payload)
this->wireDecode(payload);
}
template<bool T>
template<encoding::Tag TAG>
size_t
ForwarderStatus::wireEncode(EncodingImpl<T>& encoder) const
ForwarderStatus::wireEncode(EncodingImpl<TAG>& encoder) const
{
size_t totalLength = 0;
@ -81,7 +81,7 @@ ForwarderStatus::wireEncode(EncodingImpl<T>& encoder) const
time::toUnixTimestamp(m_currentTimestamp).count());
totalLength += prependNonNegativeIntegerBlock(encoder, tlv::nfd::StartTimestamp,
time::toUnixTimestamp(m_startTimestamp).count());
totalLength += prependByteArrayBlock(encoder,tlv::nfd::NfdVersion,
totalLength += encoder.prependByteArrayBlock(tlv::nfd::NfdVersion,
reinterpret_cast<const uint8_t*>(m_nfdVersion.c_str()),
m_nfdVersion.size());
@ -91,10 +91,10 @@ ForwarderStatus::wireEncode(EncodingImpl<T>& encoder) const
}
template size_t
ForwarderStatus::wireEncode<true>(EncodingImpl<true>& block) const;
ForwarderStatus::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
template size_t
ForwarderStatus::wireEncode<false>(EncodingImpl<false>& block) const;
ForwarderStatus::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
const Block&
ForwarderStatus::wireEncode() const

6
src/management/nfd-forwarder-status.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -55,9 +55,9 @@ public:
*
* The outermost Content element isn't part of ForwardStatus structure.
*/
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& encoder) const;
wireEncode(EncodingImpl<TAG>& encoder) const;
/** \brief encode ForwarderStatus as a Content block
*

10
src/management/nfd-local-control-header.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -155,9 +155,9 @@ public:
}
private:
template<bool T>
template<encoding::Tag TAG>
inline size_t
wireEncode(EncodingImpl<T>& block, size_t payloadSize,
wireEncode(EncodingImpl<TAG>& block, size_t payloadSize,
bool encodeIncomingFaceId, bool encodeNextHopFaceId) const;
private:
@ -169,9 +169,9 @@ private:
/**
* @brief Fast encoding or block size estimation
*/
template<bool T>
template<encoding::Tag TAG>
inline size_t
LocalControlHeader::wireEncode(EncodingImpl<T>& block, size_t payloadSize,
LocalControlHeader::wireEncode(EncodingImpl<TAG>& block, size_t payloadSize,
bool encodeIncomingFaceId, bool encodeNextHopFaceId) const
{
size_t totalLength = payloadSize;

18
src/management/nfd-rib-entry.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -56,9 +56,9 @@ Route::Route(const Block& block)
wireDecode(block);
}
template<bool T>
template<encoding::Tag TAG>
size_t
Route::wireEncode(EncodingImpl<T>& block) const
Route::wireEncode(EncodingImpl<TAG>& block) const
{
size_t totalLength = 0;
@ -92,10 +92,10 @@ Route::wireEncode(EncodingImpl<T>& block) const
}
template size_t
Route::wireEncode<true>(EncodingImpl<true>& block) const;
Route::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
template size_t
Route::wireEncode<false>(EncodingImpl<false>& block) const;
Route::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
const Block&
Route::wireEncode() const
@ -216,9 +216,9 @@ RibEntry::RibEntry(const Block& block)
}
template<bool T>
template<encoding::Tag TAG>
size_t
RibEntry::wireEncode(EncodingImpl<T>& block) const
RibEntry::wireEncode(EncodingImpl<TAG>& block) const
{
size_t totalLength = 0;
@ -237,10 +237,10 @@ RibEntry::wireEncode(EncodingImpl<T>& block) const
}
template size_t
RibEntry::wireEncode<true>(EncodingImpl<true>& block) const;
RibEntry::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
template size_t
RibEntry::wireEncode<false>(EncodingImpl<false>& block) const;
RibEntry::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
const Block&
RibEntry::wireEncode() const

10
src/management/nfd-rib-entry.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -152,9 +152,9 @@ public:
return m_hasInfiniteExpirationPeriod;
}
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block) const;
wireEncode(EncodingImpl<TAG>& block) const;
const Block&
wireEncode() const;
@ -243,9 +243,9 @@ public:
return *this;
}
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block) const;
wireEncode(EncodingImpl<TAG>& block) const;
const Block&
wireEncode() const;

10
src/management/nfd-strategy-choice.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -42,9 +42,9 @@ StrategyChoice::StrategyChoice(const Block& payload)
this->wireDecode(payload);
}
template<bool T>
template<encoding::Tag TAG>
size_t
StrategyChoice::wireEncode(EncodingImpl<T>& encoder) const
StrategyChoice::wireEncode(EncodingImpl<TAG>& encoder) const
{
size_t totalLength = 0;
@ -57,10 +57,10 @@ StrategyChoice::wireEncode(EncodingImpl<T>& encoder) const
}
template size_t
StrategyChoice::wireEncode<true>(EncodingImpl<true>& block) const;
StrategyChoice::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
template size_t
StrategyChoice::wireEncode<false>(EncodingImpl<false>& block) const;
StrategyChoice::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
const Block&
StrategyChoice::wireEncode() const

6
src/management/nfd-strategy-choice.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -51,9 +51,9 @@ public:
explicit
StrategyChoice(const Block& payload);
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& encoder) const;
wireEncode(EncodingImpl<TAG>& encoder) const;
const Block&
wireEncode() const;

22
src/meta-info.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -123,9 +123,9 @@ MetaInfo::findAppMetaInfo(uint32_t tlvType) const
return 0;
}
template<bool T>
template<encoding::Tag TAG>
size_t
MetaInfo::wireEncode(EncodingImpl<T>& blk) const
MetaInfo::wireEncode(EncodingImpl<TAG>& encoder) const
{
// MetaInfo ::= META-INFO-TYPE TLV-LENGTH
// ContentType?
@ -137,38 +137,38 @@ MetaInfo::wireEncode(EncodingImpl<T>& blk) const
for (std::list<Block>::const_reverse_iterator appMetaInfoItem = m_appMetaInfo.rbegin();
appMetaInfoItem != m_appMetaInfo.rend(); ++appMetaInfoItem) {
totalLength += prependBlock(blk, *appMetaInfoItem);
totalLength += encoder.prependBlock(*appMetaInfoItem);
}
// FinalBlockId
if (!m_finalBlockId.empty())
{
totalLength += prependNestedBlock(blk, tlv::FinalBlockId, m_finalBlockId);
totalLength += prependNestedBlock(encoder, tlv::FinalBlockId, m_finalBlockId);
}
// FreshnessPeriod
if (m_freshnessPeriod >= time::milliseconds::zero())
{
totalLength += prependNonNegativeIntegerBlock(blk, tlv::FreshnessPeriod,
totalLength += prependNonNegativeIntegerBlock(encoder, tlv::FreshnessPeriod,
m_freshnessPeriod.count());
}
// ContentType
if (m_type != tlv::ContentType_Blob)
{
totalLength += prependNonNegativeIntegerBlock(blk, tlv::ContentType, m_type);
totalLength += prependNonNegativeIntegerBlock(encoder, tlv::ContentType, m_type);
}
totalLength += blk.prependVarNumber(totalLength);
totalLength += blk.prependVarNumber(tlv::MetaInfo);
totalLength += encoder.prependVarNumber(totalLength);
totalLength += encoder.prependVarNumber(tlv::MetaInfo);
return totalLength;
}
template size_t
MetaInfo::wireEncode<true>(EncodingImpl<true>& block) const;
MetaInfo::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
template size_t
MetaInfo::wireEncode<false>(EncodingImpl<false>& block) const;
MetaInfo::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
const Block&
MetaInfo::wireEncode() const

6
src/meta-info.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -74,9 +74,9 @@ public:
explicit
MetaInfo(const Block& block);
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block) const;
wireEncode(EncodingImpl<TAG>& block) const;
const Block&
wireEncode() const;

10
src/name-component.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -438,9 +438,9 @@ Component::getSuccessor() const
}
template<bool T>
template<encoding::Tag TAG>
size_t
Component::wireEncode(EncodingImpl<T>& block) const
Component::wireEncode(EncodingImpl<TAG>& block) const
{
size_t totalLength = 0;
if (value_size() > 0)
@ -451,10 +451,10 @@ Component::wireEncode(EncodingImpl<T>& block) const
}
template size_t
Component::wireEncode<true>(EncodingImpl<true>& block) const;
Component::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& block) const;
template size_t
Component::wireEncode<false>(EncodingImpl<false>& block) const;
Component::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& block) const;
const Block&
Component::wireEncode() const

30
src/name-component.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -17,10 +17,6 @@
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*
* @author Jeff Thompson <jefft0@remap.ucla.edu>
* @author Alexander Afanasyev <http://lasr.cs.ucla.edu/afanasyev/index.html>
* @author Zhenkai Zhu <http://irl.cs.ucla.edu/~zhenkai/>
*/
#ifndef NDN_NAME_COMPONENT_HPP
@ -28,6 +24,7 @@
#include "common.hpp"
#include "encoding/block.hpp"
#include "encoding/block-helpers.hpp"
#include "util/time.hpp"
namespace ndn {
@ -111,15 +108,18 @@ public:
Component(const uint8_t* buffer, size_t bufferSize);
/**
* @brief Create a new name::Component from the buffer (data from buffer will be copied)
* @param begin Iterator pointing to the beginning of the buffer
* @param end Iterator pointing to the ending of the buffer
* @brief Create a new name::Component frome the range [@p first, @p last) of bytes
* @param first Iterator pointing to the beginning of the buffer
* @param last Iterator pointing to the ending of the buffer
* @tparam Iterator iterator type satisfying at least InputIterator concept. Implementation
* is more optimal when the iterator type satisfies RandomAccessIterator concept.
* It is required that sizeof(std::iterator_traits<Iterator>::value_type) == 1.
*
* This constructor will create a new tlv::NameComponent Block with `buffer` as a payload.
* Note that this method **will** allocate new memory for and copy the payload.
*/
template<class InputIterator>
Component(InputIterator begin, InputIterator end);
template<class Iterator>
Component(Iterator first, Iterator last);
/**
* @brief Create a new name::Component from the C string (data from string will be copied)
@ -148,9 +148,9 @@ public:
/**
* @brief Fast encoding or block size estimation
*/
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block) const;
wireEncode(EncodingImpl<TAG>& block) const;
/**
* @brief Encode to a wire format
@ -615,10 +615,10 @@ operator<<(std::ostream& os, const Component& component)
return os;
}
template<class InputIterator>
template<class Iterator>
inline
Component::Component(InputIterator begin, InputIterator end)
: Block(dataBlock(tlv::NameComponent, begin, end))
Component::Component(Iterator first, Iterator last)
: Block(dataBlock(tlv::NameComponent, first, last))
{
}

8
src/name.cpp

@ -43,9 +43,9 @@ static_assert(std::is_base_of<tlv::Error, Name::Error>::value,
const size_t Name::npos = std::numeric_limits<size_t>::max();
template<bool T>
template<encoding::Tag TAG>
size_t
Name::wireEncode(EncodingImpl<T>& encoder) const
Name::wireEncode(EncodingImpl<TAG>& encoder) const
{
size_t totalLength = 0;
@ -60,10 +60,10 @@ Name::wireEncode(EncodingImpl<T>& encoder) const
}
template size_t
Name::wireEncode<true>(EncodingImpl<true>& estimator) const;
Name::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& estimator) const;
template size_t
Name::wireEncode<false>(EncodingImpl<false>& encoder) const;
Name::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
const Block&
Name::wireEncode() const

17
src/name.hpp

@ -114,9 +114,9 @@ public:
/**
* @brief Fast encoding or block size estimation
*/
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block) const;
wireEncode(EncodingImpl<TAG>& block) const;
const Block&
wireEncode() const;
@ -159,14 +159,19 @@ public:
}
/**
* Append a new component, copying from value of length valueLength.
* @brief Append a new component, copying from value frome the range [@p first, @p last) of bytes
* @param first Iterator pointing to the beginning of the buffer
* @param last Iterator pointing to the ending of the buffer
* @tparam Iterator iterator type satisfying at least InputIterator concept. Implementation
* is more optimal when the iterator type satisfies RandomAccessIterator concept.
* It is required that sizeof(std::iterator_traits<Iterator>::value_type) == 1.
* @return This name so that you can chain calls to append.
*/
template<class InputIterator>
template<class Iterator>
Name&
append(InputIterator begin, InputIterator end)
append(Iterator first, Iterator last)
{
m_nameBlock.push_back(Component(begin, end));
m_nameBlock.push_back(Component(first, last));
return *this;
}

10
src/selectors.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -56,9 +56,9 @@ Selectors::empty() const
!m_mustBeFresh;
}
template<bool T>
template<encoding::Tag TAG>
size_t
Selectors::wireEncode(EncodingImpl<T>& block) const
Selectors::wireEncode(EncodingImpl<TAG>& block) const
{
size_t totalLength = 0;
@ -110,10 +110,10 @@ Selectors::wireEncode(EncodingImpl<T>& block) const
}
template size_t
Selectors::wireEncode<true>(EncodingImpl<true>& estimator) const;
Selectors::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>& estimator) const;
template size_t
Selectors::wireEncode<false>(EncodingImpl<false>& encoder) const;
Selectors::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>& encoder) const;
const Block&
Selectors::wireEncode() const

6
src/selectors.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -58,9 +58,9 @@ public:
/**
* @brief Fast encoding or block size estimation
*/
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block) const;
wireEncode(EncodingImpl<TAG>& block) const;
/**
* @brief Encode to a wire format

10
src/signature-info.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -109,9 +109,9 @@ SignatureInfo::getTypeSpecificTlv(uint32_t type) const
boost::lexical_cast<std::string>(type) + "] from SignatureInfo");
}
template<bool T>
template<encoding::Tag TAG>
size_t
SignatureInfo::wireEncode(EncodingImpl<T>& block) const
SignatureInfo::wireEncode(EncodingImpl<TAG>& block) const
{
size_t totalLength = 0;
@ -131,10 +131,10 @@ SignatureInfo::wireEncode(EncodingImpl<T>& block) const
}
template size_t
SignatureInfo::wireEncode<true>(EncodingImpl<true>& block) const;
SignatureInfo::wireEncode<encoding::EncoderTag>(EncodingImpl<encoding::EncoderTag>&) const;
template size_t
SignatureInfo::wireEncode<false>(EncodingImpl<false>& block) const;
SignatureInfo::wireEncode<encoding::EstimatorTag>(EncodingImpl<encoding::EstimatorTag>&) const;
const Block&

6
src/signature-info.hpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -103,9 +103,9 @@ public:
getTypeSpecificTlv(uint32_t type) const;
/// @brief Encode to a wire format or estimate wire format
template<bool T>
template<encoding::Tag TAG>
size_t
wireEncode(EncodingImpl<T>& block) const;
wireEncode(EncodingImpl<TAG>& block) const;
/// @brief Encode to a wire format
const Block&

171
tests/unit-tests/encoding/encoder.t.cpp

@ -0,0 +1,171 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received copies of the GNU General Public License and GNU Lesser
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*/
#include "encoding/encoder.hpp"
#include "boost-test.hpp"
namespace ndn {
namespace encoding {
namespace tests {
BOOST_AUTO_TEST_SUITE(EncodingEncoder)
BOOST_AUTO_TEST_CASE(Basic)
{
Encoder e;
BOOST_CHECK_GT(e.capacity(), 100);
Encoder e1(100);
BOOST_CHECK_EQUAL(e1.capacity(), 100);
Encoder e2(100, 100);
BOOST_CHECK_EQUAL(e2.capacity(), 100);
BOOST_CHECK_EQUAL(e.prependByte(1), 1);
BOOST_CHECK_EQUAL(e.appendByte(1), 1);
uint8_t buf1[] = {'t', 'e', 's', 't', '1'};
BOOST_CHECK_EQUAL(e1.prependByteArray(buf1, sizeof(buf1)), 5);
BOOST_CHECK_EQUAL(e1.appendByteArray(buf1, sizeof(buf1)), 5);
std::vector<uint8_t> buf2 = {'t', 'e', 's', 't', '2'};
BOOST_CHECK_EQUAL(e1.prependRange(buf2.begin(), buf2.end()), 5);
BOOST_CHECK_EQUAL(e1.appendRange(buf2.begin(), buf2.end()), 5);
std::list<uint8_t> buf3 = {'t', 'e', 's', 't', '2'};
BOOST_CHECK_EQUAL(e2.prependRange(buf3.begin(), buf3.end()), 5);
BOOST_CHECK_EQUAL(e2.appendRange(buf3.begin(), buf3.end()), 5);
uint8_t expected1[] = {1, 1};
BOOST_CHECK_EQUAL_COLLECTIONS(e.buf(), e.buf() + e.size(),
expected1, expected1 + sizeof(expected1));
const Encoder& constE = e;
BOOST_CHECK_EQUAL_COLLECTIONS(constE.buf(), constE.buf() + constE.size(),
expected1, expected1 + sizeof(expected1));
uint8_t expected2[] = {'t', 'e', 's', 't', '2',
't', 'e', 's', 't', '1', 't', 'e', 's', 't', '1',
't', 'e', 's', 't', '2'};
BOOST_CHECK_EQUAL_COLLECTIONS(e1.begin(), e1.end(),
expected2, expected2 + sizeof(expected2));
const Encoder& constE1 = e1;
BOOST_CHECK_EQUAL_COLLECTIONS(constE1.begin(), constE1.end(),
expected2, expected2 + sizeof(expected2));
BOOST_CHECK_THROW(e1.block(), tlv::Error);
BOOST_CHECK_NO_THROW(e1.block(false));
e1.prependVarNumber(20);
e1.prependVarNumber(100);
BOOST_CHECK_NO_THROW(e1.block());
}
BOOST_AUTO_TEST_CASE(Tlv)
{
Encoder e;
BOOST_CHECK_EQUAL(e.prependVarNumber(1), 1);
BOOST_CHECK_EQUAL(e.appendVarNumber(1), 1);
BOOST_CHECK_EQUAL(e.prependVarNumber(252), 1);
BOOST_CHECK_EQUAL(e.appendVarNumber(252), 1);
BOOST_CHECK_EQUAL(e.prependVarNumber(253), 3);
BOOST_CHECK_EQUAL(e.appendVarNumber(253), 3);
BOOST_CHECK_EQUAL(e.prependVarNumber(65536), 5);
BOOST_CHECK_EQUAL(e.appendVarNumber(65536), 5);
BOOST_CHECK_EQUAL(e.prependVarNumber(4294967296LL), 9);
BOOST_CHECK_EQUAL(e.appendVarNumber(4294967296LL), 9);
//
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(1), 1);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(1), 1);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(252), 1);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(252), 1);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(253), 1);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(253), 1);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(255), 1);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(255), 1);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(256), 2);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(256), 2);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(65535), 2);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(65535), 2);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(65536), 4);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(65536), 4);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(4294967296LL), 8);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(4294967296LL), 8);
//
uint8_t buf[] = {0x01, 0x03, 0x00, 0x00, 0x00};
Block block1(buf, sizeof(buf));
BOOST_CHECK_EQUAL(e.prependByteArrayBlock(100, buf, sizeof(buf)), 7);
BOOST_CHECK_EQUAL(e.appendByteArrayBlock(100, buf, sizeof(buf)), 7);
BOOST_CHECK_EQUAL(e.prependBlock(block1), 5);
BOOST_CHECK_EQUAL(e.appendBlock(block1), 5);
Block block2(100, block1);
BOOST_CHECK_EQUAL(e.prependBlock(block2), 7);
BOOST_CHECK_EQUAL(e.appendBlock(block2), 7);
}
BOOST_AUTO_TEST_CASE(Reserve)
{
Encoder e(100, 0);
BOOST_CHECK_EQUAL(e.capacity(), 100);
e.reserve(100, true);
BOOST_CHECK_EQUAL(e.capacity(), 100);
e.reserve(200, true);
BOOST_CHECK_EQUAL(e.capacity(), 200);
e.reserve(100, false);
BOOST_CHECK_EQUAL(e.capacity(), 200);
e.reserveFront(1000);
BOOST_CHECK_GT(e.capacity(), 1000);
e.reserveBack(1000);
BOOST_CHECK_GT(e.capacity(), 2000);
}
BOOST_AUTO_TEST_SUITE_END() // EncodingEncoder
} // namespace tests
} // namespace encoding
} // namespace ndn

120
tests/unit-tests/encoding/estimator.t.cpp

@ -0,0 +1,120 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
* ndn-cxx library is free software: you can redistribute it and/or modify it under the
* terms of the GNU Lesser General Public License as published by the Free Software
* Foundation, either version 3 of the License, or (at your option) any later version.
*
* ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
*
* You should have received copies of the GNU General Public License and GNU Lesser
* General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
* <http://www.gnu.org/licenses/>.
*
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*/
#include "encoding/estimator.hpp"
#include "boost-test.hpp"
namespace ndn {
namespace encoding {
namespace tests {
BOOST_AUTO_TEST_SUITE(EncodingEstimator)
BOOST_AUTO_TEST_CASE(Basic)
{
Estimator e;
Estimator e1(100);
Estimator e2(100, 100);
BOOST_CHECK_EQUAL(e.prependByte(1), 1);
BOOST_CHECK_EQUAL(e.appendByte(1), 1);
uint8_t buf1[] = {'t', 'e', 's', 't', '1'};
BOOST_CHECK_EQUAL(e1.prependByteArray(buf1, sizeof(buf1)), 5);
BOOST_CHECK_EQUAL(e1.appendByteArray(buf1, sizeof(buf1)), 5);
std::vector<uint8_t> buf2 = {'t', 'e', 's', 't', '2'};
BOOST_CHECK_EQUAL(e1.prependRange(buf2.begin(), buf2.end()), 5);
BOOST_CHECK_EQUAL(e1.appendRange(buf2.begin(), buf2.end()), 5);
std::list<uint8_t> buf3 = {'t', 'e', 's', 't', '2'};
BOOST_CHECK_EQUAL(e2.prependRange(buf3.begin(), buf3.end()), 5);
BOOST_CHECK_EQUAL(e2.appendRange(buf3.begin(), buf3.end()), 5);
}
BOOST_AUTO_TEST_CASE(Tlv)
{
Estimator e;
BOOST_CHECK_EQUAL(e.prependVarNumber(1), 1);
BOOST_CHECK_EQUAL(e.appendVarNumber(1), 1);
BOOST_CHECK_EQUAL(e.prependVarNumber(252), 1);
BOOST_CHECK_EQUAL(e.appendVarNumber(252), 1);
BOOST_CHECK_EQUAL(e.prependVarNumber(253), 3);
BOOST_CHECK_EQUAL(e.appendVarNumber(253), 3);
BOOST_CHECK_EQUAL(e.prependVarNumber(65536), 5);
BOOST_CHECK_EQUAL(e.appendVarNumber(65536), 5);
BOOST_CHECK_EQUAL(e.prependVarNumber(4294967296LL), 9);
BOOST_CHECK_EQUAL(e.appendVarNumber(4294967296LL), 9);
//
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(1), 1);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(1), 1);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(252), 1);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(252), 1);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(253), 1);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(253), 1);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(255), 1);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(255), 1);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(256), 2);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(256), 2);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(65535), 2);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(65535), 2);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(65536), 4);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(65536), 4);
BOOST_CHECK_EQUAL(e.prependNonNegativeInteger(4294967296LL), 8);
BOOST_CHECK_EQUAL(e.appendNonNegativeInteger(4294967296LL), 8);
//
uint8_t buf[] = {0x01, 0x03, 0x00, 0x00, 0x00};
Block block1(buf, sizeof(buf));
BOOST_CHECK_EQUAL(e.prependByteArrayBlock(100, buf, sizeof(buf)), 7);
BOOST_CHECK_EQUAL(e.appendByteArrayBlock(100, buf, sizeof(buf)), 7);
BOOST_CHECK_EQUAL(e.prependBlock(block1), 5);
BOOST_CHECK_EQUAL(e.appendBlock(block1), 5);
Block block2(100, block1);
BOOST_CHECK_EQUAL(e.prependBlock(block2), 7);
BOOST_CHECK_EQUAL(e.appendBlock(block2), 7);
}
BOOST_AUTO_TEST_SUITE_END() // EncodingEstimator
} // namespace tests
} // namespace encoding
} // namespace ndn

147
tests/unit-tests/test-block.cpp

@ -1,6 +1,6 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2013-2015 Regents of the University of California.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -19,126 +19,153 @@
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*/
#include "encoding/encoding-buffer.hpp"
#include "encoding/buffer-stream.hpp"
#include "boost-test.hpp"
using namespace std;
namespace ndn {
namespace tests {
BOOST_AUTO_TEST_SUITE(TestBlock)
BOOST_AUTO_TEST_CASE(BlockBasic)
class BasicBlockFixture
{
public:
EncodingBuffer buffer;
EncodingEstimator estimator;
size_t s1, s2;
};
// VarNumber checks
BOOST_FIXTURE_TEST_SUITE(Basic, BasicBlockFixture)
s1 = buffer.prependVarNumber(252);
s2 = estimator.prependVarNumber(252);
BOOST_AUTO_TEST_CASE(VarNumberOneByte1)
{
size_t s1 = buffer.prependVarNumber(252);
size_t s2 = estimator.prependVarNumber(252);
BOOST_CHECK_EQUAL(buffer.size(), 1);
BOOST_CHECK_EQUAL(s1, 1);
BOOST_CHECK_EQUAL(s2, 1);
buffer = EncodingBuffer();
}
s1 = buffer.prependVarNumber(253);
s2 = estimator.prependVarNumber(253);
BOOST_AUTO_TEST_CASE(VarNumberOneByte2)
{
size_t s1 = buffer.prependVarNumber(253);
size_t s2 = estimator.prependVarNumber(253);
BOOST_CHECK_EQUAL(buffer.size(), 3);
BOOST_CHECK_EQUAL(s1, 3);
BOOST_CHECK_EQUAL(s2, 3);
buffer = EncodingBuffer();
}
s1 = buffer.prependVarNumber(255);
s2 = estimator.prependVarNumber(255);
BOOST_AUTO_TEST_CASE(VarNumberThreeBytes1)
{
size_t s1 = buffer.prependVarNumber(255);
size_t s2 = estimator.prependVarNumber(255);
BOOST_CHECK_EQUAL(buffer.size(), 3);
BOOST_CHECK_EQUAL(s1, 3);
BOOST_CHECK_EQUAL(s2, 3);
buffer = EncodingBuffer();
}
s1 = buffer.prependVarNumber(65535);
s2 = estimator.prependVarNumber(65535);
BOOST_AUTO_TEST_CASE(VarNumberThreeBytes2)
{
size_t s1 = buffer.prependVarNumber(65535);
size_t s2 = estimator.prependVarNumber(65535);
BOOST_CHECK_EQUAL(buffer.size(), 3);
BOOST_CHECK_EQUAL(s1, 3);
BOOST_CHECK_EQUAL(s2, 3);
buffer = EncodingBuffer();
}
s1 = buffer.prependVarNumber(65536);
s2 = estimator.prependVarNumber(65536);
BOOST_AUTO_TEST_CASE(VarNumberFiveBytes1)
{
size_t s1 = buffer.prependVarNumber(65536);
size_t s2 = estimator.prependVarNumber(65536);
BOOST_CHECK_EQUAL(buffer.size(), 5);
BOOST_CHECK_EQUAL(s1, 5);
BOOST_CHECK_EQUAL(s2, 5);
buffer = EncodingBuffer();
}
s1 = buffer.prependVarNumber(4294967295LL);
s2 = estimator.prependVarNumber(4294967295LL);
BOOST_AUTO_TEST_CASE(VarNumberFiveBytes2)
{
size_t s1 = buffer.prependVarNumber(4294967295LL);
size_t s2 = estimator.prependVarNumber(4294967295LL);
BOOST_CHECK_EQUAL(buffer.size(), 5);
BOOST_CHECK_EQUAL(s1, 5);
BOOST_CHECK_EQUAL(s2, 5);
buffer = EncodingBuffer();
}
s1 = buffer.prependVarNumber(4294967296LL);
s2 = estimator.prependVarNumber(4294967296LL);
BOOST_AUTO_TEST_CASE(VarNumberNineBytes)
{
size_t s1 = buffer.prependVarNumber(4294967296LL);
size_t s2 = estimator.prependVarNumber(4294967296LL);
BOOST_CHECK_EQUAL(buffer.size(), 9);
BOOST_CHECK_EQUAL(s1, 9);
BOOST_CHECK_EQUAL(s2, 9);
buffer = EncodingBuffer();
// nonNegativeInteger checks
}
s1 = buffer.prependNonNegativeInteger(252);
s2 = estimator.prependNonNegativeInteger(252);
BOOST_AUTO_TEST_CASE(NonNegativeNumberOneByte1)
{
size_t s1 = buffer.prependNonNegativeInteger(252);
size_t s2 = estimator.prependNonNegativeInteger(252);
BOOST_CHECK_EQUAL(buffer.size(), 1);
BOOST_CHECK_EQUAL(s1, 1);
BOOST_CHECK_EQUAL(s2, 1);
buffer = EncodingBuffer();
}
s1 = buffer.prependNonNegativeInteger(255);
s2 = estimator.prependNonNegativeInteger(255);
BOOST_AUTO_TEST_CASE(NonNegativeNumberOneByte2)
{
size_t s1 = buffer.prependNonNegativeInteger(255);
size_t s2 = estimator.prependNonNegativeInteger(255);
BOOST_CHECK_EQUAL(buffer.size(), 1);
BOOST_CHECK_EQUAL(s1, 1);
BOOST_CHECK_EQUAL(s2, 1);
buffer = EncodingBuffer();
}
s1 = buffer.prependNonNegativeInteger(256);
s2 = estimator.prependNonNegativeInteger(256);
BOOST_AUTO_TEST_CASE(NonNegativeNumberTwoBytes1)
{
size_t s1 = buffer.prependNonNegativeInteger(256);
size_t s2 = estimator.prependNonNegativeInteger(256);
BOOST_CHECK_EQUAL(buffer.size(), 2);
BOOST_CHECK_EQUAL(s1, 2);
BOOST_CHECK_EQUAL(s2, 2);
buffer = EncodingBuffer();
}
s1 = buffer.prependNonNegativeInteger(65535);
s2 = estimator.prependNonNegativeInteger(65535);
BOOST_AUTO_TEST_CASE(NonNegativeNumberTwoBytes2)
{
size_t s1 = buffer.prependNonNegativeInteger(65535);
size_t s2 = estimator.prependNonNegativeInteger(65535);
BOOST_CHECK_EQUAL(buffer.size(), 2);
BOOST_CHECK_EQUAL(s1, 2);
BOOST_CHECK_EQUAL(s2, 2);
buffer = EncodingBuffer();
}
s1 = buffer.prependNonNegativeInteger(65536);
s2 = estimator.prependNonNegativeInteger(65536);
BOOST_AUTO_TEST_CASE(NonNegativeNumberFourBytes1)
{
size_t s1 = buffer.prependNonNegativeInteger(65536);
size_t s2 = estimator.prependNonNegativeInteger(65536);
BOOST_CHECK_EQUAL(buffer.size(), 4);
BOOST_CHECK_EQUAL(s1, 4);
BOOST_CHECK_EQUAL(s2, 4);
buffer = EncodingBuffer();
}
s1 = buffer.prependNonNegativeInteger(4294967295LL);
s2 = estimator.prependNonNegativeInteger(4294967295LL);
BOOST_AUTO_TEST_CASE(NonNegativeNumberFourBytes2)
{
size_t s1 = buffer.prependNonNegativeInteger(4294967295LL);
size_t s2 = estimator.prependNonNegativeInteger(4294967295LL);
BOOST_CHECK_EQUAL(buffer.size(), 4);
BOOST_CHECK_EQUAL(s1, 4);
BOOST_CHECK_EQUAL(s2, 4);
buffer = EncodingBuffer();
}
s1 = buffer.prependNonNegativeInteger(4294967296LL);
s2 = estimator.prependNonNegativeInteger(4294967296LL);
BOOST_AUTO_TEST_CASE(NonNegativeNumberEightBytes)
{
size_t s1 = buffer.prependNonNegativeInteger(4294967296LL);
size_t s2 = estimator.prependNonNegativeInteger(4294967296LL);
BOOST_CHECK_EQUAL(buffer.size(), 8);
BOOST_CHECK_EQUAL(s1, 8);
BOOST_CHECK_EQUAL(s2, 8);
buffer = EncodingBuffer();
}
BOOST_AUTO_TEST_SUITE_END() // Basic
BOOST_AUTO_TEST_CASE(EncodingBufferToBlock)
{
uint8_t value[4];
@ -166,19 +193,24 @@ BOOST_AUTO_TEST_CASE(BlockToBuffer)
Block block(0xab, buf);
block.encode();
EncodingBuffer buffer(0,0);
BOOST_REQUIRE_NO_THROW(buffer = EncodingBuffer(block));
BOOST_CHECK_EQUAL(buffer.size(), 12);
BOOST_CHECK_EQUAL(buffer.capacity(), 12);
{
BOOST_REQUIRE_NO_THROW(EncodingBuffer(block));
EncodingBuffer buffer(block);
BOOST_CHECK_EQUAL(buffer.size(), 12);
BOOST_CHECK_EQUAL(buffer.capacity(), 12);
}
(*buf)[1] = 0xe0;
(*buf)[2] = 2;
BOOST_REQUIRE_NO_THROW(block = Block(buf, buf->begin() + 1, buf->begin() + 5));
BOOST_CHECK_EQUAL(block.type(), 0xe0);
BOOST_REQUIRE_NO_THROW(buffer = EncodingBuffer(block));
BOOST_CHECK_EQUAL(buffer.size(), 4);
BOOST_CHECK_EQUAL(buffer.capacity(), 10);
{
BOOST_REQUIRE_NO_THROW(EncodingBuffer(block));
EncodingBuffer buffer(block);
BOOST_CHECK_EQUAL(buffer.size(), 4);
BOOST_CHECK_EQUAL(buffer.capacity(), 10);
}
}
BOOST_AUTO_TEST_CASE(FromBuffer)
@ -280,4 +312,5 @@ BOOST_AUTO_TEST_CASE(Equality)
BOOST_AUTO_TEST_SUITE_END()
} // namespace tests
} // namespace ndn

31
tests/unit-tests/test-name.cpp

@ -459,6 +459,37 @@ BOOST_AUTO_TEST_CASE(ZeroLengthComponentCompare)
BOOST_CHECK_GE(name::Component("A"), comp0);
}
BOOST_AUTO_TEST_CASE(CreateComponentWithIterators) // Bug #2490
{
{
std::vector<uint8_t> bytes = {1};
name::Component c(bytes.begin(), bytes.end());
BOOST_CHECK_EQUAL(c.value_size(), 1);
BOOST_CHECK_EQUAL(c.size(), 3);
}
{
std::list<uint8_t> bytes = {1, 2, 3, 4};
name::Component c(bytes.begin(), bytes.end());
BOOST_CHECK_EQUAL(c.value_size(), 4);
BOOST_CHECK_EQUAL(c.size(), 6);
}
{
std::vector<int8_t> bytes = {1};
name::Component c(bytes.begin(), bytes.end());
BOOST_CHECK_EQUAL(c.value_size(), 1);
BOOST_CHECK_EQUAL(c.size(), 3);
}
{
std::list<int8_t> bytes = {1, 2, 3, 4};
name::Component c(bytes.begin(), bytes.end());
BOOST_CHECK_EQUAL(c.value_size(), 4);
BOOST_CHECK_EQUAL(c.size(), 6);
}
}
BOOST_AUTO_TEST_SUITE_END()
} // namespace ndn

41
tests/unit-tests/util/simple-notification.hpp

@ -1,6 +1,12 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2013-2014 Regents of the University of California.
* Copyright (c) 2014-2015, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
* Washington University in St. Louis,
* Beijing Institute of Technology,
* The University of Memphis.
*
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
*
@ -19,32 +25,6 @@
* See AUTHORS.md for complete list of ndn-cxx authors and contributors.
*/
/**
* Original copyright notice from NFD:
*
* Copyright (c) 2014, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
* Washington University in St. Louis,
* Beijing Institute of Technology,
* The University of Memphis
*
* This file is part of NFD (Named Data Networking Forwarding Daemon).
* See AUTHORS.md for complete list of NFD authors and contributors.
*
* NFD is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef NDN_UNIT_TESTS_UTIL_SIMPLE_NOTIFICATION_HPP
#define NDN_UNIT_TESTS_UTIL_SIMPLE_NOTIFICATION_HPP
@ -83,10 +63,9 @@ public:
wireEncode() const
{
ndn::EncodingBuffer buffer;
prependByteArrayBlock(buffer,
0x8888,
reinterpret_cast<const uint8_t*>(m_message.c_str()),
m_message.size());
buffer.prependByteArrayBlock(0x8888,
reinterpret_cast<const uint8_t*>(m_message.c_str()),
m_message.size());
return buffer.block();
}

Loading…
Cancel
Save