Vanetza
 
Loading...
Searching...
No Matches
gbc_memory.cpp
1#include <vanetza/geonet/gbc_memory.hpp>
2
3namespace vanetza
4{
5namespace geonet
6{
7
8void GbcMemory::capacity(std::size_t num)
9{
10 m_capacity = num < 1 ? 1 : num;
11
12 // remove excessive identifiers
13 auto& by_queue_index = m_identifiers.get<by_queue>();
14 while (by_queue_index.size() > m_capacity) {
15 by_queue_index.pop_front();
16 }
17}
18
19std::size_t GbcMemory::size() const
20{
21 return m_identifiers.size();
22}
23
24bool GbcMemory::remember(const PacketIdentifier& id)
25{
26 auto& by_packet_index = m_identifiers.get<by_packet>();
27 auto found_packet = by_packet_index.find(id);
28 if (found_packet == by_packet_index.end()) {
29 // make space for one identifier
30 auto& by_queue_index = m_identifiers.get<by_queue>();
31 while (!by_queue_index.empty() && by_queue_index.size() >= m_capacity) {
32 by_queue_index.pop_front();
33 }
34
35 by_queue_index.push_back(id);
36 return false;
37 } else {
38 // packet is already known, just move it to end of queue
39 auto found_queue = m_identifiers.project<by_queue>(found_packet);
40 auto& by_queue_index = m_identifiers.get<by_queue>();
41 by_queue_index.relocate(by_queue_index.end(), found_queue);
42 return true;
43 }
44}
45
46bool GbcMemory::knows(const PacketIdentifier& id) const
47{
48 return m_identifiers.get<by_packet>().find(id) != m_identifiers.get<by_packet>().end();
49}
50
51} // namespace geonet
52} // namespace vanetza
bool remember(const PacketIdentifier &id)
Definition: gbc_memory.cpp:24
bool knows(const PacketIdentifier &id) const
Definition: gbc_memory.cpp:46
std::size_t size() const
Definition: gbc_memory.cpp:19
void capacity(std::size_t num)
Definition: gbc_memory.cpp:8