table: mock PIT
refs #1128
Change-Id: I8943ad07d93422dc456fd051b2e4c0d5f38bc227
diff --git a/daemon/table/pit.cpp b/daemon/table/pit.cpp
new file mode 100644
index 0000000..7742266
--- /dev/null
+++ b/daemon/table/pit.cpp
@@ -0,0 +1,76 @@
+/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
+/**
+ * Copyright (C) 2014 Named Data Networking Project
+ * See COPYING for copyright and distribution information.
+ */
+
+#include "pit.hpp"
+#include <algorithm>
+
+namespace ndn {
+
+Pit::Pit()
+{
+}
+
+Pit::~Pit()
+{
+}
+
+static inline bool
+operator==(const Exclude& a, const Exclude& b)
+{
+ const Block& aBlock = a.wireEncode();
+ const Block& bBlock = b.wireEncode();
+ return aBlock.size() == bBlock.size() &&
+ 0 == memcmp(aBlock.wire(), bBlock.wire(), aBlock.size());
+}
+
+static inline bool
+predicate_PitEntry_similar_Interest(shared_ptr<pit::Entry> entry,
+ const Interest& interest)
+{
+ const Interest& pi = entry->getInterest();
+ return pi.getName().equals(interest.getName()) &&
+ pi.getMinSuffixComponents() == interest.getMinSuffixComponents() &&
+ pi.getMaxSuffixComponents() == interest.getMaxSuffixComponents() &&
+ // TODO PublisherPublicKeyLocator (ndn-cpp-dev #1157)
+ pi.getExclude() == interest.getExclude() &&
+ pi.getChildSelector() == interest.getChildSelector() &&
+ pi.getMustBeFresh() == interest.getMustBeFresh();
+}
+
+std::pair<shared_ptr<pit::Entry>, bool>
+Pit::insert(const Interest& interest)
+{
+ std::list<shared_ptr<pit::Entry> >::iterator it = std::find_if(
+ m_table.begin(), m_table.end(),
+ bind(&predicate_PitEntry_similar_Interest, _1, interest));
+ if (it != m_table.end()) return std::make_pair(*it, false);
+
+ shared_ptr<pit::Entry> entry = make_shared<pit::Entry>(interest);
+ m_table.push_back(entry);
+ return std::make_pair(entry, true);
+}
+
+shared_ptr<pit::DataMatchResult>
+Pit::findAllDataMatches(const Data& data) const
+{
+ shared_ptr<pit::DataMatchResult> result = make_shared<pit::DataMatchResult>();
+ for (std::list<shared_ptr<pit::Entry> >::const_iterator it = m_table.begin();
+ it != m_table.end(); ++it) {
+ shared_ptr<pit::Entry> entry = *it;
+ if (entry->getInterest().matchesName(data.getName())) {
+ result->push_back(entry);
+ }
+ }
+ return result;
+}
+
+void
+Pit::remove(shared_ptr<pit::Entry> pitEntry)
+{
+ m_table.remove(pitEntry);
+}
+
+} // namespace ndn