From 76ad19f4113c5bf39cb82aaf9f4d557315d3b9df Mon Sep 17 00:00:00 2001 From: Adam Ierymenko Date: Mon, 6 Apr 2015 19:41:55 -0700 Subject: [PATCH] Use binary_search for multicast groups, which are kept in sorted order. --- node/Network.cpp | 25 ++++++++++++++++++++++++- node/Network.hpp | 23 +++-------------------- 2 files changed, 27 insertions(+), 21 deletions(-) diff --git a/node/Network.cpp b/node/Network.cpp index 43f3f1faf..da45f050e 100644 --- a/node/Network.cpp +++ b/node/Network.cpp @@ -137,10 +137,33 @@ Network::~Network() } } +std::vector Network::allMulticastGroups() const +{ + Mutex::Lock _l(_lock); + std::vector mgs(_myMulticastGroups); + std::vector::iterator oldend(mgs.end()); + for(std::map< MulticastGroup,uint64_t >::const_iterator i(_multicastGroupsBehindMe.begin());i!=_multicastGroupsBehindMe.end();++i) { + if (!std::binary_search(mgs.begin(),oldend,i->first)) + mgs.push_back(i->first); + } + std::sort(mgs.begin(),mgs.end()); + return mgs; +} + +bool Network::subscribedToMulticastGroup(const MulticastGroup &mg,bool includeBridgedGroups) const +{ + Mutex::Lock _l(_lock); + if (std::binary_search(_myMulticastGroups.begin(),_myMulticastGroups.end(),mg)) + return true; + else if (includeBridgedGroups) + return (_multicastGroupsBehindMe.find(mg) != _multicastGroupsBehindMe.end()); + else return false; +} + void Network::multicastSubscribe(const MulticastGroup &mg) { Mutex::Lock _l(_lock); - if (std::find(_myMulticastGroups.begin(),_myMulticastGroups.end(),mg) != _myMulticastGroups.end()) + if (std::binary_search(_myMulticastGroups.begin(),_myMulticastGroups.end(),mg)) return; _myMulticastGroups.push_back(mg); std::sort(_myMulticastGroups.begin(),_myMulticastGroups.end()); diff --git a/node/Network.hpp b/node/Network.hpp index fa76152bb..930d15380 100644 --- a/node/Network.hpp +++ b/node/Network.hpp @@ -100,31 +100,14 @@ public: /** * @return All multicast groups including learned groups that are behind any bridges we're attached to */ - inline std::vector allMulticastGroups() const - { - Mutex::Lock _l(_lock); - std::vector mgs(_myMulticastGroups); - for(std::map< MulticastGroup,uint64_t >::const_iterator i(_multicastGroupsBehindMe.begin());i!=_multicastGroupsBehindMe.end();++i) { - if (std::find(mgs.begin(),mgs.end(),i->first) == mgs.end()) - mgs.push_back(i->first); - } - std::sort(mgs.begin(),mgs.end()); - return mgs; - } + std::vector allMulticastGroups() const; /** * @param mg Multicast group + * @param includeBridgedGroups If true, also include any groups we've learned via bridging * @return True if this network endpoint / peer is a member */ - bool subscribedToMulticastGroup(const MulticastGroup &mg,bool includeBridgedGroups) const - { - Mutex::Lock _l(_lock); - if (std::find(_myMulticastGroups.begin(),_myMulticastGroups.end(),mg) != _myMulticastGroups.end()) - return true; - else if (includeBridgedGroups) - return (_multicastGroupsBehindMe.find(mg) != _multicastGroupsBehindMe.end()); - else return false; - } + bool subscribedToMulticastGroup(const MulticastGroup &mg,bool includeBridgedGroups) const; /** * Subscribe to a multicast group