Vanetza
Loading...
Searching...
No Matches
peer_request_tracker.cpp
1#include <vanetza/security/peer_request_tracker.hpp>
2#include <cassert>
3
4namespace vanetza
5{
6namespace security
7{
8
9PeerRequestTracker::PeerRequestTracker(std::size_t limit) : m_limit(limit)
10{
11}
12
13void PeerRequestTracker::add_request(const HashedId3& id)
14{
15 if (!is_pending(id)) {
16 // drop tail item when queue becomes full
17 if (m_fifo.size() >= m_limit && !m_fifo.empty()) {
18 m_lookup.erase(m_fifo.front());
19 m_fifo.pop_front();
20 }
21
22 auto inserted = m_fifo.insert(m_fifo.end(), id);
23 m_lookup.emplace(id, inserted);
24 }
25
26 assert(m_fifo.size() == m_lookup.size());
27}
28
29void PeerRequestTracker::discard_request(const HashedId3& id)
30{
31 auto found = m_lookup.find(id);
32 if (found != m_lookup.end()) {
33 m_fifo.erase(found->second);
34 m_lookup.erase(found);
35 }
36
37 assert(m_fifo.size() == m_lookup.size());
38}
39
40bool PeerRequestTracker::is_pending(const HashedId3& id) const
41{
42 return m_lookup.find(id) != m_lookup.end();
43}
44
45boost::optional<HashedId3> PeerRequestTracker::next_one()
46{
47 boost::optional<HashedId3> next;
48 if (!m_fifo.empty()) {
49 next = m_fifo.front();
50 m_fifo.pop_front();
51 m_lookup.erase(*next);
52 }
53
54 assert(m_fifo.size() == m_lookup.size());
55 return next;
56}
57
58std::list<HashedId3> PeerRequestTracker::next_n(std::size_t max)
59{
60 if (max >= m_fifo.size()) {
61 return all();
62 } else {
63 std::list<HashedId3> next;
64 auto from = m_fifo.begin();
65 auto to = std::next(from, max);
66 next.splice(next.begin(), m_fifo, from, to);
67
68 for (const HashedId3& id : next) {
69 m_lookup.erase(id);
70 }
71
72 assert(m_fifo.size() == m_lookup.size());
73 return next;
74 }
75}
76
77std::list<HashedId3> PeerRequestTracker::all()
78{
79 m_lookup.clear();
80 std::list<HashedId3> all;
81 all.splice(all.begin(), m_fifo, m_fifo.begin(), m_fifo.end());
82 return all;
83}
84
85} // namespace security
86} // namespace vanetza
std::list< HashedId3 > next_n(std::size_t max)
bool is_pending(const HashedId3 &) const
boost::optional< HashedId3 > next_one()