table: move PIT iterator to a separate file

This commit only moves code around and renames variables.
There's no functional change.

refs #3164

Change-Id: Icb6b249cc0c07fcfe42f7a6d6987de31285566e7
This commit is contained in:
Junxiao Shi
2016-08-15 02:05:00 +00:00
parent 8ff0a86e18
commit 09cf13cd9f
4 changed files with 210 additions and 189 deletions
+72
View File
@@ -0,0 +1,72 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2016, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
* Washington University in St. Louis,
* Beijing Institute of Technology,
* The University of Memphis.
*
* This file is part of NFD (Named Data Networking Forwarding Daemon).
* See AUTHORS.md for complete list of NFD authors and contributors.
*
* NFD is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
#include "pit-iterator.hpp"
#include <boost/concept/assert.hpp>
#include <boost/concept_check.hpp>
#include <type_traits>
namespace nfd {
namespace pit {
BOOST_CONCEPT_ASSERT((boost::ForwardIterator<Iterator>));
static_assert(std::is_default_constructible<Iterator>::value,
"Iterator must be default-constructible");
Iterator::Iterator()
: m_iPitEntry(0)
{
}
Iterator::Iterator(const NameTree::const_iterator& ntIt)
: m_ntIt(ntIt)
, m_iPitEntry(0)
{
}
Iterator&
Iterator::operator++()
{
++m_iPitEntry;
if (m_iPitEntry < m_ntIt->getPitEntries().size()) {
return *this;
}
++m_ntIt;
m_iPitEntry = 0;
return *this;
}
Iterator
Iterator::operator++(int)
{
Iterator copy = *this;
this->operator++();
return copy;
}
} // namespace pit
} // namespace nfd
+86
View File
@@ -0,0 +1,86 @@
/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
* Copyright (c) 2014-2016, Regents of the University of California,
* Arizona Board of Regents,
* Colorado State University,
* University Pierre & Marie Curie, Sorbonne University,
* Washington University in St. Louis,
* Beijing Institute of Technology,
* The University of Memphis.
*
* This file is part of NFD (Named Data Networking Forwarding Daemon).
* See AUTHORS.md for complete list of NFD authors and contributors.
*
* NFD is free software: you can redistribute it and/or modify it under the terms
* of the GNU General Public License as published by the Free Software Foundation,
* either version 3 of the License, or (at your option) any later version.
*
* NFD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with
* NFD, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef NFD_DAEMON_TABLE_PIT_ITERATOR_HPP
#define NFD_DAEMON_TABLE_PIT_ITERATOR_HPP
#include "name-tree.hpp"
#include "pit-entry.hpp"
namespace nfd {
namespace pit {
/** \brief PIT iterator
*/
class Iterator : public std::iterator<std::forward_iterator_tag, const Entry>
{
public:
Iterator();
/** \brief constructor
* \param ntIt a name tree iterator that visits name tree entries with one or more PIT entries
*/
explicit
Iterator(const NameTree::const_iterator& ntIt);
const Entry&
operator*() const
{
return *this->operator->();
}
shared_ptr<Entry>
operator->() const
{
return m_ntIt->getPitEntries().at(m_iPitEntry);
}
Iterator&
operator++();
Iterator
operator++(int);
bool
operator==(const Iterator& other) const
{
return m_ntIt == other.m_ntIt && m_iPitEntry == other.m_iPitEntry;
}
bool
operator!=(const Iterator& other) const
{
return !this->operator==(other);
}
private:
NameTree::const_iterator m_ntIt; ///< current name tree entry
size_t m_iPitEntry; ///< current PIT entry within m_ntIt->getPitEntries()
};
} // namespace pit
} // namespace nfd
#endif // NFD_DAEMON_TABLE_PIT_ITERATOR_HPP
+16 -38
View File
@@ -24,40 +24,17 @@
*/
#include "pit.hpp"
#include <type_traits>
#include <boost/concept/assert.hpp>
#include <boost/concept_check.hpp>
#include <type_traits>
namespace nfd {
namespace pit {
#if HAVE_IS_MOVE_CONSTRUCTIBLE
static_assert(std::is_move_constructible<DataMatchResult>::value,
"DataMatchResult must be MoveConstructible");
#endif // HAVE_IS_MOVE_CONSTRUCTIBLE
} // namespace pit
// http://en.cppreference.com/w/cpp/concept/ForwardIterator
BOOST_CONCEPT_ASSERT((boost::ForwardIterator<Pit::const_iterator>));
// boost::ForwardIterator follows SGI standard http://www.sgi.com/tech/stl/ForwardIterator.html,
// which doesn't require DefaultConstructible
#ifdef HAVE_IS_DEFAULT_CONSTRUCTIBLE
static_assert(std::is_default_constructible<Pit::const_iterator>::value,
"Pit::const_iterator must be default-constructible");
#else
BOOST_CONCEPT_ASSERT((boost::DefaultConstructible<Pit::const_iterator>));
#endif // HAVE_IS_DEFAULT_CONSTRUCTIBLE
Pit::Pit(NameTree& nameTree)
: m_nameTree(nameTree)
, m_nItems(0)
{
}
std::pair<shared_ptr<pit::Entry>, bool>
std::pair<shared_ptr<Entry>, bool>
Pit::findOrInsert(const Interest& interest, bool allowInsert)
{
// determine which NameTree entry should the PIT entry be attached onto
@@ -79,9 +56,9 @@ Pit::findOrInsert(const Interest& interest, bool allowInsert)
// check if PIT entry already exists
size_t nteNameLen = nteName.size();
const std::vector<shared_ptr<pit::Entry>>& pitEntries = nte->getPitEntries();
const std::vector<shared_ptr<Entry>>& pitEntries = nte->getPitEntries();
auto it = std::find_if(pitEntries.begin(), pitEntries.end(),
[&interest, nteNameLen] (const shared_ptr<pit::Entry>& entry) -> bool {
[&interest, nteNameLen] (const shared_ptr<Entry>& entry) -> bool {
// initial part of the name is guaranteed to be the same
BOOST_ASSERT(entry->getInterest().getName().compare(0, nteNameLen,
interest.getName(), 0, nteNameLen) == 0);
@@ -99,21 +76,21 @@ Pit::findOrInsert(const Interest& interest, bool allowInsert)
return {nullptr, true};
}
auto entry = make_shared<pit::Entry>(interest);
auto entry = make_shared<Entry>(interest);
nte->insertPitEntry(entry);
++m_nItems;
return {entry, true};
}
pit::DataMatchResult
DataMatchResult
Pit::findAllDataMatches(const Data& data) const
{
auto&& ntMatches = m_nameTree.findAllMatches(data.getName(),
[] (const name_tree::Entry& entry) { return entry.hasPitEntries(); });
pit::DataMatchResult matches;
DataMatchResult matches;
for (const name_tree::Entry& nte : ntMatches) {
for (const shared_ptr<pit::Entry>& pitEntry : nte.getPitEntries()) {
for (const shared_ptr<Entry>& pitEntry : nte.getPitEntries()) {
if (pitEntry->getInterest().matchesData(data))
matches.emplace_back(pitEntry);
}
@@ -123,13 +100,7 @@ Pit::findAllDataMatches(const Data& data) const
}
void
Pit::erase(shared_ptr<pit::Entry> entry)
{
this->erase(entry, true);
}
void
Pit::erase(shared_ptr<pit::Entry> entry, bool canDeleteNte)
Pit::erase(shared_ptr<Entry> entry, bool canDeleteNte)
{
name_tree::Entry* nte = m_nameTree.getEntry(*entry);
BOOST_ASSERT(nte != nullptr);
@@ -142,7 +113,7 @@ Pit::erase(shared_ptr<pit::Entry> entry, bool canDeleteNte)
}
void
Pit::deleteInOutRecords(shared_ptr<pit::Entry> entry, const Face& face)
Pit::deleteInOutRecords(shared_ptr<Entry> entry, const Face& face)
{
BOOST_ASSERT(entry != nullptr);
@@ -159,4 +130,11 @@ Pit::begin() const
[] (const name_tree::Entry& entry) { return entry.hasPitEntries(); }).begin());
}
Pit::const_iterator
Pit::end() const
{
return const_iterator(m_nameTree.end());
}
} // namespace pit
} // namespace nfd
+36 -151
View File
@@ -26,8 +26,8 @@
#ifndef NFD_DAEMON_TABLE_PIT_HPP
#define NFD_DAEMON_TABLE_PIT_HPP
#include "name-tree.hpp"
#include "pit-entry.hpp"
#include "pit-iterator.hpp"
namespace nfd {
namespace pit {
@@ -36,12 +36,10 @@ namespace pit {
* \brief an unordered iterable of all PIT entries matching Data
*
* This type shall support:
* iterator<shared_ptr<pit::Entry>> begin()
* iterator<shared_ptr<pit::Entry>> end()
* iterator<shared_ptr<Entry>> begin()
* iterator<shared_ptr<Entry>> end()
*/
typedef std::vector<shared_ptr<pit::Entry>> DataMatchResult;
} // namespace pit
typedef std::vector<shared_ptr<Entry>> DataMatchResult;
/** \brief represents the Interest Table
*/
@@ -54,102 +52,73 @@ public:
/** \return number of entries
*/
size_t
size() const;
size() const
{
return m_nItems;
}
/** \brief finds a PIT entry for Interest
* \param interest the Interest
* \return an existing entry with same Name and Selectors; otherwise nullptr
*/
shared_ptr<pit::Entry>
find(const Interest& interest) const;
shared_ptr<Entry>
find(const Interest& interest) const
{
return const_cast<Pit*>(this)->findOrInsert(interest, false).first;
}
/** \brief inserts a PIT entry for Interest
* \param interest the Interest; must be created with make_shared
* \return a new or existing entry with same Name and Selectors,
* and true for new entry, false for existing entry
*/
std::pair<shared_ptr<pit::Entry>, bool>
insert(const Interest& interest);
std::pair<shared_ptr<Entry>, bool>
insert(const Interest& interest)
{
return this->findOrInsert(interest, true);
}
/** \brief performs a Data match
* \return an iterable of all PIT entries matching data
*/
pit::DataMatchResult
DataMatchResult
findAllDataMatches(const Data& data) const;
/**
* \brief erases a PIT Entry
/** \brief erases a PIT Entry
*/
void
erase(shared_ptr<pit::Entry> entry);
erase(shared_ptr<Entry> entry)
{
this->erase(entry, true);
}
/** \brief deletes in-record and out-record for face
*/
void
deleteInOutRecords(shared_ptr<pit::Entry> entry, const Face& face);
deleteInOutRecords(shared_ptr<Entry> entry, const Face& face);
public: // enumeration
class const_iterator;
typedef Iterator const_iterator;
/** \brief returns an iterator pointing to the first PIT entry
/** \return an iterator to the beginning
* \note Iteration order is implementation-specific and is undefined
* \note The returned iterator may get invalidated if PIT or another NameTree-based
* table is modified
* \warning Undefine behavior may occur if a FIB/PIT/Measurements/StrategyChoice entry
* is inserted or deleted during PIT enumeration.
*/
const_iterator
begin() const;
/** \brief returns an iterator referring to the past-the-end PIT entry
* \note The returned iterator may get invalidated if PIT or another NameTree-based
* table is modified
/** \return an iterator to the end
* \sa begin()
*/
const_iterator
end() const;
class const_iterator : public std::iterator<std::forward_iterator_tag, const pit::Entry>
{
public:
const_iterator();
explicit
const_iterator(const NameTree::const_iterator& it);
~const_iterator();
const pit::Entry&
operator*() const;
shared_ptr<pit::Entry>
operator->() const;
const_iterator&
operator++();
const_iterator
operator++(int);
bool
operator==(const const_iterator& other) const;
bool
operator!=(const const_iterator& other) const;
private:
NameTree::const_iterator m_nameTreeIterator;
/** \brief Index of the current visiting PIT entry in NameTree node
*
* Index is used to ensure that dereferencing of m_nameTreeIterator happens only when
* const_iterator is dereferenced or advanced.
*/
size_t m_iPitEntry;
};
private:
/**
* \brief erases a PIT Entry
/** \brief erases a PIT Entry
*/
void
erase(shared_ptr<pit::Entry> pitEntry, bool canDeleteNte);
erase(shared_ptr<Entry> pitEntry, bool canDeleteNte);
/** \brief finds or inserts a PIT entry for Interest
* \param interest the Interest; must be created with make_shared if allowInsert
@@ -159,7 +128,7 @@ private:
* if not allowInsert, an existing entry with same Name+Selectors and false,
* or {nullptr, true} if there's no existing entry
*/
std::pair<shared_ptr<pit::Entry>, bool>
std::pair<shared_ptr<Entry>, bool>
findOrInsert(const Interest& interest, bool allowInsert);
private:
@@ -167,93 +136,9 @@ private:
size_t m_nItems;
};
inline size_t
Pit::size() const
{
return m_nItems;
}
} // namespace pit
inline shared_ptr<pit::Entry>
Pit::find(const Interest& interest) const
{
return const_cast<Pit*>(this)->findOrInsert(interest, false).first;
}
inline std::pair<shared_ptr<pit::Entry>, bool>
Pit::insert(const Interest& interest)
{
return this->findOrInsert(interest, true);
}
inline Pit::const_iterator
Pit::end() const
{
return const_iterator(m_nameTree.end());
}
inline
Pit::const_iterator::const_iterator()
: m_iPitEntry(0)
{
}
inline
Pit::const_iterator::const_iterator(const NameTree::const_iterator& it)
: m_nameTreeIterator(it)
, m_iPitEntry(0)
{
}
inline
Pit::const_iterator::~const_iterator()
{
}
inline Pit::const_iterator
Pit::const_iterator::operator++(int)
{
Pit::const_iterator temp(*this);
++(*this);
return temp;
}
inline Pit::const_iterator&
Pit::const_iterator::operator++()
{
++m_iPitEntry;
if (m_iPitEntry < m_nameTreeIterator->getPitEntries().size()) {
return *this;
}
++m_nameTreeIterator;
m_iPitEntry = 0;
return *this;
}
inline const pit::Entry&
Pit::const_iterator::operator*() const
{
return *(this->operator->());
}
inline shared_ptr<pit::Entry>
Pit::const_iterator::operator->() const
{
return m_nameTreeIterator->getPitEntries().at(m_iPitEntry);
}
inline bool
Pit::const_iterator::operator==(const Pit::const_iterator& other) const
{
return m_nameTreeIterator == other.m_nameTreeIterator &&
m_iPitEntry == other.m_iPitEntry;
}
inline bool
Pit::const_iterator::operator!=(const Pit::const_iterator& other) const
{
return !(*this == other);
}
using pit::Pit;
} // namespace nfd