/* -*- 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>
 */

#include "ndn-face-container.hpp"

#include <algorithm>

#include "ns3/ndn-face.hpp"

namespace ns3 {
namespace ndn {

FaceContainer::FaceContainer ()
{
}

FaceContainer::FaceContainer (const FaceContainer &other)
{
  AddAll (other);
}

FaceContainer&
FaceContainer::operator= (const FaceContainer &other)
{
  m_faces.clear ();
  AddAll (other);

  return *this;
}

  
void
FaceContainer::AddAll (Ptr<FaceContainer> other)
{
  AddAll (*other);
}

void
FaceContainer::AddAll (const FaceContainer &other)
{
  m_faces.insert (m_faces.end (),
                  other.m_faces.begin (), other.m_faces.end ());
}

FaceContainer::Iterator
FaceContainer::Begin (void) const
{
  return m_faces.begin ();
}

FaceContainer::Iterator
FaceContainer::End (void) const
{
  return m_faces.end ();
}

uint32_t
FaceContainer::GetN (void) const
{
  return m_faces.size ();
}

// void 
// FaceContainer::SetMetricToAll (uint16_t metric)
// {
//   for (FaceContainer::iterator it=m_faces.begin ();
//        it != m_faces.end ();
//        it++)
//     {
//       (*it)->SetMetric (metric);
//     }
// }

void 
FaceContainer::Add (const Ptr<Face> &face)
{
  m_faces.push_back (face);
}

Ptr<Face>
FaceContainer::Get (FaceContainer::Iterator i) const
{
  return *i;
}

} // namespace ndn
} // namespace ns3
