diff --git a/NetDb.cpp b/NetDb.cpp index 488f299f..02601e20 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -786,6 +786,23 @@ namespace data } const RouterInfo * NetDb::GetRandomRouter (const RouterInfo * compatibleWith) const + { + if (compatibleWith) + return GetRandomRouter ( + [compatibleWith](const RouterInfo * router)->bool + { + return !router->IsHidden () && router->IsCompatible (*compatibleWith); + }); + else + return GetRandomRouter ( + [](const RouterInfo * router)->bool + { + return !router->IsHidden (); + }); + } + + template + const RouterInfo * NetDb::GetRandomRouter (Filter filter) const { CryptoPP::RandomNumberGenerator& rnd = i2p::context.GetRandomNumberGenerator (); uint32_t ind = rnd.GenerateWord32 (0, m_RouterInfos.size () - 1); @@ -796,8 +813,7 @@ namespace data { if (i >= ind) { - if (!it.second->IsUnreachable () && !it.second->IsHidden () && - (!compatibleWith || it.second->IsCompatible (*compatibleWith))) + if (!it.second->IsUnreachable () && filter (it.second)) return it.second; } else @@ -808,7 +824,7 @@ namespace data } return nullptr; // seems we have too few routers } - + void NetDb::PostI2NPMsg (I2NPMessage * msg) { if (msg) m_Queue.Put (msg); diff --git a/NetDb.h b/NetDb.h index 35cc7aa6..5a696e66 100644 --- a/NetDb.h +++ b/NetDb.h @@ -105,6 +105,9 @@ namespace data bool isLeaseSet, bool isExploratory = false, i2p::tunnel::TunnelPool * pool = nullptr); bool DeleteRequestedDestination (const IdentHash& dest); // returns true if found void DeleteRequestedDestination (RequestedDestination * dest); + + template + const RouterInfo * GetRandomRouter (Filter filter) const; private: