Use std::string_view in several APIs
Change-Id: I2c13b229162b247738cbf46d6bf71fc69d45816f
This commit is contained in:
1 parent
a3651646a9
commit
3fdb02f62e
43 files changed
+507
-492
No files matched your search
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -56,10 +56,10 @@ private:
|
||||
{
|
||||
std::cout << ">> I: " << interest << std::endl;
|
||||
|
||||
static const std::string content("Hello, world!");
|
||||
constexpr std::string_view content{"Hello, world!"};
|
||||
|
||||
// Create Data packet
|
||||
auto data = make_shared<Data>(interest.getName());
|
||||
auto data = std::make_shared<Data>(interest.getName());
|
||||
data->setFreshnessPeriod(10_s);
|
||||
data->setContent(make_span(reinterpret_cast<const uint8_t*>(content.data()), content.size()));
|
||||
|
||||
|
||||
@@ -56,6 +56,7 @@
|
||||
#include <memory>
|
||||
#include <stdexcept>
|
||||
#include <string>
|
||||
#include <string_view>
|
||||
#include <type_traits>
|
||||
#include <utility>
|
||||
|
||||
@@ -72,8 +73,8 @@ using std::dynamic_pointer_cast;
|
||||
using std::const_pointer_cast;
|
||||
|
||||
using std::to_string;
|
||||
|
||||
using namespace std::string_literals;
|
||||
using namespace std::string_view_literals;
|
||||
|
||||
} // namespace ndn
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -28,6 +28,36 @@ namespace encoding {
|
||||
|
||||
namespace endian = boost::endian;
|
||||
|
||||
// ---- empty ----
|
||||
|
||||
template<Tag TAG>
|
||||
size_t
|
||||
prependEmptyBlock(EncodingImpl<TAG>& encoder, uint32_t type)
|
||||
{
|
||||
size_t length = encoder.prependVarNumber(0);
|
||||
length += encoder.prependVarNumber(type);
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
template size_t
|
||||
prependEmptyBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t);
|
||||
|
||||
template size_t
|
||||
prependEmptyBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t);
|
||||
|
||||
Block
|
||||
makeEmptyBlock(uint32_t type)
|
||||
{
|
||||
EncodingEstimator estimator;
|
||||
size_t totalLength = prependEmptyBlock(estimator, type);
|
||||
|
||||
EncodingBuffer encoder(totalLength, 0);
|
||||
prependEmptyBlock(encoder, type);
|
||||
|
||||
return encoder.block();
|
||||
}
|
||||
|
||||
// ---- non-negative integer ----
|
||||
|
||||
template<Tag TAG>
|
||||
@@ -66,63 +96,6 @@ readNonNegativeInteger(const Block& block)
|
||||
return tlv::readNonNegativeInteger(block.value_size(), begin, block.value_end());
|
||||
}
|
||||
|
||||
// ---- empty ----
|
||||
|
||||
template<Tag TAG>
|
||||
size_t
|
||||
prependEmptyBlock(EncodingImpl<TAG>& encoder, uint32_t type)
|
||||
{
|
||||
size_t length = encoder.prependVarNumber(0);
|
||||
length += encoder.prependVarNumber(type);
|
||||
|
||||
return length;
|
||||
}
|
||||
|
||||
template size_t
|
||||
prependEmptyBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t);
|
||||
|
||||
template size_t
|
||||
prependEmptyBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t);
|
||||
|
||||
Block
|
||||
makeEmptyBlock(uint32_t type)
|
||||
{
|
||||
EncodingEstimator estimator;
|
||||
size_t totalLength = prependEmptyBlock(estimator, type);
|
||||
|
||||
EncodingBuffer encoder(totalLength, 0);
|
||||
prependEmptyBlock(encoder, type);
|
||||
|
||||
return encoder.block();
|
||||
}
|
||||
|
||||
// ---- string ----
|
||||
|
||||
template<Tag TAG>
|
||||
size_t
|
||||
prependStringBlock(EncodingImpl<TAG>& encoder, uint32_t type, const std::string& value)
|
||||
{
|
||||
return prependBinaryBlock(encoder, type, {reinterpret_cast<const uint8_t*>(value.data()), value.size()});
|
||||
}
|
||||
|
||||
template size_t
|
||||
prependStringBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t, const std::string&);
|
||||
|
||||
template size_t
|
||||
prependStringBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t, const std::string&);
|
||||
|
||||
Block
|
||||
makeStringBlock(uint32_t type, const std::string& value)
|
||||
{
|
||||
return makeBinaryBlock(type, value.data(), value.size());
|
||||
}
|
||||
|
||||
std::string
|
||||
readString(const Block& block)
|
||||
{
|
||||
return std::string(reinterpret_cast<const char*>(block.value()), block.value_size());
|
||||
}
|
||||
|
||||
// ---- double ----
|
||||
|
||||
static_assert(std::numeric_limits<double>::is_iec559, "This code requires IEEE-754 doubles");
|
||||
@@ -205,6 +178,27 @@ makeBinaryBlock(uint32_t type, span<const uint8_t> value)
|
||||
return encoder.block();
|
||||
}
|
||||
|
||||
// ---- string ----
|
||||
|
||||
template<Tag TAG>
|
||||
size_t
|
||||
prependStringBlock(EncodingImpl<TAG>& encoder, uint32_t type, std::string_view value)
|
||||
{
|
||||
return prependBinaryBlock(encoder, type, {reinterpret_cast<const uint8_t*>(value.data()), value.size()});
|
||||
}
|
||||
|
||||
template size_t
|
||||
prependStringBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t, std::string_view);
|
||||
|
||||
template size_t
|
||||
prependStringBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t, std::string_view);
|
||||
|
||||
std::string
|
||||
readString(const Block& block)
|
||||
{
|
||||
return std::string(reinterpret_cast<const char*>(block.value()), block.value_size());
|
||||
}
|
||||
|
||||
// ---- block ----
|
||||
|
||||
template<Tag TAG>
|
||||
|
||||
@@ -29,6 +29,30 @@
|
||||
namespace ndn {
|
||||
namespace encoding {
|
||||
|
||||
/** @brief Prepend an empty TLV element.
|
||||
* @param encoder an EncodingBuffer or EncodingEstimator
|
||||
* @param type TLV-TYPE number
|
||||
* @details The TLV element has zero-length TLV-VALUE.
|
||||
* @sa makeEmptyBlock
|
||||
*/
|
||||
template<Tag TAG>
|
||||
size_t
|
||||
prependEmptyBlock(EncodingImpl<TAG>& encoder, uint32_t type);
|
||||
|
||||
extern template size_t
|
||||
prependEmptyBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t);
|
||||
|
||||
extern template size_t
|
||||
prependEmptyBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t);
|
||||
|
||||
/** @brief Create an empty TLV block.
|
||||
* @param type TLV-TYPE number
|
||||
* @return A TLV block with zero-length TLV-VALUE
|
||||
* @sa prependEmptyBlock
|
||||
*/
|
||||
Block
|
||||
makeEmptyBlock(uint32_t type);
|
||||
|
||||
/** @brief Prepend a TLV element containing a non-negative integer.
|
||||
* @param encoder an EncodingBuffer or EncodingEstimator
|
||||
* @param type TLV-TYPE number
|
||||
@@ -93,62 +117,6 @@ readNonNegativeIntegerAs(const Block& block)
|
||||
return static_cast<R>(readNonNegativeIntegerAs<std::underlying_type_t<R>>(block));
|
||||
}
|
||||
|
||||
/** @brief Prepend an empty TLV element.
|
||||
* @param encoder an EncodingBuffer or EncodingEstimator
|
||||
* @param type TLV-TYPE number
|
||||
* @details The TLV element has zero-length TLV-VALUE.
|
||||
* @sa makeEmptyBlock
|
||||
*/
|
||||
template<Tag TAG>
|
||||
size_t
|
||||
prependEmptyBlock(EncodingImpl<TAG>& encoder, uint32_t type);
|
||||
|
||||
extern template size_t
|
||||
prependEmptyBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t);
|
||||
|
||||
extern template size_t
|
||||
prependEmptyBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t);
|
||||
|
||||
/** @brief Create an empty TLV block.
|
||||
* @param type TLV-TYPE number
|
||||
* @return A TLV block with zero-length TLV-VALUE
|
||||
* @sa prependEmptyBlock
|
||||
*/
|
||||
Block
|
||||
makeEmptyBlock(uint32_t type);
|
||||
|
||||
/** @brief Prepend a TLV element containing a string.
|
||||
* @param encoder an EncodingBuffer or EncodingEstimator
|
||||
* @param type TLV-TYPE number
|
||||
* @param value string value, may contain NUL octets
|
||||
* @sa makeStringBlock, readString
|
||||
*/
|
||||
template<Tag TAG>
|
||||
size_t
|
||||
prependStringBlock(EncodingImpl<TAG>& encoder, uint32_t type, const std::string& value);
|
||||
|
||||
extern template size_t
|
||||
prependStringBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t, const std::string&);
|
||||
|
||||
extern template size_t
|
||||
prependStringBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t, const std::string&);
|
||||
|
||||
/** @brief Create a TLV block containing a string.
|
||||
* @param type TLV-TYPE number
|
||||
* @param value string value, may contain NUL octets
|
||||
* @sa prependStringBlock, readString
|
||||
*/
|
||||
Block
|
||||
makeStringBlock(uint32_t type, const std::string& value);
|
||||
|
||||
/** @brief Read TLV-VALUE of a TLV element as a string.
|
||||
* @param block the TLV element
|
||||
* @return a string, may contain NUL octets
|
||||
* @sa prependStringBlock, makeStringBlock
|
||||
*/
|
||||
std::string
|
||||
readString(const Block& block);
|
||||
|
||||
/** @brief Prepend a TLV element containing an IEEE 754 double-precision floating-point number.
|
||||
* @param encoder an EncodingBuffer or EncodingEstimator
|
||||
* @param type TLV-TYPE number
|
||||
@@ -207,18 +175,6 @@ prependBinaryBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t, span<const u
|
||||
Block
|
||||
makeBinaryBlock(uint32_t type, span<const uint8_t> value);
|
||||
|
||||
/** @brief Create a TLV block copying the TLV-VALUE from a raw buffer.
|
||||
* @param type TLV-TYPE number
|
||||
* @param value raw buffer as TLV-VALUE
|
||||
* @param length length of value buffer
|
||||
* @deprecated
|
||||
*/
|
||||
inline Block
|
||||
makeBinaryBlock(uint32_t type, const char* value, size_t length)
|
||||
{
|
||||
return makeBinaryBlock(type, {reinterpret_cast<const uint8_t*>(value), length});
|
||||
}
|
||||
|
||||
namespace detail {
|
||||
|
||||
/**
|
||||
@@ -294,6 +250,58 @@ makeBinaryBlock(uint32_t type, Iterator first, Iterator last)
|
||||
return BinaryBlockHelper::makeBlock(type, first, last);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create a TLV block copying the TLV-VALUE from a char buffer.
|
||||
* @param type TLV-TYPE number
|
||||
* @param value raw buffer as TLV-VALUE
|
||||
* @param length length of value buffer
|
||||
* @deprecated Use makeStringBlock()
|
||||
*/
|
||||
[[deprecated("use makeStringBlock")]]
|
||||
inline Block
|
||||
makeBinaryBlock(uint32_t type, const char* value, size_t length)
|
||||
{
|
||||
return makeBinaryBlock(type, {reinterpret_cast<const uint8_t*>(value), length});
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Prepend a TLV element containing a string.
|
||||
* @param encoder an EncodingBuffer or EncodingEstimator
|
||||
* @param type TLV-TYPE number
|
||||
* @param value string value, may contain NUL octets
|
||||
* @sa makeStringBlock, readString
|
||||
*/
|
||||
template<Tag TAG>
|
||||
size_t
|
||||
prependStringBlock(EncodingImpl<TAG>& encoder, uint32_t type, std::string_view value);
|
||||
|
||||
extern template size_t
|
||||
prependStringBlock<EstimatorTag>(EncodingImpl<EstimatorTag>&, uint32_t, std::string_view);
|
||||
|
||||
extern template size_t
|
||||
prependStringBlock<EncoderTag>(EncodingImpl<EncoderTag>&, uint32_t, std::string_view);
|
||||
|
||||
/**
|
||||
* @brief Create a TLV block containing a string.
|
||||
* @param type TLV-TYPE number
|
||||
* @param value string value, may contain NUL octets
|
||||
* @sa prependStringBlock, readString
|
||||
*/
|
||||
inline Block
|
||||
makeStringBlock(uint32_t type, std::string_view value)
|
||||
{
|
||||
return makeBinaryBlock(type, {reinterpret_cast<const uint8_t*>(value.data()), value.size()});
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Read the TLV-VALUE of a TLV element as a string.
|
||||
* @param block the TLV element
|
||||
* @return a string, may contain NUL octets
|
||||
* @sa prependStringBlock, makeStringBlock
|
||||
*/
|
||||
std::string
|
||||
readString(const Block& block);
|
||||
|
||||
/**
|
||||
* @brief Prepend a TLV element.
|
||||
* @param encoder an EncodingBuffer or EncodingEstimator
|
||||
@@ -394,13 +402,13 @@ makeNestedBlock(uint32_t type, I first, I last)
|
||||
|
||||
} // namespace encoding
|
||||
|
||||
using encoding::makeEmptyBlock;
|
||||
using encoding::makeNonNegativeIntegerBlock;
|
||||
using encoding::readNonNegativeInteger;
|
||||
using encoding::readNonNegativeIntegerAs;
|
||||
using encoding::makeEmptyBlock;
|
||||
using encoding::makeBinaryBlock;
|
||||
using encoding::makeStringBlock;
|
||||
using encoding::readString;
|
||||
using encoding::makeBinaryBlock;
|
||||
using encoding::makeNestedBlock;
|
||||
|
||||
} // namespace ndn
|
||||
|
||||
@@ -176,13 +176,13 @@ operator<<(std::ostream& os, RouteFlags routeFlags)
|
||||
return os << "none";
|
||||
}
|
||||
|
||||
static const std::map<RouteFlags, std::string> knownBits = {
|
||||
{ROUTE_FLAG_CHILD_INHERIT, "child-inherit"},
|
||||
{ROUTE_FLAG_CAPTURE, "capture"}
|
||||
static const std::map<RouteFlags, std::string_view> knownBits = {
|
||||
{ROUTE_FLAG_CHILD_INHERIT, "child-inherit"sv},
|
||||
{ROUTE_FLAG_CAPTURE, "capture"sv}
|
||||
};
|
||||
|
||||
auto join = make_ostream_joiner(os, '|');
|
||||
for (const auto& [bit, token] : knownBits) {
|
||||
for (auto [bit, token] : knownBits) {
|
||||
if ((routeFlags & bit) != 0) {
|
||||
join = token;
|
||||
routeFlags = static_cast<RouteFlags>(routeFlags & ~bit);
|
||||
|
||||
+2
-2
@@ -47,8 +47,8 @@ namespace ndn {
|
||||
|
||||
Face::OversizedPacketError::OversizedPacketError(char pktType, const Name& name, size_t wireSize)
|
||||
: Error((pktType == 'I' ? "Interest " : pktType == 'D' ? "Data " : "Nack ") +
|
||||
name.toUri() + " encodes into " + to_string(wireSize) + " octets, "
|
||||
"exceeding the implementation limit of " + to_string(MAX_NDN_PACKET_SIZE) + " octets")
|
||||
name.toUri() + " encodes into " + std::to_string(wireSize) + " octets, "
|
||||
"exceeding the implementation limit of " + std::to_string(MAX_NDN_PACKET_SIZE) + " octets")
|
||||
, pktType(pktType)
|
||||
, name(name)
|
||||
, wireSize(wireSize)
|
||||
|
||||
@@ -52,10 +52,11 @@ public:
|
||||
{
|
||||
}
|
||||
|
||||
/** \brief Calculate the successor of \p comp.
|
||||
/**
|
||||
* \brief Calculate the successor of \p comp.
|
||||
*
|
||||
* If \p comp is the maximum possible value of this component type, return true to indicate
|
||||
* that the successor should have a greater TLV-TYPE.
|
||||
* If \p comp is the maximum possible value of this component type, return true to indicate
|
||||
* that the successor should have a greater TLV-TYPE.
|
||||
*/
|
||||
virtual std::tuple<bool, Component>
|
||||
getSuccessor(const Component& comp) const
|
||||
@@ -63,7 +64,8 @@ public:
|
||||
return {false, Component(std::get<Block>(getSuccessorImpl(comp)))};
|
||||
}
|
||||
|
||||
/** \brief Return the minimum allowable TLV-VALUE of this component type.
|
||||
/**
|
||||
* \brief Return the minimum allowable TLV-VALUE of this component type.
|
||||
*/
|
||||
virtual span<const uint8_t>
|
||||
getMinValue() const
|
||||
@@ -72,36 +74,39 @@ public:
|
||||
return value;
|
||||
}
|
||||
|
||||
/** \brief Return the prefix of the alternate URI representation.
|
||||
/**
|
||||
* \brief Return the prefix of the alternate URI representation.
|
||||
*
|
||||
* NDN URI specification allows a name component type to declare an alternate URI representation
|
||||
* in the form of `<prefix>=<value>`, in addition to the plain `<type-number>=<escaped-value>`
|
||||
* syntax.
|
||||
* NDN URI specification allows a name component type to declare an alternate URI representation
|
||||
* in the form of `<prefix>=<value>`, in addition to the plain `<type-number>=<escaped-value>`
|
||||
* syntax.
|
||||
*
|
||||
* \return The `<prefix>` portion of the alternate URI representation.
|
||||
* \retval nullptr This component does not have an alternate URI representation.
|
||||
* \return The `<prefix>` portion of the alternate URI representation.
|
||||
* \retval empty This component does not have an alternate URI representation.
|
||||
*/
|
||||
virtual const char*
|
||||
virtual std::string_view
|
||||
getAltUriPrefix() const
|
||||
{
|
||||
return nullptr;
|
||||
return {};
|
||||
}
|
||||
|
||||
/** \brief Parse component from alternate URI representation.
|
||||
* \param input the `<value>` portion of the alternate URI representation.
|
||||
* \throw Component::Error
|
||||
* \pre getAltUriPrefix() != nullptr
|
||||
/**
|
||||
* \brief Parse component from alternate URI representation.
|
||||
* \param input the `<value>` portion of the alternate URI representation.
|
||||
* \throw Component::Error
|
||||
* \pre `getAltUriPrefix().empty() == false`
|
||||
*/
|
||||
virtual Component
|
||||
parseAltUriValue(const std::string& input) const
|
||||
parseAltUriValue(std::string_view input) const
|
||||
{
|
||||
NDN_CXX_UNREACHABLE;
|
||||
}
|
||||
|
||||
/** \brief Write URI representation of \p comp to \p os.
|
||||
/**
|
||||
* \brief Write URI representation of \p comp to \p os.
|
||||
*
|
||||
* This base class implementation encodes the component using the plain
|
||||
* `<type-number>=<escaped-value>` syntax (aka canonical format).
|
||||
* This base class implementation encodes the component using the plain
|
||||
* `<type-number>=<escaped-value>` syntax (aka canonical format).
|
||||
*/
|
||||
virtual void
|
||||
writeUri(std::ostream& os, const Component& comp) const
|
||||
@@ -151,7 +156,7 @@ protected:
|
||||
if (isAllPeriods) {
|
||||
os << "...";
|
||||
}
|
||||
escape(os, reinterpret_cast<const char*>(comp.value()), comp.value_size());
|
||||
escape(os, {reinterpret_cast<const char*>(comp.value()), comp.value_size()});
|
||||
}
|
||||
};
|
||||
|
||||
@@ -178,7 +183,8 @@ public:
|
||||
class Sha256ComponentType final : public ComponentType
|
||||
{
|
||||
public:
|
||||
Sha256ComponentType(uint32_t type, const std::string& typeName, const std::string& uriPrefix)
|
||||
constexpr
|
||||
Sha256ComponentType(uint32_t type, std::string_view typeName, std::string_view uriPrefix)
|
||||
: m_type(type)
|
||||
, m_typeName(typeName)
|
||||
, m_uriPrefix(uriPrefix)
|
||||
@@ -190,7 +196,8 @@ public:
|
||||
{
|
||||
BOOST_ASSERT(comp.type() == m_type);
|
||||
if (comp.value_size() != util::Sha256::DIGEST_SIZE) {
|
||||
NDN_THROW(Error(m_typeName + " TLV-LENGTH must be " + to_string(util::Sha256::DIGEST_SIZE)));
|
||||
NDN_THROW(Error(std::string(m_typeName) + " TLV-LENGTH must be " +
|
||||
std::to_string(util::Sha256::DIGEST_SIZE)));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -208,21 +215,21 @@ public:
|
||||
return value;
|
||||
}
|
||||
|
||||
const char*
|
||||
std::string_view
|
||||
getAltUriPrefix() const final
|
||||
{
|
||||
return m_uriPrefix.data();
|
||||
return m_uriPrefix;
|
||||
}
|
||||
|
||||
Component
|
||||
parseAltUriValue(const std::string& input) const final
|
||||
parseAltUriValue(std::string_view input) const final
|
||||
{
|
||||
shared_ptr<Buffer> value;
|
||||
try {
|
||||
value = fromHex(input);
|
||||
}
|
||||
catch (const StringHelperError&) {
|
||||
NDN_THROW(Error("Cannot convert to " + m_typeName + " (invalid hex encoding)"));
|
||||
NDN_THROW(Error("Cannot convert to " + std::string(m_typeName) + " (invalid hex encoding)"));
|
||||
}
|
||||
return {m_type, std::move(value)};
|
||||
}
|
||||
@@ -236,8 +243,8 @@ public:
|
||||
|
||||
private:
|
||||
const uint32_t m_type;
|
||||
const std::string m_typeName;
|
||||
const std::string m_uriPrefix;
|
||||
const std::string_view m_typeName;
|
||||
const std::string_view m_uriPrefix;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -247,7 +254,8 @@ private:
|
||||
class DecimalComponentType final : public ComponentType
|
||||
{
|
||||
public:
|
||||
DecimalComponentType(uint32_t type, const std::string& typeName, const std::string& uriPrefix)
|
||||
constexpr
|
||||
DecimalComponentType(uint32_t type, std::string_view typeName, std::string_view uriPrefix)
|
||||
: m_type(type)
|
||||
, m_typeName(typeName)
|
||||
, m_uriPrefix(uriPrefix)
|
||||
@@ -259,27 +267,27 @@ public:
|
||||
// NonNegativeInteger, because the application may be using the same typed component
|
||||
// with different syntax and semantics.
|
||||
|
||||
const char*
|
||||
std::string_view
|
||||
getAltUriPrefix() const final
|
||||
{
|
||||
return m_uriPrefix.data();
|
||||
return m_uriPrefix;
|
||||
}
|
||||
|
||||
Component
|
||||
parseAltUriValue(const std::string& input) const final
|
||||
parseAltUriValue(std::string_view input) const final
|
||||
{
|
||||
uint64_t n = 0;
|
||||
try {
|
||||
n = std::stoull(input);
|
||||
n = std::stoull(std::string(input));
|
||||
}
|
||||
catch (const std::invalid_argument&) {
|
||||
NDN_THROW(Error("Cannot convert to " + m_typeName + " (invalid format)"));
|
||||
NDN_THROW(Error("Cannot convert to " + std::string(m_typeName) + " (invalid format)"));
|
||||
}
|
||||
catch (const std::out_of_range&) {
|
||||
NDN_THROW(Error("Cannot convert to " + m_typeName + " (out of range)"));
|
||||
NDN_THROW(Error("Cannot convert to " + std::string(m_typeName) + " (out of range)"));
|
||||
}
|
||||
if (to_string(n) != input) {
|
||||
NDN_THROW(Error("Cannot convert to " + m_typeName + " (invalid format)"));
|
||||
if (std::to_string(n) != input) {
|
||||
NDN_THROW(Error("Cannot convert to " + std::string(m_typeName) + " (invalid format)"));
|
||||
}
|
||||
return Component::fromNumber(n, m_type);
|
||||
}
|
||||
@@ -297,8 +305,8 @@ public:
|
||||
|
||||
private:
|
||||
const uint32_t m_type;
|
||||
const std::string m_typeName;
|
||||
const std::string m_uriPrefix;
|
||||
const std::string_view m_typeName;
|
||||
const std::string_view m_uriPrefix;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -325,7 +333,7 @@ public:
|
||||
* \brief Retrieve a ComponentType by its alternate URI prefix.
|
||||
*/
|
||||
const ComponentType*
|
||||
findByUriPrefix(const std::string& prefix) const
|
||||
findByUriPrefix(std::string_view prefix) const
|
||||
{
|
||||
if (auto it = m_uriPrefixes.find(prefix); it != m_uriPrefixes.end()) {
|
||||
return it->second;
|
||||
@@ -338,7 +346,7 @@ private:
|
||||
set(uint32_t type, const ComponentType& ct)
|
||||
{
|
||||
m_table.at(type) = &ct;
|
||||
if (ct.getAltUriPrefix() != nullptr) {
|
||||
if (!ct.getAltUriPrefix().empty()) {
|
||||
m_uriPrefixes[ct.getAltUriPrefix()] = &ct;
|
||||
}
|
||||
}
|
||||
@@ -346,7 +354,7 @@ private:
|
||||
private:
|
||||
const ComponentType m_baseType;
|
||||
std::array<const ComponentType*, 60> m_table;
|
||||
std::unordered_map<std::string, const ComponentType*> m_uriPrefixes;
|
||||
std::unordered_map<std::string_view, const ComponentType*> m_uriPrefixes;
|
||||
};
|
||||
|
||||
inline
|
||||
@@ -355,10 +363,10 @@ ComponentTypeTable::ComponentTypeTable()
|
||||
m_table.fill(nullptr);
|
||||
|
||||
static const Sha256ComponentType ct1(tlv::ImplicitSha256DigestComponent,
|
||||
"ImplicitSha256DigestComponent", "sha256digest");
|
||||
"ImplicitSha256DigestComponent"sv, "sha256digest"sv);
|
||||
set(tlv::ImplicitSha256DigestComponent, ct1);
|
||||
static const Sha256ComponentType ct2(tlv::ParametersSha256DigestComponent,
|
||||
"ParametersSha256DigestComponent", "params-sha256");
|
||||
"ParametersSha256DigestComponent"sv, "params-sha256"sv);
|
||||
set(tlv::ParametersSha256DigestComponent, ct2);
|
||||
|
||||
static const GenericNameComponentType ct8;
|
||||
@@ -367,15 +375,15 @@ ComponentTypeTable::ComponentTypeTable()
|
||||
static const ComponentType ct32;
|
||||
set(tlv::KeywordNameComponent, ct32);
|
||||
|
||||
static const DecimalComponentType ct50(tlv::SegmentNameComponent, "SegmentNameComponent", "seg");
|
||||
static const DecimalComponentType ct50(tlv::SegmentNameComponent, "SegmentNameComponent"sv, "seg"sv);
|
||||
set(tlv::SegmentNameComponent, ct50);
|
||||
static const DecimalComponentType ct52(tlv::ByteOffsetNameComponent, "ByteOffsetNameComponent", "off");
|
||||
static const DecimalComponentType ct52(tlv::ByteOffsetNameComponent, "ByteOffsetNameComponent"sv, "off"sv);
|
||||
set(tlv::ByteOffsetNameComponent, ct52);
|
||||
static const DecimalComponentType ct54(tlv::VersionNameComponent, "VersionNameComponent", "v");
|
||||
static const DecimalComponentType ct54(tlv::VersionNameComponent, "VersionNameComponent"sv, "v"sv);
|
||||
set(tlv::VersionNameComponent, ct54);
|
||||
static const DecimalComponentType ct56(tlv::TimestampNameComponent, "TimestampNameComponent", "t");
|
||||
static const DecimalComponentType ct56(tlv::TimestampNameComponent, "TimestampNameComponent"sv, "t"sv);
|
||||
set(tlv::TimestampNameComponent, ct56);
|
||||
static const DecimalComponentType ct58(tlv::SequenceNumNameComponent, "SequenceNumNameComponent", "seq");
|
||||
static const DecimalComponentType ct58(tlv::SequenceNumNameComponent, "SequenceNumNameComponent"sv, "seq"sv);
|
||||
set(tlv::SequenceNumNameComponent, ct58);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2019 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -86,7 +86,7 @@ ChannelStatus::wireDecode(const Block& block)
|
||||
}
|
||||
|
||||
ChannelStatus&
|
||||
ChannelStatus::setLocalUri(const std::string localUri)
|
||||
ChannelStatus::setLocalUri(const std::string& localUri)
|
||||
{
|
||||
m_wire.reset();
|
||||
m_localUri = localUri;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -64,7 +64,7 @@ public: // getters & setters
|
||||
}
|
||||
|
||||
ChannelStatus&
|
||||
setLocalUri(const std::string localUri);
|
||||
setLocalUri(const std::string& localUri);
|
||||
|
||||
private:
|
||||
std::string m_localUri;
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -39,7 +39,7 @@ ControlCommand::validateRequest(const ControlParameters& parameters) const
|
||||
}
|
||||
|
||||
void
|
||||
ControlCommand::applyDefaultsToRequest(ControlParameters& parameters) const
|
||||
ControlCommand::applyDefaultsToRequest(ControlParameters&) const
|
||||
{
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ ControlCommand::validateResponse(const ControlParameters& parameters) const
|
||||
}
|
||||
|
||||
void
|
||||
ControlCommand::applyDefaultsToResponse(ControlParameters& parameters) const
|
||||
ControlCommand::applyDefaultsToResponse(ControlParameters&) const
|
||||
{
|
||||
}
|
||||
|
||||
@@ -81,11 +81,11 @@ ControlCommand::FieldValidator::validate(const ControlParameters& parameters) co
|
||||
bool isPresent = presentFields[i];
|
||||
if (m_required[i]) {
|
||||
if (!isPresent) {
|
||||
NDN_THROW(ArgumentError(CONTROL_PARAMETER_FIELD[i] + " is required but missing"));
|
||||
NDN_THROW(ArgumentError(std::string(CONTROL_PARAMETER_FIELD[i]) + " is required but missing"));
|
||||
}
|
||||
}
|
||||
else if (isPresent && !m_optional[i]) {
|
||||
NDN_THROW(ArgumentError(CONTROL_PARAMETER_FIELD[i] + " is forbidden but present"));
|
||||
NDN_THROW(ArgumentError(std::string(CONTROL_PARAMETER_FIELD[i]) + " is forbidden but present"));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -50,26 +50,26 @@ enum ControlParameterField {
|
||||
CONTROL_PARAMETER_BASE_CONGESTION_MARKING_INTERVAL,
|
||||
CONTROL_PARAMETER_DEFAULT_CONGESTION_THRESHOLD,
|
||||
CONTROL_PARAMETER_MTU,
|
||||
CONTROL_PARAMETER_UBOUND
|
||||
CONTROL_PARAMETER_UBOUND,
|
||||
};
|
||||
|
||||
inline const std::string CONTROL_PARAMETER_FIELD[CONTROL_PARAMETER_UBOUND] = {
|
||||
"Name",
|
||||
"FaceId",
|
||||
"Uri",
|
||||
"LocalUri",
|
||||
"Origin",
|
||||
"Cost",
|
||||
"Capacity",
|
||||
"Count",
|
||||
"Flags",
|
||||
"Mask",
|
||||
"Strategy",
|
||||
"ExpirationPeriod",
|
||||
"FacePersistency",
|
||||
"BaseCongestionMarkingInterval",
|
||||
"DefaultCongestionThreshold",
|
||||
"Mtu"
|
||||
inline constexpr std::string_view CONTROL_PARAMETER_FIELD[CONTROL_PARAMETER_UBOUND] = {
|
||||
"Name"sv,
|
||||
"FaceId"sv,
|
||||
"Uri"sv,
|
||||
"LocalUri"sv,
|
||||
"Origin"sv,
|
||||
"Cost"sv,
|
||||
"Capacity"sv,
|
||||
"Count"sv,
|
||||
"Flags"sv,
|
||||
"Mask"sv,
|
||||
"Strategy"sv,
|
||||
"ExpirationPeriod"sv,
|
||||
"FacePersistency"sv,
|
||||
"BaseCongestionMarkingInterval"sv,
|
||||
"DefaultCongestionThreshold"sv,
|
||||
"Mtu"sv,
|
||||
};
|
||||
|
||||
/**
|
||||
|
||||
@@ -114,12 +114,7 @@ Component::Component(uint32_t type, span<const uint8_t> value)
|
||||
ensureValid();
|
||||
}
|
||||
|
||||
Component::Component(const char* str)
|
||||
: Block(makeBinaryBlock(tlv::GenericNameComponent, str, std::char_traits<char>::length(str)))
|
||||
{
|
||||
}
|
||||
|
||||
Component::Component(const std::string& str)
|
||||
Component::Component(std::string_view str)
|
||||
: Block(makeStringBlock(tlv::GenericNameComponent, str))
|
||||
{
|
||||
}
|
||||
@@ -134,10 +129,10 @@ Component::ensureValid() const
|
||||
}
|
||||
|
||||
static Component
|
||||
parseUriEscapedValue(uint32_t type, const char* input, size_t len)
|
||||
parseUriEscapedValue(uint32_t type, std::string_view input)
|
||||
{
|
||||
std::ostringstream oss;
|
||||
unescape(oss, input, len);
|
||||
unescape(oss, input);
|
||||
std::string value = oss.str();
|
||||
if (value.find_first_not_of('.') == std::string::npos) { // all periods
|
||||
if (value.size() < 3) {
|
||||
@@ -149,25 +144,23 @@ parseUriEscapedValue(uint32_t type, const char* input, size_t len)
|
||||
}
|
||||
|
||||
Component
|
||||
Component::fromEscapedString(const std::string& input)
|
||||
Component::fromEscapedString(std::string_view input)
|
||||
{
|
||||
size_t equalPos = input.find('=');
|
||||
if (equalPos == std::string::npos) {
|
||||
return parseUriEscapedValue(tlv::GenericNameComponent, input.data(), input.size());
|
||||
if (equalPos == std::string_view::npos) {
|
||||
return parseUriEscapedValue(tlv::GenericNameComponent, input);
|
||||
}
|
||||
|
||||
auto typePrefix = input.substr(0, equalPos);
|
||||
auto type = std::strtoul(typePrefix.data(), nullptr, 10);
|
||||
if (type >= tlv::NameComponentMin && type <= tlv::NameComponentMax &&
|
||||
std::to_string(type) == typePrefix) {
|
||||
size_t valuePos = equalPos + 1;
|
||||
return parseUriEscapedValue(static_cast<uint32_t>(type),
|
||||
input.data() + valuePos, input.size() - valuePos);
|
||||
return parseUriEscapedValue(static_cast<uint32_t>(type), input.substr(equalPos + 1));
|
||||
}
|
||||
|
||||
auto ct = getComponentTypeTable().findByUriPrefix(typePrefix);
|
||||
if (ct == nullptr) {
|
||||
NDN_THROW(Error("Unknown TLV-TYPE '" + typePrefix + "' in NameComponent URI"));
|
||||
NDN_THROW(Error("Unknown TLV-TYPE '" + std::string(typePrefix) + "' in NameComponent URI"));
|
||||
}
|
||||
return ct->parseAltUriValue(input.substr(equalPos + 1));
|
||||
}
|
||||
|
||||
@@ -193,21 +193,13 @@ public: // constructors
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Construct a GenericNameComponent, copying the TLV-VALUE from a null-terminated string.
|
||||
*
|
||||
* Bytes from the string are copied as is, and not interpreted as URI component.
|
||||
*/
|
||||
explicit
|
||||
Component(const char* str);
|
||||
|
||||
/**
|
||||
* @brief Construct a GenericNameComponent, copying the TLV-VALUE from a string.
|
||||
*
|
||||
* Bytes from the string are copied as is, and not interpreted as URI component.
|
||||
*/
|
||||
explicit
|
||||
Component(const std::string& str);
|
||||
Component(std::string_view str);
|
||||
|
||||
public: // encoding and URI
|
||||
/**
|
||||
@@ -235,11 +227,13 @@ public: // encoding and URI
|
||||
* The URI component is read from `[input+beginOffset, input+endOffset)` range.
|
||||
*
|
||||
* @throw Error URI component does not represent a valid NameComponent.
|
||||
* @deprecated Use fromEscapedString(std::string_view)
|
||||
*/
|
||||
[[deprecated("use the string_view overload")]]
|
||||
static Component
|
||||
fromEscapedString(const char* input, size_t beginOffset, size_t endOffset)
|
||||
{
|
||||
return fromEscapedString(std::string(input + beginOffset, input + endOffset));
|
||||
return fromEscapedString(std::string_view(input + beginOffset, endOffset - beginOffset));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -247,17 +241,7 @@ public: // encoding and URI
|
||||
* @throw Error URI component does not represent a valid NameComponent.
|
||||
*/
|
||||
static Component
|
||||
fromEscapedString(const char* input)
|
||||
{
|
||||
return fromEscapedString(std::string(input));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Decode NameComponent from a URI component.
|
||||
* @throw Error URI component does not represent a valid NameComponent.
|
||||
*/
|
||||
static Component
|
||||
fromEscapedString(const std::string& input);
|
||||
fromEscapedString(std::string_view input);
|
||||
|
||||
/**
|
||||
* @brief Write `*this` to the output stream, escaping characters according to the NDN URI format.
|
||||
|
||||
+19
-24
@@ -60,52 +60,47 @@ Name::Name(const Block& wire)
|
||||
m_wire.parse();
|
||||
}
|
||||
|
||||
Name::Name(const char* uri)
|
||||
: Name(std::string(uri))
|
||||
{
|
||||
}
|
||||
|
||||
Name::Name(std::string uri)
|
||||
Name::Name(std::string_view uri)
|
||||
{
|
||||
if (uri.empty())
|
||||
return;
|
||||
|
||||
if (size_t iColon = uri.find(':'); iColon != std::string::npos) {
|
||||
// Make sure the colon came before a '/'.
|
||||
if (size_t iColon = uri.find(':'); iColon != std::string_view::npos) {
|
||||
// Make sure the colon came before a '/', if any.
|
||||
size_t iFirstSlash = uri.find('/');
|
||||
if (iFirstSlash == std::string::npos || iColon < iFirstSlash) {
|
||||
// Omit the leading protocol such as ndn:
|
||||
uri.erase(0, iColon + 1);
|
||||
if (iFirstSlash == std::string_view::npos || iColon < iFirstSlash) {
|
||||
// Strip the leading protocol such as "ndn:".
|
||||
uri.remove_prefix(iColon + 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Trim the leading slash and possibly the authority.
|
||||
if (uri[0] == '/') {
|
||||
if (uri.size() >= 1 && uri[0] == '/') {
|
||||
if (uri.size() >= 2 && uri[1] == '/') {
|
||||
// Strip the authority following "//".
|
||||
size_t iAfterAuthority = uri.find('/', 2);
|
||||
if (iAfterAuthority == std::string::npos)
|
||||
if (iAfterAuthority == std::string_view::npos) {
|
||||
// Unusual case: there was only an authority.
|
||||
return;
|
||||
}
|
||||
else {
|
||||
uri.erase(0, iAfterAuthority + 1);
|
||||
uri.remove_prefix(iAfterAuthority + 1);
|
||||
}
|
||||
}
|
||||
else {
|
||||
uri.erase(0, 1);
|
||||
uri.remove_prefix(1);
|
||||
}
|
||||
}
|
||||
|
||||
size_t iComponentStart = 0;
|
||||
|
||||
// Unescape the components.
|
||||
while (iComponentStart < uri.size()) {
|
||||
size_t iComponentEnd = uri.find('/', iComponentStart);
|
||||
if (iComponentEnd == std::string::npos)
|
||||
iComponentEnd = uri.size();
|
||||
|
||||
append(Component::fromEscapedString(&uri[0], iComponentStart, iComponentEnd));
|
||||
iComponentStart = iComponentEnd + 1;
|
||||
while (!uri.empty()) {
|
||||
auto component = uri.substr(0, uri.find('/'));
|
||||
append(Component::fromEscapedString(component));
|
||||
if (component.size() + 1 >= uri.size()) {
|
||||
// We reached the end of the string.
|
||||
return;
|
||||
}
|
||||
uri.remove_prefix(component.size() + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
+37
-20
@@ -64,34 +64,51 @@ public: // nested types
|
||||
using size_type = component_container::size_type;
|
||||
|
||||
public: // constructors, encoding, decoding
|
||||
/** @brief Create an empty name.
|
||||
* @post empty() == true
|
||||
/**
|
||||
* @brief Create an empty name.
|
||||
* @post empty() == true
|
||||
*/
|
||||
Name();
|
||||
|
||||
/** @brief Decode Name from wire encoding.
|
||||
* @throw tlv::Error wire encoding is invalid
|
||||
/**
|
||||
* @brief Decode Name from wire encoding.
|
||||
* @throw tlv::Error wire encoding is invalid
|
||||
*
|
||||
* This is a more efficient equivalent for
|
||||
* @code
|
||||
* Name name;
|
||||
* name.wireDecode(wire);
|
||||
* @endcode
|
||||
* This is a more efficient equivalent for:
|
||||
* @code
|
||||
* Name name;
|
||||
* name.wireDecode(wire);
|
||||
* @endcode
|
||||
*/
|
||||
explicit
|
||||
Name(const Block& wire);
|
||||
|
||||
/** @brief Parse name from NDN URI.
|
||||
* @param uri a null-terminated URI string
|
||||
* @sa https://docs.named-data.net/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
|
||||
/**
|
||||
* @brief Create name from NDN URI.
|
||||
* @sa https://docs.named-data.net/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
|
||||
*/
|
||||
Name(const char* uri);
|
||||
explicit
|
||||
Name(std::string_view uri);
|
||||
|
||||
/** @brief Create name from NDN URI.
|
||||
* @param uri a URI string
|
||||
* @sa https://docs.named-data.net/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
|
||||
/**
|
||||
* @brief Create name from NDN URI.
|
||||
* @sa https://docs.named-data.net/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
|
||||
* @note This constructor enables implicit conversion from a string literal
|
||||
*/
|
||||
Name(std::string uri);
|
||||
Name(const char* uri)
|
||||
: Name(std::string_view(uri))
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Create name from NDN URI.
|
||||
* @sa https://docs.named-data.net/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
|
||||
* @note This constructor enables implicit conversion from `std::string`
|
||||
*/
|
||||
Name(const std::string& uri)
|
||||
: Name(std::string_view(uri))
|
||||
{
|
||||
}
|
||||
|
||||
/** @brief Write URI representation of the name to the output stream.
|
||||
* @sa https://docs.named-data.net/NDN-packet-spec/0.3/name.html#ndn-uri-scheme
|
||||
@@ -510,10 +527,10 @@ public: // modifiers
|
||||
* @return A reference to this Name, to allow chaining.
|
||||
*/
|
||||
Name&
|
||||
appendKeyword(const char* keyword)
|
||||
appendKeyword(std::string_view keyword)
|
||||
{
|
||||
return append(Component(tlv::KeywordNameComponent, {reinterpret_cast<const uint8_t*>(keyword),
|
||||
std::char_traits<char>::length(keyword)}));
|
||||
return append(Component(tlv::KeywordNameComponent,
|
||||
{reinterpret_cast<const uint8_t*>(keyword.data()), keyword.size()}));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -89,8 +89,7 @@ public:
|
||||
* in hexadecimal notation, with colons or hyphens as separators.
|
||||
*
|
||||
* \param str The string to be parsed
|
||||
* \return Always an instance of Address, which will be null
|
||||
* if the parsing fails
|
||||
* \return Always an instance of Address, which will be null if parsing fails
|
||||
*/
|
||||
static Address
|
||||
fromString(const std::string& str);
|
||||
|
||||
+19
-25
@@ -43,35 +43,30 @@ namespace ndn {
|
||||
|
||||
BOOST_CONCEPT_ASSERT((boost::EqualityComparable<FaceUri>));
|
||||
|
||||
FaceUri::FaceUri()
|
||||
: m_isV6(false)
|
||||
{
|
||||
}
|
||||
FaceUri::FaceUri() = default;
|
||||
|
||||
FaceUri::FaceUri(const std::string& uri)
|
||||
{
|
||||
if (!parse(uri)) {
|
||||
NDN_THROW(Error("Malformed URI: " + uri));
|
||||
NDN_THROW(Error("Malformed URI: "s + uri));
|
||||
}
|
||||
}
|
||||
|
||||
FaceUri::FaceUri(const char* uri)
|
||||
: FaceUri(std::string(uri))
|
||||
{
|
||||
if (!parse(uri)) {
|
||||
NDN_THROW(Error("Malformed URI: "s + uri));
|
||||
}
|
||||
}
|
||||
|
||||
bool
|
||||
FaceUri::parse(const std::string& uri)
|
||||
FaceUri::parse(std::string_view uri)
|
||||
{
|
||||
m_scheme.clear();
|
||||
m_host.clear();
|
||||
m_port.clear();
|
||||
m_path.clear();
|
||||
m_isV6 = false;
|
||||
*this = {};
|
||||
|
||||
static const std::regex protocolExp("(\\w+\\d?(\\+\\w+)?)://([^/]*)(\\/[^?]*)?");
|
||||
std::smatch protocolMatch;
|
||||
if (!std::regex_match(uri, protocolMatch, protocolExp)) {
|
||||
std::match_results<std::string_view::const_iterator> protocolMatch;
|
||||
if (!std::regex_match(uri.begin(), uri.end(), protocolMatch, protocolExp)) {
|
||||
return false;
|
||||
}
|
||||
m_scheme = protocolMatch[1];
|
||||
@@ -133,7 +128,7 @@ FaceUri::FaceUri(const boost::asio::ip::tcp::endpoint& endpoint)
|
||||
m_port = to_string(endpoint.port());
|
||||
}
|
||||
|
||||
FaceUri::FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, const std::string& scheme)
|
||||
FaceUri::FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, std::string_view scheme)
|
||||
{
|
||||
m_isV6 = endpoint.address().is_v6();
|
||||
m_scheme = scheme;
|
||||
@@ -145,11 +140,17 @@ FaceUri::FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, const std::stri
|
||||
FaceUri::FaceUri(const boost::asio::local::stream_protocol::endpoint& endpoint)
|
||||
: m_scheme("unix")
|
||||
, m_path(endpoint.path())
|
||||
, m_isV6(false)
|
||||
{
|
||||
}
|
||||
#endif // BOOST_ASIO_HAS_LOCAL_SOCKETS
|
||||
|
||||
FaceUri::FaceUri(const ethernet::Address& address)
|
||||
: m_scheme("ether")
|
||||
, m_host(address.toString())
|
||||
, m_isV6(true)
|
||||
{
|
||||
}
|
||||
|
||||
FaceUri
|
||||
FaceUri::fromFd(int fd)
|
||||
{
|
||||
@@ -159,15 +160,8 @@ FaceUri::fromFd(int fd)
|
||||
return uri;
|
||||
}
|
||||
|
||||
FaceUri::FaceUri(const ethernet::Address& address)
|
||||
: m_scheme("ether")
|
||||
, m_host(address.toString())
|
||||
, m_isV6(true)
|
||||
{
|
||||
}
|
||||
|
||||
FaceUri
|
||||
FaceUri::fromDev(const std::string& ifname)
|
||||
FaceUri::fromDev(std::string_view ifname)
|
||||
{
|
||||
FaceUri uri;
|
||||
uri.m_scheme = "dev";
|
||||
@@ -176,7 +170,7 @@ FaceUri::fromDev(const std::string& ifname)
|
||||
}
|
||||
|
||||
FaceUri
|
||||
FaceUri::fromUdpDev(const boost::asio::ip::udp::endpoint& endpoint, const std::string& ifname)
|
||||
FaceUri::fromUdpDev(const boost::asio::ip::udp::endpoint& endpoint, std::string_view ifname)
|
||||
{
|
||||
FaceUri uri;
|
||||
uri.m_scheme = endpoint.address().is_v6() ? "udp6+dev" : "udp4+dev";
|
||||
|
||||
+24
-18
@@ -51,24 +51,30 @@ public:
|
||||
using std::invalid_argument::invalid_argument;
|
||||
};
|
||||
|
||||
/// Construct an empty FaceUri.
|
||||
FaceUri();
|
||||
|
||||
/**
|
||||
* \brief Construct by parsing.
|
||||
* \param uri scheme://host[:port]/path
|
||||
* \throw FaceUri::Error if URI cannot be parsed
|
||||
* \brief Construct by parsing from a string.
|
||||
* \param uri `scheme://host[:port]/path`
|
||||
* \throw Error URI cannot be parsed
|
||||
*/
|
||||
explicit
|
||||
FaceUri(const std::string& uri);
|
||||
|
||||
// This overload is needed so that calls with string literal won't be
|
||||
// resolved to boost::asio::local::stream_protocol::endpoint overload.
|
||||
/**
|
||||
* \brief Construct by parsing from a null-terminated string.
|
||||
* \param uri `scheme://host[:port]/path`
|
||||
* \throw Error URI cannot be parsed
|
||||
* \note This overload is needed so that calls with a string literal won't be
|
||||
* resolved to the boost::asio::local::stream_protocol::endpoint overload.
|
||||
*/
|
||||
explicit
|
||||
FaceUri(const char* uri);
|
||||
|
||||
/// Exception-safe parsing.
|
||||
[[nodiscard]] bool
|
||||
parse(const std::string& uri);
|
||||
parse(std::string_view uri);
|
||||
|
||||
public: // scheme-specific construction
|
||||
/// Construct a udp4 or udp6 canonical FaceUri.
|
||||
@@ -80,7 +86,7 @@ public: // scheme-specific construction
|
||||
FaceUri(const boost::asio::ip::tcp::endpoint& endpoint);
|
||||
|
||||
/// Construct a tcp canonical FaceUri with custom scheme.
|
||||
FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, const std::string& scheme);
|
||||
FaceUri(const boost::asio::ip::tcp::endpoint& endpoint, std::string_view scheme);
|
||||
|
||||
#ifdef BOOST_ASIO_HAS_LOCAL_SOCKETS
|
||||
/// Construct a unix canonical FaceUri.
|
||||
@@ -88,21 +94,21 @@ public: // scheme-specific construction
|
||||
FaceUri(const boost::asio::local::stream_protocol::endpoint& endpoint);
|
||||
#endif // BOOST_ASIO_HAS_LOCAL_SOCKETS
|
||||
|
||||
/// Construct an fd FaceUri from a file descriptor.
|
||||
static FaceUri
|
||||
fromFd(int fd);
|
||||
|
||||
/// Construct an ether canonical FaceUri.
|
||||
explicit
|
||||
FaceUri(const ethernet::Address& address);
|
||||
|
||||
/// Construct an fd FaceUri from a file descriptor.
|
||||
static FaceUri
|
||||
fromFd(int fd);
|
||||
|
||||
/// Construct a dev FaceUri from a network device name.
|
||||
static FaceUri
|
||||
fromDev(const std::string& ifname);
|
||||
fromDev(std::string_view ifname);
|
||||
|
||||
/// Construct a udp4 or udp6 NIC-associated FaceUri from endpoint and network device name.
|
||||
static FaceUri
|
||||
fromUdpDev(const boost::asio::ip::udp::endpoint& endpoint, const std::string& ifname);
|
||||
fromUdpDev(const boost::asio::ip::udp::endpoint& endpoint, std::string_view ifname);
|
||||
|
||||
public: // getters
|
||||
/// Get scheme (protocol)
|
||||
@@ -112,7 +118,7 @@ public: // getters
|
||||
return m_scheme;
|
||||
}
|
||||
|
||||
/// Get host (domain)
|
||||
/// Get host (domain or address)
|
||||
const std::string&
|
||||
getHost() const
|
||||
{
|
||||
@@ -133,7 +139,7 @@ public: // getters
|
||||
return m_path;
|
||||
}
|
||||
|
||||
/// Serialize as a string
|
||||
/// Return string representation
|
||||
std::string
|
||||
toString() const;
|
||||
|
||||
@@ -156,8 +162,9 @@ public: // canonical FaceUri
|
||||
using CanonizeFailureCallback = std::function<void(const std::string& reason)>;
|
||||
|
||||
/** \brief Asynchronously convert this FaceUri to canonical form.
|
||||
* \param onSuccess function to call after this FaceUri is converted to canonical form
|
||||
* \note A new FaceUri in canonical form will be created; this FaceUri is unchanged.
|
||||
*
|
||||
* \param onSuccess function to call after this FaceUri is converted to canonical form
|
||||
* \param onFailure function to call if this FaceUri cannot be converted to canonical form
|
||||
* \param io reference to `boost::asio::io_service` instance
|
||||
* \param timeout maximum allowable duration of the operations.
|
||||
@@ -195,8 +202,7 @@ private:
|
||||
std::string m_host;
|
||||
std::string m_port;
|
||||
std::string m_path;
|
||||
/// whether to add [] around host when writing string
|
||||
bool m_isV6;
|
||||
bool m_isV6 = false; ///< whether to add [] around host when converting to string representation
|
||||
|
||||
friend std::ostream& operator<<(std::ostream& os, const FaceUri& uri);
|
||||
};
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -176,7 +176,10 @@ private:
|
||||
friend std::ostream&
|
||||
operator<<(std::ostream& os, const Identity& id)
|
||||
{
|
||||
return os << (id ? id.getName() : "(empty)");
|
||||
if (id)
|
||||
return os << id.getName();
|
||||
else
|
||||
return os << "(empty)";
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -195,7 +195,10 @@ private:
|
||||
friend std::ostream&
|
||||
operator<<(std::ostream& os, const Key& key)
|
||||
{
|
||||
return os << (key ? key.getName() : "(empty)");
|
||||
if (key)
|
||||
return os << key.getName();
|
||||
else
|
||||
return os << "(empty)";
|
||||
}
|
||||
|
||||
private:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2021 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -24,7 +24,6 @@
|
||||
#include "ndn-cxx/encoding/buffer-stream.hpp"
|
||||
#include "ndn-cxx/security/transform/base64-decode.hpp"
|
||||
#include "ndn-cxx/security/transform/buffer-source.hpp"
|
||||
#include "ndn-cxx/security/transform/digest-filter.hpp"
|
||||
#include "ndn-cxx/security/transform/stream-sink.hpp"
|
||||
|
||||
namespace ndn {
|
||||
@@ -68,34 +67,34 @@ SigningInfo::SigningInfo(const Key& key)
|
||||
this->setPibKey(key);
|
||||
}
|
||||
|
||||
SigningInfo::SigningInfo(const std::string& signingStr)
|
||||
SigningInfo::SigningInfo(std::string_view signingStr)
|
||||
: SigningInfo(SIGNER_TYPE_NULL)
|
||||
{
|
||||
if (signingStr.empty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
size_t pos = signingStr.find(':');
|
||||
if (pos == std::string::npos) {
|
||||
auto pos = signingStr.find(':');
|
||||
if (pos == std::string_view::npos) {
|
||||
NDN_THROW(std::invalid_argument("Invalid signing string cannot represent SigningInfo"));
|
||||
}
|
||||
|
||||
std::string scheme = signingStr.substr(0, pos);
|
||||
std::string nameArg = signingStr.substr(pos + 1);
|
||||
auto scheme = signingStr.substr(0, pos);
|
||||
auto nameArg = signingStr.substr(pos + 1);
|
||||
|
||||
if (scheme == "id") {
|
||||
if (nameArg == getDigestSha256Identity().toUri()) {
|
||||
setSha256Signing();
|
||||
}
|
||||
else {
|
||||
setSigningIdentity(nameArg);
|
||||
setSigningIdentity(Name(nameArg));
|
||||
}
|
||||
}
|
||||
else if (scheme == "key") {
|
||||
setSigningKeyName(nameArg);
|
||||
setSigningKeyName(Name(nameArg));
|
||||
}
|
||||
else if (scheme == "cert") {
|
||||
setSigningCertName(nameArg);
|
||||
setSigningCertName(Name(nameArg));
|
||||
}
|
||||
else if (scheme == "hmac-sha256") {
|
||||
setSigningHmacKey(nameArg);
|
||||
@@ -133,7 +132,7 @@ SigningInfo::setSigningCertName(const Name& certificateName)
|
||||
}
|
||||
|
||||
SigningInfo&
|
||||
SigningInfo::setSigningHmacKey(const std::string& hmacKey)
|
||||
SigningInfo::setSigningHmacKey(std::string_view hmacKey)
|
||||
{
|
||||
m_type = SIGNER_TYPE_HMAC;
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -114,7 +114,7 @@ public:
|
||||
* - sign with SHA-256 (digest only): `id:/localhost/identity/digest-sha256`
|
||||
*/
|
||||
explicit
|
||||
SigningInfo(const std::string& signingStr);
|
||||
SigningInfo(std::string_view signingStr);
|
||||
|
||||
/**
|
||||
* @brief Set signer as an identity with name @p identity
|
||||
@@ -142,7 +142,7 @@ public:
|
||||
* @post Change the signerType to SIGNER_TYPE_HMAC
|
||||
*/
|
||||
SigningInfo&
|
||||
setSigningHmacKey(const std::string& hmacKey);
|
||||
setSigningHmacKey(std::string_view hmacKey);
|
||||
|
||||
/**
|
||||
* @brief Set SHA-256 as the signing method
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -30,7 +30,7 @@ BufferSource::BufferSource(span<const uint8_t> buffer)
|
||||
{
|
||||
}
|
||||
|
||||
BufferSource::BufferSource(const std::string& string)
|
||||
BufferSource::BufferSource(std::string_view string)
|
||||
: m_bufs({{reinterpret_cast<const uint8_t*>(string.data()), string.size()}})
|
||||
{
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -23,7 +23,6 @@
|
||||
#define NDN_CXX_SECURITY_TRANSFORM_BUFFER_SOURCE_HPP
|
||||
|
||||
#include "ndn-cxx/security/transform/transform-base.hpp"
|
||||
#include "ndn-cxx/encoding/buffer.hpp"
|
||||
#include "ndn-cxx/security/security-common.hpp"
|
||||
|
||||
namespace ndn {
|
||||
@@ -50,7 +49,7 @@ public:
|
||||
* Caller must not destroy the string before the transformation is completed.
|
||||
*/
|
||||
explicit
|
||||
BufferSource(const std::string& string);
|
||||
BufferSource(std::string_view string);
|
||||
|
||||
/**
|
||||
* @brief Take @p buffers as input.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2021 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -22,8 +22,6 @@
|
||||
#include "ndn-cxx/security/validator-config/checker.hpp"
|
||||
#include "ndn-cxx/security/validation-policy.hpp"
|
||||
#include "ndn-cxx/security/validation-state.hpp"
|
||||
#include "ndn-cxx/security/verification-helpers.hpp"
|
||||
#include "ndn-cxx/security/pib/key.hpp"
|
||||
|
||||
#include <boost/algorithm/string/predicate.hpp>
|
||||
|
||||
@@ -147,8 +145,8 @@ RegexChecker::checkNames(const Name& pktName, const Name& klName)
|
||||
}
|
||||
|
||||
HyperRelationChecker::HyperRelationChecker(tlv::SignatureTypeValue sigType,
|
||||
const std::string& pktNameExpr, const std::string pktNameExpand,
|
||||
const std::string& klNameExpr, const std::string klNameExpand,
|
||||
const std::string& pktNameExpr, const std::string& pktNameExpand,
|
||||
const std::string& klNameExpr, const std::string& klNameExpand,
|
||||
const NameRelation& hyperRelation)
|
||||
: Checker(sigType)
|
||||
, m_hyperPRegex(pktNameExpr, pktNameExpand)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -170,8 +170,8 @@ class HyperRelationChecker : public Checker
|
||||
{
|
||||
public:
|
||||
HyperRelationChecker(tlv::SignatureTypeValue sigType,
|
||||
const std::string& pktNameExpr, const std::string pktNameExpand,
|
||||
const std::string& klNameExpr, const std::string klNameExpand,
|
||||
const std::string& pktNameExpr, const std::string& pktNameExpand,
|
||||
const std::string& klNameExpr, const std::string& klNameExpand,
|
||||
const NameRelation& hyperRelation);
|
||||
|
||||
protected:
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -21,6 +21,7 @@
|
||||
|
||||
#include "ndn-cxx/transport/tcp-transport.hpp"
|
||||
#include "ndn-cxx/transport/detail/stream-transport-with-resolver-impl.hpp"
|
||||
|
||||
#include "ndn-cxx/net/face-uri.hpp"
|
||||
#include "ndn-cxx/util/logger.hpp"
|
||||
|
||||
@@ -29,7 +30,7 @@ NDN_LOG_INIT(ndn.TcpTransport);
|
||||
|
||||
namespace ndn {
|
||||
|
||||
TcpTransport::TcpTransport(const std::string& host, const std::string& port/* = "6363"*/)
|
||||
TcpTransport::TcpTransport(const std::string& host, const std::string& port)
|
||||
: m_host(host)
|
||||
, m_port(port)
|
||||
{
|
||||
@@ -40,8 +41,8 @@ TcpTransport::~TcpTransport() = default;
|
||||
shared_ptr<TcpTransport>
|
||||
TcpTransport::create(const std::string& uri)
|
||||
{
|
||||
const auto hostAndPort(getSocketHostAndPortFromUri(uri));
|
||||
return make_shared<TcpTransport>(hostAndPort.first, hostAndPort.second);
|
||||
auto [host, port] = getSocketHostAndPortFromUri(uri);
|
||||
return make_shared<TcpTransport>(host, port);
|
||||
}
|
||||
|
||||
std::pair<std::string, std::string>
|
||||
@@ -57,7 +58,7 @@ TcpTransport::getSocketHostAndPortFromUri(const std::string& uriString)
|
||||
try {
|
||||
const FaceUri uri(uriString);
|
||||
|
||||
const std::string scheme = uri.getScheme();
|
||||
const auto& scheme = uri.getScheme();
|
||||
if (scheme != "tcp" && scheme != "tcp4" && scheme != "tcp6") {
|
||||
NDN_THROW(Error("Cannot create TcpTransport from \"" + scheme + "\" URI"));
|
||||
}
|
||||
@@ -65,7 +66,6 @@ TcpTransport::getSocketHostAndPortFromUri(const std::string& uriString)
|
||||
if (!uri.getHost().empty()) {
|
||||
host = uri.getHost();
|
||||
}
|
||||
|
||||
if (!uri.getPort().empty()) {
|
||||
port = uri.getPort();
|
||||
}
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -22,7 +22,6 @@
|
||||
#include "ndn-cxx/transport/unix-transport.hpp"
|
||||
#include "ndn-cxx/transport/detail/stream-transport-impl.hpp"
|
||||
|
||||
#include "ndn-cxx/face.hpp"
|
||||
#include "ndn-cxx/net/face-uri.hpp"
|
||||
#include "ndn-cxx/util/logger.hpp"
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2018 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -30,7 +30,7 @@
|
||||
namespace ndn {
|
||||
namespace util {
|
||||
|
||||
IndentedStream::IndentedStream(std::ostream& os, const std::string& indent)
|
||||
IndentedStream::IndentedStream(std::ostream& os, std::string_view indent)
|
||||
: std::ostream(&m_buffer)
|
||||
, m_buffer(os, indent)
|
||||
{
|
||||
@@ -41,7 +41,7 @@ IndentedStream::~IndentedStream()
|
||||
flush();
|
||||
}
|
||||
|
||||
IndentedStream::StreamBuf::StreamBuf(std::ostream& os, const std::string& indent)
|
||||
IndentedStream::StreamBuf::StreamBuf(std::ostream& os, std::string_view indent)
|
||||
: m_output(os)
|
||||
, m_indent(indent)
|
||||
{
|
||||
@@ -50,9 +50,9 @@ IndentedStream::StreamBuf::StreamBuf(std::ostream& os, const std::string& indent
|
||||
int
|
||||
IndentedStream::StreamBuf::sync()
|
||||
{
|
||||
typedef boost::iterator_range<std::string::const_iterator> StringView;
|
||||
using StringView = boost::iterator_range<std::string::const_iterator>;
|
||||
|
||||
const std::string& output = str();
|
||||
std::string output = str();
|
||||
std::vector<StringView> splitOutput;
|
||||
boost::split(splitOutput, output, boost::is_any_of("\n"));
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2021 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -54,7 +54,7 @@ namespace util {
|
||||
class IndentedStream : public std::ostream
|
||||
{
|
||||
public:
|
||||
IndentedStream(std::ostream& os, const std::string& indent);
|
||||
IndentedStream(std::ostream& os, std::string_view indent);
|
||||
|
||||
~IndentedStream() override;
|
||||
|
||||
@@ -63,7 +63,7 @@ private:
|
||||
class StreamBuf : public std::stringbuf
|
||||
{
|
||||
public:
|
||||
StreamBuf(std::ostream& os, const std::string& indent);
|
||||
StreamBuf(std::ostream& os, std::string_view indent);
|
||||
|
||||
int
|
||||
sync() override;
|
||||
|
||||
+16
-24
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -22,8 +22,6 @@
|
||||
#include "ndn-cxx/util/logger.hpp"
|
||||
#include "ndn-cxx/util/logging.hpp"
|
||||
|
||||
#include <cstring> // for std::strspn()
|
||||
|
||||
namespace ndn {
|
||||
namespace util {
|
||||
|
||||
@@ -49,11 +47,11 @@ operator<<(std::ostream& os, LogLevel level)
|
||||
return os << "ALL";
|
||||
}
|
||||
|
||||
NDN_THROW(std::invalid_argument("unknown log level " + to_string(to_underlying(level))));
|
||||
NDN_THROW(std::invalid_argument("unknown log level " + std::to_string(to_underlying(level))));
|
||||
}
|
||||
|
||||
LogLevel
|
||||
parseLogLevel(const std::string& s)
|
||||
parseLogLevel(std::string_view s)
|
||||
{
|
||||
if (s == "FATAL")
|
||||
return LogLevel::FATAL;
|
||||
@@ -72,24 +70,19 @@ parseLogLevel(const std::string& s)
|
||||
else if (s == "ALL")
|
||||
return LogLevel::ALL;
|
||||
|
||||
NDN_THROW(std::invalid_argument("unrecognized log level '" + s + "'"));
|
||||
NDN_THROW(std::invalid_argument("unrecognized log level '" + std::string(s) + "'"));
|
||||
}
|
||||
|
||||
static bool
|
||||
isValidLoggerName(const std::string& name)
|
||||
static constexpr bool
|
||||
isValidLoggerName(std::string_view name)
|
||||
{
|
||||
if (name.empty() || name.front() == '.' || name.back() == '.' ||
|
||||
name.find("..") != std::string_view::npos) {
|
||||
return false;
|
||||
}
|
||||
// acceptable characters for Logger name
|
||||
const char* okChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~#%_<>.-";
|
||||
if (std::strspn(name.c_str(), okChars) != name.size()) {
|
||||
return false;
|
||||
}
|
||||
if (name.empty() || name.front() == '.' || name.back() == '.') {
|
||||
return false;
|
||||
}
|
||||
if (name.find("..") != std::string::npos) {
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
constexpr std::string_view okChars{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789~#%_<>.-"sv};
|
||||
return name.find_first_not_of(okChars) == std::string_view::npos;
|
||||
}
|
||||
|
||||
Logger::Logger(const char* name)
|
||||
@@ -99,18 +92,17 @@ Logger::Logger(const char* name)
|
||||
NDN_THROW(std::invalid_argument("Logger name '" + m_moduleName + "' is invalid"));
|
||||
}
|
||||
this->setLevel(LogLevel::NONE);
|
||||
this->add_attribute(log::module.get_name(), boost::log::attributes::constant<std::string>(m_moduleName));
|
||||
this->add_attribute(log::module.get_name(), boost::log::attributes::constant(m_moduleName));
|
||||
Logging::get().addLoggerImpl(*this);
|
||||
}
|
||||
|
||||
void
|
||||
Logger::registerModuleName(const char* name)
|
||||
{
|
||||
std::string moduleName(name);
|
||||
if (!isValidLoggerName(moduleName)) {
|
||||
NDN_THROW(std::invalid_argument("Logger name '" + moduleName + "' is invalid"));
|
||||
if (!isValidLoggerName(name)) {
|
||||
NDN_THROW(std::invalid_argument("Logger name '"s + name + "' is invalid"));
|
||||
}
|
||||
Logging::get().registerLoggerNameImpl(std::move(moduleName));
|
||||
Logging::get().registerLoggerNameImpl(name);
|
||||
}
|
||||
|
||||
} // namespace util
|
||||
|
||||
+14
-10
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2021 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -37,7 +37,8 @@
|
||||
namespace ndn {
|
||||
namespace util {
|
||||
|
||||
/** \brief Indicates the severity level of a log message.
|
||||
/**
|
||||
* \brief Indicates the severity level of a log message.
|
||||
*/
|
||||
enum class LogLevel {
|
||||
FATAL = -1, ///< fatal (will be logged unconditionally)
|
||||
@@ -50,17 +51,19 @@ enum class LogLevel {
|
||||
ALL = 255 ///< all messages
|
||||
};
|
||||
|
||||
/** \brief Output LogLevel as a string.
|
||||
* \throw std::invalid_argument unknown \p level
|
||||
/**
|
||||
* \brief Output LogLevel as a string.
|
||||
* \throw std::invalid_argument Unknown \p level
|
||||
*/
|
||||
std::ostream&
|
||||
operator<<(std::ostream& os, LogLevel level);
|
||||
|
||||
/** \brief Parse LogLevel from a string.
|
||||
* \throw std::invalid_argument unknown level name
|
||||
/**
|
||||
* \brief Parse LogLevel from a string.
|
||||
* \throw std::invalid_argument Unknown level name
|
||||
*/
|
||||
LogLevel
|
||||
parseLogLevel(const std::string& s);
|
||||
parseLogLevel(std::string_view s);
|
||||
|
||||
namespace log {
|
||||
|
||||
@@ -69,10 +72,11 @@ BOOST_LOG_ATTRIBUTE_KEYWORD(severity, "Severity", LogLevel)
|
||||
|
||||
} // namespace log
|
||||
|
||||
/** \brief Represents a log module in the logging facility.
|
||||
/**
|
||||
* \brief Represents a log module in the logging facility.
|
||||
*
|
||||
* \note Normally, loggers should be defined using #NDN_LOG_INIT, #NDN_LOG_MEMBER_INIT,
|
||||
* or #NDN_LOG_MEMBER_INIT_SPECIALIZED.
|
||||
* \note Normally, loggers should be defined using #NDN_LOG_INIT, #NDN_LOG_MEMBER_INIT,
|
||||
* or #NDN_LOG_MEMBER_INIT_SPECIALIZED.
|
||||
*/
|
||||
class Logger : public boost::log::sources::severity_logger_mt<LogLevel>
|
||||
{
|
||||
|
||||
@@ -92,7 +92,7 @@ Sha256::operator<<(Sha256& src)
|
||||
}
|
||||
|
||||
Sha256&
|
||||
Sha256::operator<<(const std::string& str)
|
||||
Sha256::operator<<(std::string_view str)
|
||||
{
|
||||
update({reinterpret_cast<const uint8_t*>(str.data()), str.size()});
|
||||
return *this;
|
||||
|
||||
@@ -122,7 +122,7 @@ public:
|
||||
* @throw Error the digest has already been finalized
|
||||
*/
|
||||
Sha256&
|
||||
operator<<(const std::string& str);
|
||||
operator<<(std::string_view str);
|
||||
|
||||
/**
|
||||
* @brief Add a uint64_t value to the digest calculation.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2021 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -57,7 +57,7 @@ toHex(span<const uint8_t> buffer, bool wantUpperCase)
|
||||
}
|
||||
|
||||
shared_ptr<Buffer>
|
||||
fromHex(const std::string& hexString)
|
||||
fromHex(std::string_view hexString)
|
||||
{
|
||||
namespace tr = security::transform;
|
||||
|
||||
@@ -73,18 +73,17 @@ fromHex(const std::string& hexString)
|
||||
}
|
||||
|
||||
std::string
|
||||
escape(const std::string& str)
|
||||
escape(std::string_view str)
|
||||
{
|
||||
std::ostringstream os;
|
||||
escape(os, str.data(), str.size());
|
||||
escape(os, str);
|
||||
return os.str();
|
||||
}
|
||||
|
||||
void
|
||||
escape(std::ostream& os, const char* str, size_t len)
|
||||
escape(std::ostream& os, std::string_view str)
|
||||
{
|
||||
for (size_t i = 0; i < len; ++i) {
|
||||
auto c = str[i];
|
||||
for (auto c : str) {
|
||||
// Unreserved characters don't need to be escaped.
|
||||
if ((c >= 'a' && c <= 'z') ||
|
||||
(c >= 'A' && c <= 'Z') ||
|
||||
@@ -102,18 +101,18 @@ escape(std::ostream& os, const char* str, size_t len)
|
||||
}
|
||||
|
||||
std::string
|
||||
unescape(const std::string& str)
|
||||
unescape(std::string_view str)
|
||||
{
|
||||
std::ostringstream os;
|
||||
unescape(os, str.data(), str.size());
|
||||
unescape(os, str);
|
||||
return os.str();
|
||||
}
|
||||
|
||||
void
|
||||
unescape(std::ostream& os, const char* str, size_t len)
|
||||
unescape(std::ostream& os, std::string_view str)
|
||||
{
|
||||
for (size_t i = 0; i < len; ++i) {
|
||||
if (str[i] == '%' && i + 2 < len) {
|
||||
for (size_t i = 0; i < str.size(); ++i) {
|
||||
if (str[i] == '%' && i + 2 < str.size()) {
|
||||
int hi = fromHexChar(str[i + 1]);
|
||||
int lo = fromHexChar(str[i + 2]);
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ toHex(span<const uint8_t> buffer, bool wantUpperCase = true);
|
||||
* @throw StringHelperError Input string is invalid
|
||||
*/
|
||||
shared_ptr<Buffer>
|
||||
fromHex(const std::string& hexString);
|
||||
fromHex(std::string_view hexString);
|
||||
|
||||
/**
|
||||
* @brief Convert (the least significant nibble of) @p n to the corresponding hex character.
|
||||
@@ -152,10 +152,17 @@ fromHexChar(char c) noexcept
|
||||
* @see RFC 3986 section 2
|
||||
*/
|
||||
[[nodiscard]] std::string
|
||||
escape(const std::string& str);
|
||||
escape(std::string_view str);
|
||||
|
||||
void
|
||||
escape(std::ostream& os, const char* str, size_t len);
|
||||
escape(std::ostream& os, std::string_view str);
|
||||
|
||||
[[deprecated("use the string_view overload")]]
|
||||
inline void
|
||||
escape(std::ostream& os, const char* str, size_t len)
|
||||
{
|
||||
escape(os, {str, len});
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Decode a percent-encoded string.
|
||||
@@ -172,10 +179,17 @@ escape(std::ostream& os, const char* str, size_t len);
|
||||
* @see RFC 3986 section 2
|
||||
*/
|
||||
[[nodiscard]] std::string
|
||||
unescape(const std::string& str);
|
||||
unescape(std::string_view str);
|
||||
|
||||
void
|
||||
unescape(std::ostream& os, const char* str, size_t len);
|
||||
unescape(std::ostream& os, std::string_view str);
|
||||
|
||||
[[deprecated("use the string_view overload")]]
|
||||
inline void
|
||||
unescape(std::ostream& os, const char* str, size_t len)
|
||||
{
|
||||
unescape(os, {str, len});
|
||||
}
|
||||
|
||||
} // namespace ndn
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -46,7 +46,6 @@ class PibDirFixture
|
||||
{
|
||||
public:
|
||||
PibDirFixture()
|
||||
: m_pibDir(Path().PATH)
|
||||
{
|
||||
if (std::getenv("NDN_CLIENT_PIB") != nullptr) {
|
||||
m_oldPib = std::getenv("NDN_CLIENT_PIB");
|
||||
@@ -81,7 +80,7 @@ public:
|
||||
}
|
||||
|
||||
protected:
|
||||
const std::string m_pibDir;
|
||||
const std::string m_pibDir{Path::PATH};
|
||||
|
||||
private:
|
||||
std::string m_oldPib;
|
||||
@@ -119,7 +118,7 @@ public:
|
||||
|
||||
struct DefaultPibDir
|
||||
{
|
||||
const std::string PATH = "build/keys";
|
||||
static constexpr std::string_view PATH{"build/keys"};
|
||||
};
|
||||
|
||||
} // namespace tests
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -31,6 +31,13 @@ namespace tests {
|
||||
BOOST_AUTO_TEST_SUITE(Encoding)
|
||||
BOOST_AUTO_TEST_SUITE(TestBlockHelpers)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(Empty)
|
||||
{
|
||||
Block b = makeEmptyBlock(200);
|
||||
BOOST_CHECK_EQUAL(b.type(), 200);
|
||||
BOOST_CHECK_EQUAL(b.value_size(), 0);
|
||||
}
|
||||
|
||||
enum E8 : uint8_t
|
||||
{
|
||||
E8_NONE
|
||||
@@ -69,21 +76,6 @@ BOOST_AUTO_TEST_CASE(NonNegativeInteger)
|
||||
BOOST_CHECK_EQUAL(static_cast<uint16_t>(readNonNegativeIntegerAs<EC16>(b)), 1000);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(Empty)
|
||||
{
|
||||
Block b = makeEmptyBlock(200);
|
||||
BOOST_CHECK_EQUAL(b.type(), 200);
|
||||
BOOST_CHECK_EQUAL(b.value_size(), 0);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(String)
|
||||
{
|
||||
Block b = makeStringBlock(100, "Hello, world!");
|
||||
BOOST_CHECK_EQUAL(b.type(), 100);
|
||||
BOOST_CHECK_GT(b.value_size(), 0);
|
||||
BOOST_CHECK_EQUAL(readString(b), "Hello, world!");
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(Double)
|
||||
{
|
||||
const double f = 0.25;
|
||||
@@ -103,29 +95,41 @@ BOOST_AUTO_TEST_CASE(Double)
|
||||
|
||||
BOOST_AUTO_TEST_CASE(Binary)
|
||||
{
|
||||
std::string buf1{1, 1, 1, 1};
|
||||
const std::string buf1{1, 1, 1, 1};
|
||||
const uint8_t buf2[]{1, 1, 1, 1};
|
||||
std::list<uint8_t> buf3{1, 1, 1, 1};
|
||||
const std::list<uint8_t> buf3{1, 1, 1, 1};
|
||||
|
||||
Block b1 = makeBinaryBlock(100, buf1.data(), buf1.size()); // char* overload
|
||||
#pragma GCC diagnostic push
|
||||
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
|
||||
Block b1 = makeBinaryBlock(100, buf1.data(), buf1.size()); // char* overload (deprecated)
|
||||
#pragma GCC diagnostic pop
|
||||
Block b2 = makeBinaryBlock(100, buf2); // span overload
|
||||
Block b3 = makeBinaryBlock(100, buf1.begin(), buf1.end()); // fast encoding (random access iterator)
|
||||
Block b4 = makeBinaryBlock(100, buf3.begin(), buf3.end()); // slow encoding (general iterator)
|
||||
|
||||
BOOST_CHECK_EQUAL(b1, b2);
|
||||
BOOST_CHECK_EQUAL(b1, b3);
|
||||
BOOST_CHECK_EQUAL(b1, b4);
|
||||
BOOST_CHECK_EQUAL(b1.type(), 100);
|
||||
BOOST_CHECK_EQUAL(b1.value_size(), buf1.size());
|
||||
BOOST_CHECK_EQUAL_COLLECTIONS(b1.value_begin(), b1.value_end(), buf2, buf2 + sizeof(buf2));
|
||||
BOOST_TEST(b1 == b2);
|
||||
BOOST_TEST(b1 == b3);
|
||||
BOOST_TEST(b1 == b4);
|
||||
BOOST_TEST(b1.type() == 100);
|
||||
BOOST_TEST(b1.value_size() == sizeof(buf2));
|
||||
BOOST_TEST(b1.value_bytes() == buf2, boost::test_tools::per_element());
|
||||
|
||||
EncodingEstimator estimator;
|
||||
size_t length = prependBinaryBlock(estimator, 100, buf2);
|
||||
BOOST_CHECK_EQUAL(length, 6);
|
||||
BOOST_TEST(length == 6);
|
||||
|
||||
EncodingBuffer encoder(length, 0);
|
||||
BOOST_CHECK_EQUAL(prependBinaryBlock(encoder, 100, buf2), 6);
|
||||
BOOST_CHECK_EQUAL(encoder.block(), b1);
|
||||
BOOST_TEST(prependBinaryBlock(encoder, 100, buf2) == 6);
|
||||
BOOST_TEST(encoder.block() == b1);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(String)
|
||||
{
|
||||
constexpr std::string_view sv{"Hello, world!"sv};
|
||||
Block b = makeStringBlock(100, sv);
|
||||
BOOST_TEST(b.type() == 100);
|
||||
BOOST_TEST(b.value_size() == sv.size());
|
||||
BOOST_TEST(readString(b) == sv);
|
||||
}
|
||||
|
||||
BOOST_AUTO_TEST_CASE(PrependBlock)
|
||||
|
||||
@@ -854,11 +854,6 @@ BOOST_AUTO_TEST_SUITE(Transport)
|
||||
|
||||
using ndn::Transport;
|
||||
|
||||
struct PibDirWithDefaultTpm
|
||||
{
|
||||
const std::string PATH = "build/keys-with-default-tpm";
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(FaceTransport, IoKeyChainFixture)
|
||||
{
|
||||
BOOST_CHECK(Face().getTransport() != nullptr);
|
||||
|
||||
+11
-1
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -68,13 +68,19 @@ BOOST_AUTO_TEST_CASE(ParseUri)
|
||||
|
||||
// URI with correct scheme
|
||||
BOOST_CHECK_EQUAL(Name("ndn:/hello/world").toUri(), "/hello/world");
|
||||
BOOST_CHECK_EQUAL(Name("ndn:/").toUri(), "/");
|
||||
BOOST_CHECK_EQUAL(Name("ndn:").toUri(), "/");
|
||||
|
||||
// URI with incorrect scheme: auto-corrected
|
||||
BOOST_CHECK_EQUAL(Name("ncc:/hello/world").toUri(), "/hello/world");
|
||||
BOOST_CHECK_EQUAL(Name(":/").toUri(), "/");
|
||||
BOOST_CHECK_EQUAL(Name(":").toUri(), "/");
|
||||
|
||||
// URI with authority: authority ignored
|
||||
BOOST_CHECK_EQUAL(Name("//authority/hello/world").toUri(), "/hello/world");
|
||||
BOOST_CHECK_EQUAL(Name("ndn://authority/hello/world").toUri(), "/hello/world");
|
||||
BOOST_CHECK_EQUAL(Name("//authority").toUri(), "/");
|
||||
BOOST_CHECK_EQUAL(Name("ndn://").toUri(), "/");
|
||||
|
||||
// URI containing unescaped characters: auto-corrected
|
||||
BOOST_CHECK_EQUAL(Name("/ hello\t/\tworld \r\n").toUri(), "/%20hello%09/%09world%20%0D%0A");
|
||||
@@ -84,8 +90,12 @@ BOOST_AUTO_TEST_CASE(ParseUri)
|
||||
// URI not starting with '/': accepted as PartialName
|
||||
BOOST_CHECK_EQUAL(Name("").toUri(), "/");
|
||||
BOOST_CHECK_EQUAL(Name(" ").toUri(), "/%20");
|
||||
BOOST_CHECK_EQUAL(Name("ndn: ").toUri(), "/%20");
|
||||
BOOST_CHECK_EQUAL(Name("ndn: /").toUri(), "/%20");
|
||||
BOOST_CHECK_EQUAL(Name(" /hello/world").toUri(), "/%20%20/hello/world");
|
||||
BOOST_CHECK_EQUAL(Name("hello/world").toUri(), "/hello/world");
|
||||
BOOST_CHECK_EQUAL(Name("hello").toUri(), "/hello");
|
||||
BOOST_CHECK_EQUAL(Name("ndn:hello").toUri(), "/hello");
|
||||
|
||||
// URI ending with '/': auto-corrected
|
||||
BOOST_CHECK_EQUAL(Name("/hello/world/").toUri(), "/hello/world");
|
||||
|
||||
@@ -59,7 +59,7 @@ public:
|
||||
|
||||
struct PibPathConfigFileHome
|
||||
{
|
||||
const std::string PATH = "build/config-file-home/";
|
||||
static constexpr std::string_view PATH = "build/config-file-home/";
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ConstructorNormalConfig, TestHomeAndPibFixture<PibPathConfigFileHome>)
|
||||
@@ -74,7 +74,7 @@ BOOST_FIXTURE_TEST_CASE(ConstructorNormalConfig, TestHomeAndPibFixture<PibPathCo
|
||||
|
||||
struct PibPathConfigFileEmptyHome
|
||||
{
|
||||
const std::string PATH = "build/config-file-empty-home/";
|
||||
static constexpr std::string_view PATH = "build/config-file-empty-home/";
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ConstructorEmptyConfig, TestHomeAndPibFixture<PibPathConfigFileEmptyHome>)
|
||||
@@ -122,7 +122,7 @@ BOOST_FIXTURE_TEST_CASE(ConstructorEmptyConfig, TestHomeAndPibFixture<PibPathCon
|
||||
|
||||
struct PibPathConfigFileEmpty2Home
|
||||
{
|
||||
const std::string PATH = "build/config-file-empty2-home/";
|
||||
static constexpr std::string_view PATH = "build/config-file-empty2-home/";
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ConstructorEmptyConfig2, TestHomeAndPibFixture<PibPathConfigFileEmpty2Home>)
|
||||
@@ -137,7 +137,7 @@ BOOST_FIXTURE_TEST_CASE(ConstructorEmptyConfig2, TestHomeAndPibFixture<PibPathCo
|
||||
|
||||
struct PibPathConfigFileMalformedHome
|
||||
{
|
||||
const std::string PATH = "build/config-file-malformed-home/";
|
||||
static constexpr std::string_view PATH = "build/config-file-malformed-home/";
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ConstructorBadConfig, TestHomeAndPibFixture<PibPathConfigFileMalformedHome>)
|
||||
@@ -148,7 +148,7 @@ BOOST_FIXTURE_TEST_CASE(ConstructorBadConfig, TestHomeAndPibFixture<PibPathConfi
|
||||
|
||||
struct PibPathConfigFileMalformed2Home
|
||||
{
|
||||
const std::string PATH = "build/config-file-malformed2-home/";
|
||||
static constexpr std::string_view PATH = "build/config-file-malformed2-home/";
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ConstructorBadConfig2, TestHomeAndPibFixture<PibPathConfigFileMalformed2Home>)
|
||||
@@ -159,7 +159,7 @@ BOOST_FIXTURE_TEST_CASE(ConstructorBadConfig2, TestHomeAndPibFixture<PibPathConf
|
||||
|
||||
struct PibPathConfigFileNonCanonicalTpm
|
||||
{
|
||||
const std::string PATH = "build/config-file-non-canonical-tpm/";
|
||||
static constexpr std::string_view PATH = "build/config-file-non-canonical-tpm/";
|
||||
};
|
||||
|
||||
BOOST_FIXTURE_TEST_CASE(ConstructorNonCanonicalTpm, TestHomeAndPibFixture<PibPathConfigFileNonCanonicalTpm>) // Bug 4297
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -162,7 +162,7 @@ NDN_LOG_MEMBER_DECL_SPECIALIZED((ClassTemplateWithLogger<int, double>));
|
||||
NDN_LOG_MEMBER_INIT_SPECIALIZED((ClassTemplateWithLogger<int, double>), ndn.util.tests.Specialized1);
|
||||
NDN_LOG_MEMBER_INIT_SPECIALIZED((ClassTemplateWithLogger<int, std::string>), ndn.util.tests.Specialized2);
|
||||
|
||||
const time::microseconds LOG_SYSTIME(1468108800311239LL);
|
||||
constexpr time::microseconds LOG_SYSTIME{1468108800311239LL};
|
||||
const std::string LOG_SYSTIME_STR("1468108800.311239");
|
||||
|
||||
class LoggingFixture : public ndn::tests::ClockFixture
|
||||
@@ -177,7 +177,7 @@ protected:
|
||||
Logging::setDestination(os, true);
|
||||
}
|
||||
|
||||
~LoggingFixture()
|
||||
~LoggingFixture() override
|
||||
{
|
||||
Logging::get().setLevelImpl(m_oldEnabledLevel);
|
||||
Logging::setDestination(m_oldDestination);
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
|
||||
/*
|
||||
* Copyright (c) 2013-2022 Regents of the University of California.
|
||||
* Copyright (c) 2013-2023 Regents of the University of California.
|
||||
*
|
||||
* This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
|
||||
*
|
||||
@@ -182,8 +182,7 @@ BOOST_AUTO_TEST_CASE(Escape)
|
||||
BOOST_CHECK_EQUAL(escape(":/?#[]@"), "%3A%2F%3F%23%5B%5D%40");
|
||||
|
||||
output_test_stream os;
|
||||
const char str[] = "\x01\x2a\x3b\xc4\xde\xfa\xb5\xcd\xef";
|
||||
escape(os, str, std::strlen(str));
|
||||
escape(os, "\x01\x2a\x3b\xc4\xde\xfa\xb5\xcd\xef");
|
||||
BOOST_CHECK(os.is_equal("%01%2A%3B%C4%DE%FA%B5%CD%EF"));
|
||||
}
|
||||
|
||||
@@ -196,8 +195,7 @@ BOOST_AUTO_TEST_CASE(Unescape)
|
||||
BOOST_CHECK_EQUAL(unescape("Bad %a"), "Bad %a");
|
||||
|
||||
output_test_stream os;
|
||||
const char str[] = "%01%2a%3B%c4%de%fA%B5%Cd%EF";
|
||||
unescape(os, str, std::strlen(str));
|
||||
unescape(os, "%01%2a%3B%c4%de%fA%B5%Cd%EF");
|
||||
BOOST_CHECK(os.is_equal("\x01\x2a\x3b\xc4\xde\xfa\xb5\xcd\xef"));
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user