/* -*- Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil -*- */
/*
 * Copyright (c) 2011 University of California, Los Angeles
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License version 2 as
 * published by the Free Software Foundation;
 *
 * This program 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 this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 *
 * Author: Alexander Afanasyev <alexander.afanasyev@ucla.edu>
 */

#ifndef _CCNX_PIT_ENTRY_IMPL_H_
#define	_CCNX_PIT_ENTRY_IMPL_H_

namespace ns3 {

class CcnxPit;
class CcnxInterestHeader;
class CcnxFibEntry;

template<class Pit>
class CcnxPitEntryImpl : public CcnxPitEntry
{
  typedef CcnxPitEntry super;
  #define CONTAINER static_cast<Pit&> (m_container)
  
public:
  CcnxPitEntryImpl (CcnxPit &pit,
                    Ptr<const CcnxInterestHeader> header,
                    Ptr<CcnxFibEntry> fibEntry)
  : CcnxPitEntry (pit, header, fibEntry)
  , item_ (0)
  {
    CONTAINER.i_time.insert (*this);
    CONTAINER.RescheduleCleaning ();
  }
  
  virtual ~CcnxPitEntryImpl ()
  {
    CONTAINER.i_time.erase (*this);
    
    CONTAINER.RescheduleCleaning ();
  }

  virtual void
  UpdateLifetime (const Time &offsetTime)
  {
    CONTAINER.i_time.erase (*this);
    super::UpdateLifetime (offsetTime);
    CONTAINER.i_time.insert (*this);

    CONTAINER.RescheduleCleaning ();
  }

  
  // to make sure policies work
  void
  SetTrie (typename Pit::super::iterator item) { item_ = item; }

  typename Pit::super::iterator to_iterator () { return item_; }
  typename Pit::super::const_iterator to_iterator () const { return item_; }

public:
  boost::intrusive::set_member_hook<> time_hook_;
  
private:
  typename Pit::super::iterator item_;
};

template<class T>
struct TimestampIndex
{
  bool
  operator () (const T &a, const T &b) const
  {
    return a.GetExpireTime () < b.GetExpireTime ();
  }
};

} // ns3

#endif 
