From e422b42ba635aa956a95d178aae7f5d6d4c77cee Mon Sep 17 00:00:00 2001 From: cryptozoidberg Date: Sat, 6 Apr 2024 17:22:44 +0200 Subject: [PATCH] fixes in lang tools --- contrib/epee/include/misc_language.h | 61 ++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/contrib/epee/include/misc_language.h b/contrib/epee/include/misc_language.h index ecf6677e..10033990 100644 --- a/contrib/epee/include/misc_language.h +++ b/contrib/epee/include/misc_language.h @@ -560,11 +560,72 @@ namespace misc_utils { while(m_expirations.size() && m_expirations.begin()->first < e) { + m_set.erase(m_expirations.begin()->second); m_expirations.erase(m_expirations.begin()); } } }; + template + struct expirating_map + { + typedef std::map main_map; + main_map m_map; + std::multimap m_expirations; + + const main_map& get_map() + { + return m_map; + } + void add(const key& k, const value_type& v, const expiration_type& e) + { + auto res = m_map.insert(k, v); + m_expirations.insert({ e, res.first }); + } + + void remove_if_expiration_less_than(const expiration_type& e) + { + while (m_expirations.size() && m_expirations.begin()->first < e) + { + m_map.erase(m_expirations.begin()->second) + m_expirations.erase(m_expirations.begin()); + } + } + + template + inline void serialize(t_archive& a, const unsigned int ver) + { + std::vector > items; + if constexpr (t_archive::is_saving::value) + { + for (const auto& item: m_expirations) + { + items.resize(items.size + 1); + std::get<2>(items.back()) = item.first; + std::get<0>(items.back()) = item.second.first; + std::get<1>(items.back()) = item.second.second; + } + } + a & items; + + if constexpr (!t_archive::is_saving::value) + { + for (const auto& item : items) + { + this->add(std::get<0>(item), std::get<1>(item), std::get<2>(item)); + + + items.resize(items.size + 1); + std::get<2>(items.back()) = item.first; + std::get<0>(items.back()) = item.second.first; + std::get<1>(items.back()) = item.second.second; + } + } + + } + + }; + } // namespace misc_utils } // namespace epee