blob: 5ec94ef77aed28e9d0957b188ce5fb9e6633ae66 [file] [log] [blame]
akmhoque3d06e792014-05-27 16:23:20 -05001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
2/**
Nick Gordonc6a85222017-01-03 16:54:34 -06003 * Copyright (c) 2014-2017, The University of Memphis,
alvy297f4162015-03-03 17:15:33 -06004 * Regents of the University of California,
5 * Arizona Board of Regents.
akmhoque3d06e792014-05-27 16:23:20 -05006 *
7 * This file is part of NLSR (Named-data Link State Routing).
8 * See AUTHORS.md for complete list of NLSR authors and contributors.
9 *
10 * NLSR is free software: you can redistribute it and/or modify it under the terms
11 * of the GNU General Public License as published by the Free Software Foundation,
12 * either version 3 of the License, or (at your option) any later version.
13 *
14 * NLSR is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
15 * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
16 * PURPOSE. See the GNU General Public License for more details.
17 *
18 * You should have received a copy of the GNU General Public License along with
19 * NLSR, e.g., in COPYING.md file. If not, see <http://www.gnu.org/licenses/>.
akmhoque3d06e792014-05-27 16:23:20 -050020 **/
alvy297f4162015-03-03 17:15:33 -060021
akmhoquefdbddb12014-05-02 18:35:19 -050022#ifndef NLSR_NAME_PREFIX_LIST_HPP
23#define NLSR_NAME_PREFIX_LIST_HPP
akmhoque53353462014-04-22 08:43:45 -050024
25#include <list>
26#include <string>
akmhoquefdbddb12014-05-02 18:35:19 -050027#include <boost/cstdint.hpp>
akmhoque31d1d4b2014-05-05 22:08:14 -050028#include <ndn-cxx/name.hpp>
akmhoquec8a10f72014-04-25 18:42:55 -050029
akmhoque53353462014-04-22 08:43:45 -050030
31namespace nlsr {
akmhoquec8a10f72014-04-25 18:42:55 -050032class NamePrefixList
akmhoque53353462014-04-22 08:43:45 -050033{
akmhoque53353462014-04-22 08:43:45 -050034public:
Nick Gordonf14ec352017-07-24 16:09:58 -050035 using NamePair = std::tuple<ndn::Name, std::vector<std::string>>;
36 enum NamePairIndex {
37 NAME,
38 SOURCES
39 };
40
akmhoquec8a10f72014-04-25 18:42:55 -050041 NamePrefixList();
akmhoque53353462014-04-22 08:43:45 -050042
akmhoquec8a10f72014-04-25 18:42:55 -050043 ~NamePrefixList();
akmhoque53353462014-04-22 08:43:45 -050044
Nick G97e34942016-07-11 14:46:27 -050045 /*! \brief inserts name into NamePrefixList
46 \retval true If the name was successfully inserted.
47 \retval false If the name could not be inserted.
alvy297f4162015-03-03 17:15:33 -060048 */
49 bool
Nick Gordonf14ec352017-07-24 16:09:58 -050050 insert(const ndn::Name& name, const std::string& source = "");
akmhoque53353462014-04-22 08:43:45 -050051
Nick G97e34942016-07-11 14:46:27 -050052 /*! \brief removes name from NamePrefixList
53 \retval true If the name is removed
54 \retval false If the name failed to be removed.
alvy297f4162015-03-03 17:15:33 -060055 */
56 bool
Nick Gordonf14ec352017-07-24 16:09:58 -050057 remove(const ndn::Name& name, const std::string& source = "");
akmhoque53353462014-04-22 08:43:45 -050058
59 void
60 sort();
61
akmhoque31d1d4b2014-05-05 22:08:14 -050062 size_t
akmhoque53353462014-04-22 08:43:45 -050063 getSize()
64 {
Nick Gordonf14ec352017-07-24 16:09:58 -050065 return m_names.size();
akmhoque53353462014-04-22 08:43:45 -050066 }
67
Nick Gordonf14ec352017-07-24 16:09:58 -050068 std::list<ndn::Name>
69 getNames() const;
Nick Gordon56d1fae2017-05-26 16:39:25 -050070
71 bool
72 operator==(const NamePrefixList& other) const;
73
Nick Gordonf14ec352017-07-24 16:09:58 -050074 /*! Returns how many unique sources this name has.
akmhoque53353462014-04-22 08:43:45 -050075
Nick Gordonf14ec352017-07-24 16:09:58 -050076 \retval 0 if the name is not in the list, else the number of sources.
77 */
78 uint32_t
79 countSources(const ndn::Name& name) const;
80
81 /*! Returns the sources that this name has.
82
83 \retval an empty vector if the name is not in the list, else a
84 vector containing the sources.
85 */
86 const std::vector<std::string>
87 getSources(const ndn::Name& name) const;
88
89private:
90 /*! Obtain an iterator to the entry matching name.
91
92 \note We could do this quite easily inline with a lambda, but this
93 is slightly more efficient.
94 */
95 std::vector<NamePair>::iterator
96 get(const ndn::Name& name);
97
98 /*! Obtain an iterator to a specific source in an entry
99 */
100 std::vector<std::string>::iterator
101 getSource(const std::string& source, std::vector<NamePair>::iterator& entry);
102
103 std::vector<NamePair> m_names;
akmhoque53353462014-04-22 08:43:45 -0500104};
105
Nick Gordon56d1fae2017-05-26 16:39:25 -0500106std::ostream&
107operator<<(std::ostream& os, const NamePrefixList& list);
108
Nick Gordonfad8e252016-08-11 14:21:38 -0500109} // namespace nlsr
akmhoque53353462014-04-22 08:43:45 -0500110
Nick Gordon56d1fae2017-05-26 16:39:25 -0500111#endif // NLSR_NAME_PREFIX_LIST_HPP