diff --git a/daemon/fw/ncc-strategy.hpp b/daemon/fw/ncc-strategy.hpp index 72f39e48..14a4696c 100644 --- a/daemon/fw/ncc-strategy.hpp +++ b/daemon/fw/ncc-strategy.hpp @@ -56,6 +56,12 @@ protected: class MeasurementsEntryInfo : public StrategyInfo { public: + static constexpr int + getTypeId() + { + return 1000; + } + MeasurementsEntryInfo(); void @@ -93,6 +99,12 @@ protected: class PitEntryInfo : public StrategyInfo { public: + static constexpr int + getTypeId() + { + return 1001; + } + virtual ~PitEntryInfo(); diff --git a/daemon/fw/strategy-info.hpp b/daemon/fw/strategy-info.hpp index d670f10d..b701fc55 100644 --- a/daemon/fw/strategy-info.hpp +++ b/daemon/fw/strategy-info.hpp @@ -1,11 +1,12 @@ /* -*- 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 + * 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. @@ -20,7 +21,7 @@ * * You should have received a copy of the GNU General Public License along with * NFD, e.g., in COPYING.md file. If not, see . - **/ + */ #ifndef NFD_DAEMON_FW_STRATEGY_INFO_HPP #define NFD_DAEMON_FW_STRATEGY_INFO_HPP @@ -30,12 +31,21 @@ namespace nfd { namespace fw { -/** \class StrategyInfo - * \brief contains arbitrary information forwarding strategy places on table entries +/** \brief contains arbitrary information forwarding strategy places on table entries */ class StrategyInfo { public: + /** \fn static constexpr int getTypeId() + * \return an integer that uniquely identifies this StrategyInfo type + * \sa http://redmine.named-data.net/projects/nfd/wiki/StrategyInfoType + */ + // static constexpr int + // getTypeId() + // { + // return ; + // } + virtual ~StrategyInfo(); }; diff --git a/daemon/table/strategy-info-host.cpp b/daemon/table/strategy-info-host.cpp index 9c46f1e4..4961c682 100644 --- a/daemon/table/strategy-info-host.cpp +++ b/daemon/table/strategy-info-host.cpp @@ -1,11 +1,12 @@ /* -*- 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 + * 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. @@ -20,7 +21,7 @@ * * 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 "strategy-info-host.hpp" @@ -29,7 +30,7 @@ namespace nfd { void StrategyInfoHost::clearStrategyInfo() { - m_strategyInfo.reset(); + m_items.clear(); } } // namespace nfd diff --git a/daemon/table/strategy-info-host.hpp b/daemon/table/strategy-info-host.hpp index c7aa7da6..1f6d9409 100644 --- a/daemon/table/strategy-info-host.hpp +++ b/daemon/table/strategy-info-host.hpp @@ -1,11 +1,12 @@ /* -*- 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 + * 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. @@ -20,7 +21,7 @@ * * You should have received a copy of the GNU General Public License along with * NFD, e.g., in COPYING.md file. If not, see . - **/ + */ #ifndef NFD_DAEMON_TABLE_STRATEGY_INFO_HOST_HPP #define NFD_DAEMON_TABLE_STRATEGY_INFO_HOST_HPP @@ -29,72 +30,88 @@ namespace nfd { -/** \class StrategyInfoHost - * \brief base class for an entity onto which StrategyInfo may be placed +/** \brief base class for an entity onto which StrategyInfo objects may be placed */ class StrategyInfoHost { public: - template - void - setStrategyInfo(shared_ptr strategyInfo); - + /** \brief get a StrategyInfo item + * \tparam T type of StrategyInfo, must be a subclass of from nfd::fw::StrategyInfo + * \retval nullptr if no StrategyInfo of type T is stored + */ template shared_ptr getStrategyInfo() const; + /** \brief set a StrategyInfo item + * \tparam T type of StrategyInfo, must be a subclass of from nfd::fw::StrategyInfo + */ template - shared_ptr - getOrCreateStrategyInfo(); + void + setStrategyInfo(shared_ptr strategyInfo); - template + /** \brief get or create a StrategyInfo item + * \tparam T type of StrategyInfo, must be a subclass of from nfd::fw::StrategyInfo + * + * If no StrategyInfo of type T is stored, it's created with \p{args}; + * otherwise, the existing item is returned. + */ + template shared_ptr - getOrCreateStrategyInfo(T1& a1); + getOrCreateStrategyInfo(A&&... args); + /** \brief clear all StrategyInfo items + */ void clearStrategyInfo(); private: - shared_ptr m_strategyInfo; + std::map> m_items; }; -template -void -StrategyInfoHost::setStrategyInfo(shared_ptr strategyInfo) -{ - m_strategyInfo = strategyInfo; -} - template shared_ptr StrategyInfoHost::getStrategyInfo() const { - return static_pointer_cast(m_strategyInfo); + static_assert(std::is_base_of::value, + "T must inherit from StrategyInfo"); + + auto it = m_items.find(T::getTypeId()); + if (it == m_items.end()) { + return nullptr; + } + return static_pointer_cast(it->second); } template -shared_ptr -StrategyInfoHost::getOrCreateStrategyInfo() +void +StrategyInfoHost::setStrategyInfo(shared_ptr item) { - shared_ptr info = this->getStrategyInfo(); - if (!static_cast(info)) { - info = make_shared(); - this->setStrategyInfo(info); + static_assert(std::is_base_of::value, + "T must inherit from StrategyInfo"); + + if (item == nullptr) { + m_items.erase(T::getTypeId()); + } + else { + m_items[T::getTypeId()] = item; } - return info; } -template +template shared_ptr -StrategyInfoHost::getOrCreateStrategyInfo(T1& a1) +StrategyInfoHost::getOrCreateStrategyInfo(A&&... args) { - shared_ptr info = this->getStrategyInfo(); - if (!static_cast(info)) { - info = make_shared(ref(a1)); - this->setStrategyInfo(info); + static_assert(std::is_base_of::value, + "T must inherit from StrategyInfo"); + + shared_ptr item = this->getStrategyInfo(); + if (!static_cast(item)) { + item = make_shared(std::forward(args)...); + this->setStrategyInfo(item); } - return info; + return item; } } // namespace nfd diff --git a/tests/daemon/table/strategy-choice.cpp b/tests/daemon/table/strategy-choice.cpp index 7817d51e..494c76b8 100644 --- a/tests/daemon/table/strategy-choice.cpp +++ b/tests/daemon/table/strategy-choice.cpp @@ -164,6 +164,12 @@ BOOST_AUTO_TEST_CASE(Enumerate) class PStrategyInfo : public fw::StrategyInfo { +public: + static constexpr int + getTypeId() + { + return 10; + } }; BOOST_AUTO_TEST_CASE(ClearStrategyInfo) diff --git a/tests/daemon/table/strategy-info-host.cpp b/tests/daemon/table/strategy-info-host.cpp index 82d4fccf..5c0c14fa 100644 --- a/tests/daemon/table/strategy-info-host.cpp +++ b/tests/daemon/table/strategy-info-host.cpp @@ -1,11 +1,12 @@ /* -*- 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 + * 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. @@ -20,7 +21,7 @@ * * 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 "table/strategy-info-host.hpp" @@ -29,18 +30,27 @@ namespace nfd { namespace tests { +using fw::StrategyInfo; + static int g_DummyStrategyInfo_count = 0; -class DummyStrategyInfo : public fw::StrategyInfo +class DummyStrategyInfo : public StrategyInfo { public: + static constexpr int + getTypeId() + { + return 1; + } + DummyStrategyInfo(int id) : m_id(id) { ++g_DummyStrategyInfo_count; } - virtual ~DummyStrategyInfo() + virtual + ~DummyStrategyInfo() { --g_DummyStrategyInfo_count; } @@ -48,31 +58,82 @@ public: int m_id; }; +class DummyStrategyInfo2 : public StrategyInfo +{ +public: + static constexpr int + getTypeId() + { + return 2; + } + + DummyStrategyInfo2(int id) + : m_id(id) + { + } + + int m_id; +}; + BOOST_FIXTURE_TEST_SUITE(TableStrategyInfoHost, BaseFixture) BOOST_AUTO_TEST_CASE(SetGetClear) { StrategyInfoHost host; - BOOST_CHECK(!static_cast(host.getStrategyInfo())); + BOOST_CHECK(host.getStrategyInfo() == nullptr); g_DummyStrategyInfo_count = 0; shared_ptr info = make_shared(7591); host.setStrategyInfo(info); - BOOST_REQUIRE(static_cast(host.getStrategyInfo())); + BOOST_REQUIRE(host.getStrategyInfo() != nullptr); BOOST_CHECK_EQUAL(host.getStrategyInfo()->m_id, 7591); info.reset(); // unlink local reference // host should still have a reference to info - BOOST_REQUIRE(static_cast(host.getStrategyInfo())); + BOOST_REQUIRE(host.getStrategyInfo() != nullptr); BOOST_CHECK_EQUAL(host.getStrategyInfo()->m_id, 7591); host.clearStrategyInfo(); - BOOST_CHECK(!static_cast(host.getStrategyInfo())); + BOOST_CHECK(host.getStrategyInfo() == nullptr); BOOST_CHECK_EQUAL(g_DummyStrategyInfo_count, 0); } +BOOST_AUTO_TEST_CASE(Create) +{ + StrategyInfoHost host; + + host.getOrCreateStrategyInfo(3503); + BOOST_REQUIRE(host.getStrategyInfo() != nullptr); + BOOST_CHECK_EQUAL(host.getStrategyInfo()->m_id, 3503); + + host.getOrCreateStrategyInfo(1032); + BOOST_REQUIRE(host.getStrategyInfo() != nullptr); + BOOST_CHECK_EQUAL(host.getStrategyInfo()->m_id, 3503); + + host.setStrategyInfo(nullptr); + host.getOrCreateStrategyInfo(9956); + BOOST_REQUIRE(host.getStrategyInfo() != nullptr); + BOOST_CHECK_EQUAL(host.getStrategyInfo()->m_id, 9956); +} + +BOOST_AUTO_TEST_CASE(Types) +{ + StrategyInfoHost host; + + host.getOrCreateStrategyInfo(8063); + BOOST_REQUIRE(host.getStrategyInfo() != nullptr); + BOOST_CHECK_EQUAL(host.getStrategyInfo()->m_id, 8063); + + host.getOrCreateStrategyInfo(2871); + BOOST_REQUIRE(host.getStrategyInfo() != nullptr); + BOOST_CHECK_EQUAL(host.getStrategyInfo()->m_id, 2871); + + BOOST_REQUIRE(host.getStrategyInfo() != nullptr); + BOOST_CHECK_EQUAL(host.getStrategyInfo()->m_id, 8063); +} + BOOST_AUTO_TEST_SUITE_END() } // namespace tests