fw: FaceTable iterator dereferences to Face& instead of shared_ptr
This commit also improves the speed and reliability of
Mgmt/TestFaceManager/CreateFace test suite.
refs #3205
Change-Id: Idd013488ced2d7f8072ef8a3d910f94da2e0c8ac
diff --git a/daemon/fw/face-table.cpp b/daemon/fw/face-table.cpp
index b2f1332..2d40bbc 100644
--- a/daemon/fw/face-table.cpp
+++ b/daemon/fw/face-table.cpp
@@ -120,7 +120,7 @@
FaceTable::ForwardRange
FaceTable::getForwardRange() const
{
- return m_faces | boost::adaptors::map_values;
+ return m_faces | boost::adaptors::map_values | boost::adaptors::indirected;
}
FaceTable::const_iterator
diff --git a/daemon/fw/face-table.hpp b/daemon/fw/face-table.hpp
index 19517b7..c8f93d0 100644
--- a/daemon/fw/face-table.hpp
+++ b/daemon/fw/face-table.hpp
@@ -27,6 +27,7 @@
#define NFD_DAEMON_FW_FACE_TABLE_HPP
#include "face/face.hpp"
+#include <boost/range/adaptor/indirected.hpp>
#include <boost/range/adaptor/map.hpp>
namespace nfd {
@@ -72,9 +73,9 @@
public: // enumeration
typedef std::map<FaceId, shared_ptr<Face>> FaceMap;
- typedef boost::select_second_const_range<FaceMap> ForwardRange;
+ typedef boost::indirected_range<const boost::select_second_const_range<FaceMap>> ForwardRange;
- /** \brief ForwardIterator for shared_ptr<Face>
+ /** \brief ForwardIterator for Face&
*/
typedef boost::range_iterator<ForwardRange>::type const_iterator;
diff --git a/daemon/mgmt/face-manager.cpp b/daemon/mgmt/face-manager.cpp
index ac9085c..157908c 100644
--- a/daemon/mgmt/face-manager.cpp
+++ b/daemon/mgmt/face-manager.cpp
@@ -249,8 +249,8 @@
ndn::mgmt::StatusDatasetContext& context)
{
auto now = time::steady_clock::now();
- for (const auto& face : m_faceTable) {
- ndn::nfd::FaceStatus status = collectFaceStatus(*face, now);
+ for (const Face& face : m_faceTable) {
+ ndn::nfd::FaceStatus status = collectFaceStatus(face, now);
context.append(status.wireEncode());
}
context.end();
@@ -294,11 +294,11 @@
}
auto now = time::steady_clock::now();
- for (const auto& face : m_faceTable) {
- if (!doesMatchFilter(faceFilter, face)) {
+ for (const Face& face : m_faceTable) {
+ if (!matchFilter(faceFilter, face)) {
continue;
}
- ndn::nfd::FaceStatus status = collectFaceStatus(*face, now);
+ ndn::nfd::FaceStatus status = collectFaceStatus(face, now);
context.append(status.wireEncode());
}
@@ -306,41 +306,41 @@
}
bool
-FaceManager::doesMatchFilter(const ndn::nfd::FaceQueryFilter& filter, shared_ptr<Face> face)
+FaceManager::matchFilter(const ndn::nfd::FaceQueryFilter& filter, const Face& face)
{
if (filter.hasFaceId() &&
- filter.getFaceId() != static_cast<uint64_t>(face->getId())) {
+ filter.getFaceId() != static_cast<uint64_t>(face.getId())) {
return false;
}
if (filter.hasUriScheme() &&
- filter.getUriScheme() != face->getRemoteUri().getScheme() &&
- filter.getUriScheme() != face->getLocalUri().getScheme()) {
+ filter.getUriScheme() != face.getRemoteUri().getScheme() &&
+ filter.getUriScheme() != face.getLocalUri().getScheme()) {
return false;
}
if (filter.hasRemoteUri() &&
- filter.getRemoteUri() != face->getRemoteUri().toString()) {
+ filter.getRemoteUri() != face.getRemoteUri().toString()) {
return false;
}
if (filter.hasLocalUri() &&
- filter.getLocalUri() != face->getLocalUri().toString()) {
+ filter.getLocalUri() != face.getLocalUri().toString()) {
return false;
}
if (filter.hasFaceScope() &&
- filter.getFaceScope() != face->getScope()) {
+ filter.getFaceScope() != face.getScope()) {
return false;
}
if (filter.hasFacePersistency() &&
- filter.getFacePersistency() != face->getPersistency()) {
+ filter.getFacePersistency() != face.getPersistency()) {
return false;
}
if (filter.hasLinkType() &&
- filter.getLinkType() != face->getLinkType()) {
+ filter.getLinkType() != face.getLinkType()) {
return false;
}
diff --git a/daemon/mgmt/face-manager.hpp b/daemon/mgmt/face-manager.hpp
index b97a629..aa0c05d 100644
--- a/daemon/mgmt/face-manager.hpp
+++ b/daemon/mgmt/face-manager.hpp
@@ -105,7 +105,7 @@
private: // helpers for StatusDataset handler
bool
- doesMatchFilter(const ndn::nfd::FaceQueryFilter& filter, shared_ptr<Face> face);
+ matchFilter(const ndn::nfd::FaceQueryFilter& filter, const Face& face);
/** \brief get status of face, including properties and counters
*/