/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */ /** * Copyright (c) 2014, 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 . */ #include "pit.hpp" namespace nfd { Pit::Pit(NameTree& nameTree) : m_nameTree(nameTree) , m_nItems(0) { } Pit::~Pit() { } static inline bool predicate_NameTreeEntry_hasPitEntry(const name_tree::Entry& entry) { return entry.hasPitEntries(); } static inline bool predicate_PitEntry_similar_Interest(const shared_ptr& entry, const Interest& interest) { const Interest& pi = entry->getInterest(); return pi.getName().equals(interest.getName()) && pi.getMinSuffixComponents() == interest.getMinSuffixComponents() && pi.getMaxSuffixComponents() == interest.getMaxSuffixComponents() && pi.getPublisherPublicKeyLocator() == interest.getPublisherPublicKeyLocator() && pi.getExclude() == interest.getExclude() && pi.getChildSelector() == interest.getChildSelector() && pi.getMustBeFresh() == interest.getMustBeFresh(); } std::pair, bool> Pit::insert(const Interest& interest) { // - first lookup() the Interest Name in the NameTree, which will creates all // the intermedia nodes, starting from the shortest prefix. // - if it is guaranteed that this Interest already has a NameTree Entry, we // could use findExactMatch() instead. // - Alternatively, we could try to do findExactMatch() first, if not found, // then do lookup(). shared_ptr nameTreeEntry = m_nameTree.lookup(interest.getName()); BOOST_ASSERT(static_cast(nameTreeEntry)); const std::vector >& pitEntries = nameTreeEntry->getPitEntries(); // then check if this Interest is already in the PIT entries std::vector >::const_iterator it = std::find_if(pitEntries.begin(), pitEntries.end(), bind(&predicate_PitEntry_similar_Interest, _1, cref(interest))); if (it != pitEntries.end()) { return std::make_pair(*it, false); } else { shared_ptr entry = make_shared(interest); nameTreeEntry->insertPitEntry(entry); // Increase m_nItmes only if we create a new PIT Entry m_nItems++; return std::make_pair(entry, true); } } shared_ptr Pit::findAllDataMatches(const Data& data) const { shared_ptr result = make_shared(); for (NameTree::const_iterator it = m_nameTree.findAllMatches(data.getName(), &predicate_NameTreeEntry_hasPitEntry); it != m_nameTree.end(); it++) { const std::vector >& pitEntries = it->getPitEntries(); for (size_t i = 0; i < pitEntries.size(); i++) { if (pitEntries[i]->getInterest().matchesData(data)) result->push_back(pitEntries[i]); } } return result; } void Pit::erase(shared_ptr pitEntry) { shared_ptr nameTreeEntry = m_nameTree.get(*pitEntry); BOOST_ASSERT(static_cast(nameTreeEntry)); nameTreeEntry->erasePitEntry(pitEntry); m_nameTree.eraseEntryIfEmpty(nameTreeEntry); --m_nItems; } } // namespace nfd