/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
/**
 * Copyright (c) 2014-2015,  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.
 *
 * NFD is free software: you can redistribute it and/or modify it under the terms
 * of the GNU General Public License as published by the Free Software Foundation,
 * either version 3 of the License, or (at your option) any later version.
 *
 * NFD 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
 * NFD, e.g., in COPYING.md file.  If not, see <http://www.gnu.org/licenses/>.
 */

#ifndef NFD_RIB_RIB_UPDATE_BATCH_HPP
#define NFD_RIB_RIB_UPDATE_BATCH_HPP

#include "common.hpp"
#include "rib-update.hpp"

namespace nfd {
namespace rib {

typedef std::list<RibUpdate> RibUpdateList;

/** \brief represents a collection of RibUpdates to be applied to a single FaceId
 */
class RibUpdateBatch
{
public:
  typedef RibUpdateList::const_iterator const_iterator;

  explicit
  RibUpdateBatch(uint64_t faceId);

  uint64_t
  getFaceId() const;

  void
  add(const RibUpdate& update);

  const_iterator
  begin() const;

  const_iterator
  end() const;

  size_t
  size() const;

private:
  uint64_t m_faceId;
  RibUpdateList m_updates;
};

inline uint64_t
RibUpdateBatch::getFaceId() const
{
  return m_faceId;
}

} // namespace rib
} // namespace nfd

#endif // NFD_RIB_RIB_UPDATE_BATCH_HPP
