blob: 035564618d401e5fe58369d145c9f8146e15bf04 [file] [log] [blame]
Alexander Afanasyev74633892015-02-08 18:08:46 -08001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento570b20d2018-07-15 21:53:14 -04002/*
3 * Copyright (c) 2013-2018 Regents of the University of California.
Alexander Afanasyev74633892015-02-08 18:08:46 -08004 *
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#include "estimator.hpp"
23
24namespace ndn {
25namespace encoding {
26
Alexander Afanasyev74633892015-02-08 18:08:46 -080027size_t
Davide Pesavento570b20d2018-07-15 21:53:14 -040028Estimator::prependVarNumber(uint64_t varNumber) const noexcept
Alexander Afanasyev74633892015-02-08 18:08:46 -080029{
30 if (varNumber < 253) {
31 return 1;
32 }
33 else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
34 return 3;
35 }
36 else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
37 return 5;
38 }
39 else {
40 return 9;
41 }
42}
43
44size_t
Davide Pesavento570b20d2018-07-15 21:53:14 -040045Estimator::appendVarNumber(uint64_t varNumber) const noexcept
Alexander Afanasyev74633892015-02-08 18:08:46 -080046{
47 return prependVarNumber(varNumber);
48}
49
Alexander Afanasyev74633892015-02-08 18:08:46 -080050size_t
Davide Pesavento570b20d2018-07-15 21:53:14 -040051Estimator::prependNonNegativeInteger(uint64_t varNumber) const noexcept
Alexander Afanasyev74633892015-02-08 18:08:46 -080052{
53 if (varNumber <= std::numeric_limits<uint8_t>::max()) {
54 return 1;
55 }
56 else if (varNumber <= std::numeric_limits<uint16_t>::max()) {
57 return 2;
58 }
59 else if (varNumber <= std::numeric_limits<uint32_t>::max()) {
60 return 4;
61 }
62 else {
63 return 8;
64 }
65}
66
67size_t
Davide Pesavento570b20d2018-07-15 21:53:14 -040068Estimator::appendNonNegativeInteger(uint64_t varNumber) const noexcept
Alexander Afanasyev74633892015-02-08 18:08:46 -080069{
70 return prependNonNegativeInteger(varNumber);
71}
72
Alexander Afanasyev74633892015-02-08 18:08:46 -080073size_t
Davide Pesavento570b20d2018-07-15 21:53:14 -040074Estimator::prependByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize) const noexcept
Alexander Afanasyev74633892015-02-08 18:08:46 -080075{
76 size_t totalLength = arraySize;
77 totalLength += prependVarNumber(arraySize);
78 totalLength += prependVarNumber(type);
79
80 return totalLength;
81}
82
83size_t
Davide Pesavento570b20d2018-07-15 21:53:14 -040084Estimator::appendByteArrayBlock(uint32_t type, const uint8_t* array, size_t arraySize) const noexcept
Alexander Afanasyev74633892015-02-08 18:08:46 -080085{
86 return prependByteArrayBlock(type, array, arraySize);
87}
88
Alexander Afanasyev74633892015-02-08 18:08:46 -080089size_t
Davide Pesavento570b20d2018-07-15 21:53:14 -040090Estimator::prependBlock(const Block& block) const
Alexander Afanasyev74633892015-02-08 18:08:46 -080091{
92 if (block.hasWire()) {
93 return block.size();
94 }
95 else {
96 return prependByteArrayBlock(block.type(), block.value(), block.value_size());
97 }
98}
99
100size_t
Davide Pesavento570b20d2018-07-15 21:53:14 -0400101Estimator::appendBlock(const Block& block) const
Alexander Afanasyev74633892015-02-08 18:08:46 -0800102{
103 return prependBlock(block);
104}
105
Alexander Afanasyev74633892015-02-08 18:08:46 -0800106} // namespace encoding
107} // namespace ndn