NS-3 based Named Data Networking (NDN) simulator
ndnSIM 2.5: NDN, CCN, CCNx, content centric networks
API Documentation
block-helpers.hpp
Go to the documentation of this file.
1 /* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2 /*
3  * Copyright (c) 2013-2018 Regents of the University of California.
4  *
5  * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6  *
7  * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8  * terms of the GNU Lesser General Public License as published by the Free Software
9  * Foundation, either version 3 of the License, or (at your option) any later version.
10  *
11  * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12  * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13  * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14  *
15  * You should have received copies of the GNU General Public License and GNU Lesser
16  * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17  * <http://www.gnu.org/licenses/>.
18  *
19  * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20  */
21 
22 #ifndef NDN_ENCODING_BLOCK_HELPERS_HPP
23 #define NDN_ENCODING_BLOCK_HELPERS_HPP
24 
28 
29 namespace ndn {
30 namespace encoding {
31 
38 template<Tag TAG>
39 size_t
40 prependNonNegativeIntegerBlock(EncodingImpl<TAG>& encoder, uint32_t type, uint64_t value);
41 
42 extern template size_t
43 prependNonNegativeIntegerBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t, uint64_t);
44 
45 extern template size_t
46 prependNonNegativeIntegerBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t, uint64_t);
47 
53 Block
54 makeNonNegativeIntegerBlock(uint32_t type, uint64_t value);
55 
61 uint64_t
62 readNonNegativeInteger(const Block& block);
63 
70 template<typename R>
71 std::enable_if_t<std::is_integral<R>::value, R>
73 {
74  uint64_t value = readNonNegativeInteger(block);
75  if (value > std::numeric_limits<R>::max()) {
76  BOOST_THROW_EXCEPTION(tlv::Error("Value in TLV element of type " + to_string(block.type()) +
77  " is too large"));
78  }
79  return static_cast<R>(value);
80 }
81 
90 template<typename R>
91 std::enable_if_t<std::is_enum<R>::value, R>
93 {
94  return static_cast<R>(readNonNegativeIntegerAs<std::underlying_type_t<R>>(block));
95 }
96 
103 template<Tag TAG>
104 size_t
105 prependEmptyBlock(EncodingImpl<TAG>& encoder, uint32_t type);
106 
107 extern template size_t
109 
110 extern template size_t
112 
118 Block
119 makeEmptyBlock(uint32_t type);
120 
127 template<Tag TAG>
128 size_t
129 prependStringBlock(EncodingImpl<TAG>& encoder, uint32_t type, const std::string& value);
130 
131 extern template size_t
132 prependStringBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t, const std::string&);
133 
134 extern template size_t
135 prependStringBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t, const std::string&);
136 
142 Block
143 makeStringBlock(uint32_t type, const std::string& value);
144 
150 std::string
151 readString(const Block& block);
152 
159 template<Tag TAG>
160 size_t
161 prependDoubleBlock(EncodingImpl<TAG>& encoder, uint32_t type, double value);
162 
163 extern template size_t
165 
166 extern template size_t
168 
174 Block
175 makeDoubleBlock(uint32_t type, double value);
176 
182 double
183 readDouble(const Block& block);
184 
191 Block
192 makeBinaryBlock(uint32_t type, const uint8_t* value, size_t length);
193 
200 Block
201 makeBinaryBlock(uint32_t type, const char* value, size_t length);
202 
203 namespace detail {
204 
207 template<class Iterator>
209 {
210 public:
211  BOOST_CONCEPT_ASSERT((boost::RandomAccessIterator<Iterator>));
212 
213  static Block
214  makeBlock(uint32_t type, Iterator first, Iterator last)
215  {
216  EncodingEstimator estimator;
217  size_t valueLength = last - first;
218  size_t totalLength = valueLength;
219  totalLength += estimator.prependVarNumber(valueLength);
220  totalLength += estimator.prependVarNumber(type);
221 
222  EncodingBuffer encoder(totalLength, 0);
223  encoder.prependRange(first, last);
224  encoder.prependVarNumber(valueLength);
225  encoder.prependVarNumber(type);
226 
227  return encoder.block();
228  }
229 };
230 
233 template<class Iterator>
235 {
236 public:
237  BOOST_CONCEPT_ASSERT((boost::InputIterator<Iterator>));
238 
239  static Block
240  makeBlock(uint32_t type, Iterator first, Iterator last)
241  {
242  // reserve 4 bytes in front (common for 1(type)-3(length) encoding
243  // Actual size will be adjusted as necessary by the encoder
244  EncodingBuffer encoder(4, 4);
245  size_t valueLength = encoder.appendRange(first, last);
246  encoder.prependVarNumber(valueLength);
247  encoder.prependVarNumber(type);
248 
249  return encoder.block();
250  }
251 };
252 
253 } // namespace detail
254 
262 template<class Iterator>
263 Block
264 makeBinaryBlock(uint32_t type, Iterator first, Iterator last)
265 {
266  using BinaryBlockHelper = std::conditional_t<
267  std::is_base_of<std::random_access_iterator_tag,
268  typename std::iterator_traits<Iterator>::iterator_category>::value,
271 
272  return BinaryBlockHelper::makeBlock(type, first, last);
273 }
274 
282 template<Tag TAG, class U>
283 size_t
284 prependNestedBlock(EncodingImpl<TAG>& encoder, uint32_t type, const U& value)
285 {
286  BOOST_CONCEPT_ASSERT((WireEncodableWithEncodingBuffer<U>));
287 
288  size_t valueLength = value.wireEncode(encoder);
289  size_t totalLength = valueLength;
290  totalLength += encoder.prependVarNumber(valueLength);
291  totalLength += encoder.prependVarNumber(type);
292 
293  return totalLength;
294 }
295 
302 template<class U>
303 Block
304 makeNestedBlock(uint32_t type, const U& value)
305 {
306  EncodingEstimator estimator;
307  size_t totalLength = prependNestedBlock(estimator, type, value);
308 
309  EncodingBuffer encoder(totalLength, 0);
310  prependNestedBlock(encoder, type, value);
311 
312  return encoder.block();
313 }
314 
315 } // namespace encoding
316 
325 
326 } // namespace ndn
327 
328 #endif // NDN_ENCODING_BLOCK_HELPERS_HPP
Copyright (c) 2011-2015 Regents of the University of California.
size_t appendRange(Iterator first, Iterator last)
Append range of bytes from the range [first, last)
Definition: encoder.hpp:327
EncodingImpl specialization for actual TLV encoding.
size_t prependNonNegativeIntegerBlock(EncodingImpl< TAG > &encoder, uint32_t type, uint64_t value)
Prepend a TLV element containing a non-negative integer.
static Block makeBlock(uint32_t type, Iterator first, Iterator last)
Block makeEmptyBlock(uint32_t type)
Create an empty TLV block.
std::enable_if_t< std::is_integral< R >::value, R > readNonNegativeIntegerAs(const Block &block)
Read a non-negative integer from a TLV element and cast to the specified type.
Block makeDoubleBlock(uint32_t type, double value)
Create a TLV element containing an IEEE 754 double-precision floating-point number.
template size_t prependEmptyBlock< EstimatorTag >(EncodingImpl< EstimatorTag > &, uint32_t)
template size_t prependNonNegativeIntegerBlock< EstimatorTag >(EncodingImpl< EstimatorTag > &, uint32_t, uint64_t)
template size_t prependNonNegativeIntegerBlock< EncoderTag >(EncodingImpl< EncoderTag > &, uint32_t, uint64_t)
Block makeNestedBlock(uint32_t type, const U &value)
Create a TLV block containing a nested TLV element.
size_t prependNestedBlock(EncodingImpl< TAG > &encoder, uint32_t type, const U &value)
Prepend a TLV element containing a nested TLV element.
Represents a TLV element of NDN packet format.
Definition: block.hpp:42
size_t prependStringBlock(EncodingImpl< TAG > &encoder, uint32_t type, const std::string &value)
Prepend a TLV element containing a string.
std::string readString(const Block &block)
Read TLV-VALUE of a TLV element as a string.
Block makeNonNegativeIntegerBlock(uint32_t type, uint64_t value)
Create a TLV block containing a non-negative integer.
uint64_t readNonNegativeInteger(const Block &block)
Read a non-negative integer from a TLV element.
EncodingImpl specialization for TLV size estimation.
Create a binary block copying from generic InputIterator.
template size_t prependEmptyBlock< EncoderTag >(EncodingImpl< EncoderTag > &, uint32_t)
size_t prependVarNumber(uint64_t varNumber) const noexcept
Prepend VarNumber varNumber of NDN TLV encoding.
Definition: estimator.cpp:28
size_t prependVarNumber(uint64_t varNumber)
Prepend VarNumber varNumber of NDN TLV encoding.
Definition: encoder.cpp:138
a concept check for TLV abstraction with .wireEncode method
Definition: concepts.hpp:60
template size_t prependStringBlock< EncoderTag >(EncodingImpl< EncoderTag > &, uint32_t, const std::string &)
Block block(bool verifyLength=true) const
Create Block from the underlying buffer.
Definition: encoder.cpp:59
size_t prependEmptyBlock(EncodingImpl< TAG > &encoder, uint32_t type)
Prepend an empty TLV element.
Block makeBinaryBlock(uint32_t type, const uint8_t *value, size_t length)
Create a TLV block copying TLV-VALUE from raw buffer.
Block makeStringBlock(uint32_t type, const std::string &value)
Create a TLV block containing a string.
size_t prependRange(Iterator first, Iterator last)
Prepend range of bytes from the range [first, last)
Definition: encoder.hpp:312
double readDouble(const Block &block)
Read TLV-VALUE of a TLV element as an IEEE 754 double-precision floating-point number.
template size_t prependStringBlock< EstimatorTag >(EncodingImpl< EstimatorTag > &, uint32_t, const std::string &)
template size_t prependDoubleBlock< EncoderTag >(EncodingImpl< EncoderTag > &, uint32_t, double)
template size_t prependDoubleBlock< EstimatorTag >(EncodingImpl< EstimatorTag > &, uint32_t, double)
size_t prependDoubleBlock(EncodingImpl< TAG > &encoder, uint32_t type, double value)
Prepend a TLV element containing an IEEE 754 double-precision floating-point number.
std::string to_string(const V &v)
Definition: backports.hpp:67
static Block makeBlock(uint32_t type, Iterator first, Iterator last)
uint32_t type() const
Get TLV-TYPE.
Definition: block.hpp:249
represents an error in TLV encoding or decoding
Definition: tlv.hpp:52
Create a binary block copying from RandomAccessIterator.