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
    */