diff options
Diffstat (limited to 'Swiften/Network/DomainNameServiceQuery.cpp')
| -rw-r--r-- | Swiften/Network/DomainNameServiceQuery.cpp | 27 | 
1 files changed, 14 insertions, 13 deletions
| diff --git a/Swiften/Network/DomainNameServiceQuery.cpp b/Swiften/Network/DomainNameServiceQuery.cpp index da1e1ab..6ce1d97 100644 --- a/Swiften/Network/DomainNameServiceQuery.cpp +++ b/Swiften/Network/DomainNameServiceQuery.cpp @@ -1,5 +1,5 @@  /* - * Copyright (c) 2010 Remko Tronçon + * Copyright (c) 2010-2013 Remko Tronçon   * Licensed under the GNU General Public License v3.   * See Documentation/Licenses/GPLv3.txt for more information.   */ @@ -13,8 +13,12 @@  #include <Swiften/Base/RandomGenerator.h>  #include <boost/numeric/conversion/cast.hpp> +#include <boost/lambda/lambda.hpp> +#include <boost/lambda/bind.hpp> +#include <boost/typeof/typeof.hpp>  using namespace Swift; +namespace lambda = boost::lambda;  namespace {  	struct ResultPriorityComparator { @@ -22,14 +26,6 @@ namespace {  			return a.priority < b.priority;  		}  	}; - -	struct GetWeight { -			GetWeight() {} - -			int operator()(const DomainNameServiceQuery::Result& result) { -				return result.weight + 1 /* easy hack to account for '0' weights getting at least some weight */; -			} -	};  }  namespace Swift { @@ -46,12 +42,17 @@ void DomainNameServiceQuery::sortResults(std::vector<DomainNameServiceQuery::Res  		std::vector<DomainNameServiceQuery::Result>::iterator next = std::upper_bound(i, queries.end(), *i, comparator);  		if (std::distance(i, next) > 1) {  			std::vector<int> weights; -			std::transform(i, next, std::back_inserter(weights), GetWeight()); -			for (size_t j = 0; j < weights.size() - 1; ++j) { +			std::transform(i, next, std::back_inserter(weights),  +					/* easy hack to account for '0' weights getting at least some weight */ +					lambda::bind(&Result::weight, lambda::_1) + 1); +			for (int j = 0; j < boost::numeric_cast<int>(weights.size() - 1); ++j) {  				std::vector<int> cumulativeWeights; -				std::partial_sum(weights.begin() + j, weights.end(), std::back_inserter(cumulativeWeights)); +				std::partial_sum( +						weights.begin() + j, +						weights.end(),  +						std::back_inserter(cumulativeWeights));  				int randomNumber = generator.generateRandomInteger(cumulativeWeights.back()); -				int selectedIndex = std::lower_bound(cumulativeWeights.begin(), cumulativeWeights.end(), randomNumber) - cumulativeWeights.begin(); +				BOOST_AUTO(selectedIndex, std::lower_bound(cumulativeWeights.begin(), cumulativeWeights.end(), randomNumber) - cumulativeWeights.begin());  				std::swap(i[j], i[j + selectedIndex]);  				std::swap(weights.begin()[j], weights.begin()[j + selectedIndex]);  			} | 
 Swift
 Swift