blob: f3e8c620bcffa95a90394a6e74d9abf2a5ef2402 [file] [log] [blame]
Alexander Afanasyev413c7f12012-07-10 17:35:16 -07001/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
2/*
3 * Copyright (c) 2011 University of California, Los Angeles
4 *
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License version 2 as
7 * published by the Free Software Foundation;
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 *
18 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
19 */
20
Alexander Afanasyev4aac5572012-08-09 10:49:55 -070021#ifndef _NDN_PIT_ENTRY_IMPL_H_
22#define _NDN_PIT_ENTRY_IMPL_H_
Alexander Afanasyev413c7f12012-07-10 17:35:16 -070023
24namespace ns3 {
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070025namespace ndn {
Alexander Afanasyev413c7f12012-07-10 17:35:16 -070026
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070027class Pit;
28
29namespace pit {
Alexander Afanasyev413c7f12012-07-10 17:35:16 -070030
Alexander Afanasyev79206512013-07-27 16:49:12 -070031/**
32 * @ingroup ndn-pit
33 * @brief PIT entry implementation with additional pointers to the underlying container
34 */
Alexander Afanasyev413c7f12012-07-10 17:35:16 -070035template<class Pit>
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070036class EntryImpl : public Entry
Alexander Afanasyev413c7f12012-07-10 17:35:16 -070037{
Alexander Afanasyev8566f452012-12-10 15:21:51 -080038public:
39 typedef Entry base_type;
40
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070041 typedef Entry super;
Alexander Afanasyev413c7f12012-07-10 17:35:16 -070042 #define CONTAINER static_cast<Pit&> (m_container)
43
44public:
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070045 EntryImpl (Pit &pit,
Alexander Afanasyeveae83ee2013-03-15 15:01:10 -070046 Ptr<const Interest> header,
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070047 Ptr<fib::Entry> fibEntry)
48 : Entry (pit, header, fibEntry)
Alexander Afanasyev413c7f12012-07-10 17:35:16 -070049 , item_ (0)
50 {
51 CONTAINER.i_time.insert (*this);
52 CONTAINER.RescheduleCleaning ();
53 }
54
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -070055 virtual ~EntryImpl ()
Alexander Afanasyev413c7f12012-07-10 17:35:16 -070056 {
Alexander Afanasyevad82e252012-07-29 23:51:21 -070057 CONTAINER.i_time.erase (Pit::time_index::s_iterator_to (*this));
Alexander Afanasyev413c7f12012-07-10 17:35:16 -070058
59 CONTAINER.RescheduleCleaning ();
60 }
61
62 virtual void
63 UpdateLifetime (const Time &offsetTime)
64 {
Alexander Afanasyevad82e252012-07-29 23:51:21 -070065 CONTAINER.i_time.erase (Pit::time_index::s_iterator_to (*this));
Alexander Afanasyev413c7f12012-07-10 17:35:16 -070066 super::UpdateLifetime (offsetTime);
67 CONTAINER.i_time.insert (*this);
68
69 CONTAINER.RescheduleCleaning ();
70 }
71
Alexander Afanasyev08b7d9e2012-08-23 10:53:46 -070072 virtual void
73 OffsetLifetime (const Time &offsetTime)
74 {
75 CONTAINER.i_time.erase (Pit::time_index::s_iterator_to (*this));
76 super::OffsetLifetime (offsetTime);
77 CONTAINER.i_time.insert (*this);
78
79 CONTAINER.RescheduleCleaning ();
80 }
Alexander Afanasyev413c7f12012-07-10 17:35:16 -070081
82 // to make sure policies work
83 void
84 SetTrie (typename Pit::super::iterator item) { item_ = item; }
85
86 typename Pit::super::iterator to_iterator () { return item_; }
87 typename Pit::super::const_iterator to_iterator () const { return item_; }
88
89public:
90 boost::intrusive::set_member_hook<> time_hook_;
91
92private:
93 typename Pit::super::iterator item_;
94};
95
Alexander Afanasyev79206512013-07-27 16:49:12 -070096/// @cond include_hidden
Alexander Afanasyev413c7f12012-07-10 17:35:16 -070097template<class T>
98struct TimestampIndex
99{
100 bool
101 operator () (const T &a, const T &b) const
102 {
103 return a.GetExpireTime () < b.GetExpireTime ();
104 }
105};
Alexander Afanasyev79206512013-07-27 16:49:12 -0700106/// @endcond
Alexander Afanasyev413c7f12012-07-10 17:35:16 -0700107
Alexander Afanasyev2b4c9472012-08-09 15:00:38 -0700108} // namespace pit
109} // namespace ndn
110} // namespace ns3
Alexander Afanasyev413c7f12012-07-10 17:35:16 -0700111
112#endif