add eraseif to decaying hashset

This commit is contained in:
Jeff Becker 2020-05-22 15:47:42 -04:00
parent 39f8f17b53
commit eb0abbf1ff
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05
3 changed files with 27 additions and 16 deletions

View File

@ -308,14 +308,16 @@ namespace llarp
auto itr = map.begin();
while (itr != map.end())
{
itr->second->DecayFilters(now);
if (itr->second->Expired(now))
{
m_Router->outboundMessageHandler().QueueRemoveEmptyPath(itr->first);
itr = map.erase(itr);
}
else
{
itr->second->DecayFilters(now);
++itr;
}
}
}
{
@ -324,13 +326,15 @@ namespace llarp
auto itr = map.begin();
while (itr != map.end())
{
itr->second->DecayFilters(now);
if (itr->second->Expired(now))
{
itr = map.erase(itr);
}
else
{
itr->second->DecayFilters(now);
++itr;
}
}
}
}

View File

@ -270,12 +270,10 @@ namespace llarp
struct Hash
{
size_t
operator()(const AlignedBuffer& buf) const
std::size_t
operator()(const AlignedBuffer& buf) const noexcept
{
size_t hash;
std::memcpy(&hash, buf.data(), sizeof(hash));
return hash;
return *reinterpret_cast<const std::size_t*>(buf.data());
}
};

View File

@ -39,15 +39,7 @@ namespace llarp
{
if (now == 0s)
now = llarp::time_now_ms();
auto itr = m_Values.cbegin();
while (itr != m_Values.cend())
{
if ((m_CacheInterval + itr->second) <= now)
itr = m_Values.erase(itr);
else
++itr;
}
EraseIf([&](const auto& item) { return (m_CacheInterval + item.second) <= now; });
}
Time_t
@ -69,6 +61,23 @@ namespace llarp
}
private:
template <typename Predicate_t>
void
EraseIf(Predicate_t pred)
{
for (auto i = m_Values.begin(), last = m_Values.end(); i != last;)
{
if (pred(*i))
{
i = m_Values.erase(i);
}
else
{
++i;
}
}
}
Time_t m_CacheInterval;
std::unordered_map<Val_t, Time_t, Hash_t> m_Values;
};