/* -*-  Mode: C++; c-file-style: "gnu"; indent-tabs-mode:nil; -*- */
/*
 * Copyright (c) 2011,2012 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>
 *         Ilya Moiseenko <iliamo@cs.ucla.edu>
 *         
 */

#include "content-store-nocache.hpp"

#include "ns3/log.h"
#include "ns3/packet.h"

NS_LOG_COMPONENT_DEFINE ("ndn.cs.Nocache");

namespace ns3 {
namespace ndn {
namespace cs {

NS_OBJECT_ENSURE_REGISTERED (Nocache);

TypeId 
Nocache::GetTypeId (void)
{
  static TypeId tid = TypeId ("ns3::ndn::cs::Nocache")
    .SetGroupName ("Ndn")
    .SetParent<ContentStore> ()
    .AddConstructor< Nocache > ()
    ;

  return tid;
}

Nocache::Nocache ()
{
}

Nocache::~Nocache () 
{
}

Ptr<Data>
Nocache::Lookup (Ptr<const Interest> interest)
{
  this->m_cacheMissesTrace (interest);
  return 0;
}

bool
Nocache::Add (Ptr<const Data> data)
{
  return false;
}

void
Nocache::Print (std::ostream &os) const
{
}

uint32_t
Nocache::GetSize () const
{
  return 0;
}

Ptr<cs::Entry>
Nocache::Begin ()
{
  return 0;
}

Ptr<cs::Entry>
Nocache::End ()
{
  return 0;
}

Ptr<cs::Entry>
Nocache::Next (Ptr<cs::Entry>)
{
  return 0;
}

} // namespace cs
} // namespace ndn
} // namespace ns3
