From 91be2332e249147ce3169c46a7da77f0f8c2211d Mon Sep 17 00:00:00 2001 From: Shauren Date: Sun, 28 Jan 2018 11:37:20 +0100 Subject: Core/Entities: Phasing rewrite * Optimized phase visibility checking * Handle all phase flags Closes #16758 Closes #21119 --- src/common/Utilities/Containers.h | 37 ++++++++++++++++++++++++++++++++++--- 1 file changed, 34 insertions(+), 3 deletions(-) (limited to 'src/common/Utilities/Containers.h') diff --git a/src/common/Utilities/Containers.h b/src/common/Utilities/Containers.h index cf23949c10a..581fbfabe6b 100644 --- a/src/common/Utilities/Containers.h +++ b/src/common/Utilities/Containers.h @@ -118,7 +118,7 @@ namespace Trinity * Note: container cannot be empty */ template - auto SelectRandomWeightedContainerElement(C const& container, Fn weightExtractor) -> decltype(std::begin(container)) + inline auto SelectRandomWeightedContainerElement(C const& container, Fn weightExtractor) -> decltype(std::begin(container)) { std::vector weights; weights.reserve(Size(container)); @@ -161,7 +161,7 @@ namespace Trinity * @return true if containers have a common element, false otherwise. */ template - bool Intersects(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) + inline bool Intersects(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2) { while (first1 != last1 && first2 != last2) { @@ -176,6 +176,37 @@ namespace Trinity return false; } + /** + * @fn bool Trinity::Containers::Intersects(Iterator first1, Iterator last1, Iterator first2, Iterator last2, Predicate&& equalPred) + * + * @brief Checks if two SORTED containers have a common element + * + * @param first1 Iterator pointing to start of the first container + * @param last1 Iterator pointing to end of the first container + * @param first2 Iterator pointing to start of the second container + * @param last2 Iterator pointing to end of the second container + * @param equalPred Additional predicate to exclude elements + * + * @return true if containers have a common element, false otherwise. + */ + template + inline bool Intersects(Iterator1 first1, Iterator1 last1, Iterator2 first2, Iterator2 last2, Predicate&& equalPred) + { + while (first1 != last1 && first2 != last2) + { + if (*first1 < *first2) + ++first1; + else if (*first2 < *first1) + ++first2; + else if (!equalPred(*first1, *first2)) + ++first1, ++first2; + else + return true; + } + + return false; + } + /** * Returns a pointer to mapped value (or the value itself if map stores pointers) */ @@ -187,7 +218,7 @@ namespace Trinity } template class M, class... Rest> - void MultimapErasePair(M& multimap, K const& key, V const& value) + inline void MultimapErasePair(M& multimap, K const& key, V const& value) { auto range = multimap.equal_range(key); for (auto itr = range.first; itr != range.second;) -- cgit v1.2.3