10 #ifndef NDN_ENCODING_BUFFER_HPP
11 #define NDN_ENCODING_BUFFER_HPP
13 #include "../common.hpp"
19 #include <boost/lexical_cast.hpp>
28 template<
bool isRealEncoderNotEstimator>
48 size_t reserveFromBack = 400)
49 : m_buffer(new
Buffer(totalReserve))
51 m_begin = m_end = m_buffer->end() - (reserveFromBack < totalReserve ? reserveFromBack : 0);
66 : m_buffer(const_pointer_cast<
Buffer>(block.m_buffer))
67 , m_begin(m_buffer->begin() + (block.begin() - m_buffer->begin()))
68 , m_end(m_buffer->begin() + (block.end() - m_buffer->begin()))
92 block(
bool verifyLength =
true)
const;
95 resize(
size_t size,
bool addInFront);
97 inline Buffer::iterator
100 inline Buffer::iterator
103 inline Buffer::const_iterator
106 inline Buffer::const_iterator
110 prependByte(uint8_t value);
113 prependByteArray(
const uint8_t* array,
size_t length);
116 prependNonNegativeInteger(uint64_t varNumber);
119 prependVarNumber(uint64_t varNumber);
122 appendByte(uint8_t value);
125 appendByteArray(
const uint8_t* array,
size_t length);
128 appendNonNegativeInteger(uint64_t varNumber);
131 appendVarNumber(uint64_t varNumber);
149 Buffer::iterator m_begin;
151 Buffer::iterator m_end;
165 size_t reserveFromBack = 400)
170 prependByte(uint8_t value);
173 prependByteArray(
const uint8_t* array,
size_t length);
176 prependNonNegativeInteger(uint64_t varNumber);
179 prependVarNumber(uint64_t varNumber);
182 appendByte(uint8_t value);
185 appendByteArray(
const uint8_t* array,
size_t length);
188 appendNonNegativeInteger(uint64_t varNumber);
191 appendVarNumber(uint64_t varNumber);
202 return m_end - m_begin;
208 return m_buffer->size();
217 inline const uint8_t*
226 return Block(m_buffer,
236 size_t diff_end = m_buffer->end() - m_end;
237 size_t diff_begin = m_buffer->end() - m_begin;
240 std::copy_backward(m_buffer->begin(), m_buffer->end(), buf->end());
244 m_end = m_buffer->end() - diff_end;
245 m_begin = m_buffer->end() - diff_begin;
249 size_t diff_end = m_end - m_buffer->begin();
250 size_t diff_begin = m_begin - m_buffer->begin();
253 std::copy(m_buffer->begin(), m_buffer->end(), buf->begin());
257 m_end = m_buffer->begin() + diff_end;
258 m_begin = m_buffer->begin() + diff_begin;
262 inline Buffer::iterator
268 inline Buffer::iterator
274 inline Buffer::const_iterator
280 inline Buffer::const_iterator
294 if (m_begin == m_buffer->begin())
295 resize(m_buffer->size() * 2,
true);
311 if ((m_buffer->begin() + length) > m_begin)
312 resize(m_buffer->size() * 2 + length,
true);
315 std::copy(array, array + length, m_begin);
328 if (varNumber <= std::numeric_limits<uint8_t>::max()) {
329 return prependByte(static_cast<uint8_t>(varNumber));
331 else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
332 uint16_t value = htobe16(static_cast<uint16_t>(varNumber));
333 return prependByteArray(reinterpret_cast<const uint8_t*>(&value), 2);
335 else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
336 uint32_t value = htobe32(static_cast<uint32_t>(varNumber));
337 return prependByteArray(reinterpret_cast<const uint8_t*>(&value), 4);
340 uint64_t value = htobe64(varNumber);
341 return prependByteArray(reinterpret_cast<const uint8_t*>(&value), 8);
348 if (varNumber <= std::numeric_limits<uint8_t>::max()) {
351 else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
354 else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
365 if (varNumber < 253) {
366 prependByte(static_cast<uint8_t>(varNumber));
369 else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
370 uint16_t value = htobe16(static_cast<uint16_t>(varNumber));
371 prependByteArray(reinterpret_cast<const uint8_t*>(&value), 2);
375 else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
376 uint32_t value = htobe32(static_cast<uint32_t>(varNumber));
377 prependByteArray(reinterpret_cast<const uint8_t*>(&value), 4);
382 uint64_t value = htobe64(varNumber);
383 prependByteArray(reinterpret_cast<const uint8_t*>(&value), 8);
392 if (varNumber < 253) {
395 else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
398 else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
413 if (m_end == m_buffer->end())
414 resize(m_buffer->size() * 2,
false);
430 if ((m_end + length) > m_buffer->end())
431 resize(m_buffer->size() * 2 + length,
false);
433 std::copy(array, array + length, m_end);
441 return prependByteArray(array, length);
447 if (varNumber <= std::numeric_limits<uint8_t>::max()) {
448 return appendByte(static_cast<uint8_t>(varNumber));
450 else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
451 uint16_t value = htobe16(static_cast<uint16_t>(varNumber));
452 return appendByteArray(reinterpret_cast<const uint8_t*>(&value), 2);
454 else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
455 uint32_t value = htobe32(static_cast<uint32_t>(varNumber));
456 return appendByteArray(reinterpret_cast<const uint8_t*>(&value), 4);
459 uint64_t value = htobe64(varNumber);
460 return appendByteArray(reinterpret_cast<const uint8_t*>(&value), 8);
467 return prependNonNegativeInteger(varNumber);
473 if (varNumber < 253) {
474 appendByte(static_cast<uint8_t>(varNumber));
477 else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
479 uint16_t value = htobe16(static_cast<uint16_t>(varNumber));
480 appendByteArray(reinterpret_cast<const uint8_t*>(&value), 2);
483 else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
485 uint32_t value = htobe32(static_cast<uint32_t>(varNumber));
486 appendByteArray(reinterpret_cast<const uint8_t*>(&value), 4);
491 uint64_t value = htobe64(varNumber);
492 appendByteArray(reinterpret_cast<const uint8_t*>(&value), 8);
500 return prependVarNumber(varNumber);
509 size_t valueLength = encoder.prependNonNegativeInteger(number);
510 size_t totalLength = valueLength;
511 totalLength += encoder.prependVarNumber(valueLength);
512 totalLength += encoder.prependVarNumber(type);
520 const uint8_t* array,
size_t arraySize)
522 size_t valueLength = encoder.prependByteArray(array, arraySize);
523 size_t totalLength = valueLength;
524 totalLength += encoder.prependVarNumber(valueLength);
525 totalLength += encoder.prependVarNumber(type);
534 size_t totalLength = encoder.prependVarNumber(0);
535 totalLength += encoder.prependVarNumber(type);
541 template<
bool P,
class U>
545 size_t valueLength = nestedBlock.wireEncode(encoder);
546 size_t totalLength = valueLength;
547 totalLength += encoder.prependVarNumber(valueLength);
548 totalLength += encoder.prependVarNumber(type);
557 return encoder.prependByteArray(block.
wire(), block.
size());
563 #endif // NDN_ENCODING_BUFFER_HPP
EncodingImpl(const Block &block)
Create EncodingBlock from existing block.
size_t prependNestedBlock(EncodingImpl< P > &encoder, uint32_t type, const U &nestedBlock)
static const bool Estimator
Class representing wire element of the NDN packet.
ptr_lib::shared_ptr< Buffer > BufferPtr
EncodingImpl< true > EncodingBuffer
Class representing wire element of the NDN packet.
size_t prependBlock(EncodingImpl< P > &encoder, const Block &block)
EncodingImpl(size_t totalReserve=8800, size_t reserveFromBack=400)
Constructor to create a EncodingImpl with specified reserved sizes.
size_t prependBooleanBlock(EncodingImpl< P > &encoder, uint32_t type)
EncodingImpl< encoding::Estimator > EncodingEstimator
EncodingImpl(size_t totalReserve=8800, size_t reserveFromBack=400)
const uint8_t * wire() const
size_t prependNonNegativeIntegerBlock(EncodingImpl< P > &encoder, uint32_t type, uint64_t number)
helper methods
Class representing a general-use automatically managed/resized buffer.
size_t prependByteArrayBlock(EncodingImpl< P > &encoder, uint32_t type, const uint8_t *array, size_t arraySize)
Class representing wire element of the NDN packet.