TrinityCore
Loading...
Searching...
No Matches
FuzzyFind.h
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#ifndef TRINITY_FUZZYFIND_H
19#define TRINITY_FUZZYFIND_H
20
21#include <map>
22#include <type_traits>
23
25
26namespace Trinity
27{
28 namespace Containers
29 {
30 template <typename Container, typename NeedleContainer, typename ContainsOperator = StringContainsStringI_T, typename T = void>
31 auto FuzzyFindIn(Container const& container, NeedleContainer const& needles, ContainsOperator const& contains = {}, int(*bonus)(decltype((*std::begin(std::declval<Container>())))) = nullptr)
32 {
33 using IteratorResult = decltype((*std::begin(container)));
34 using MappedType = std::conditional_t<std::is_reference_v<IteratorResult>, std::reference_wrapper<std::remove_reference_t<IteratorResult>>, IteratorResult>;
35 std::multimap<size_t, MappedType, std::greater<size_t>> results;
36
37 for (auto outerIt = std::begin(container), outerEnd = std::end(container); outerIt != outerEnd; ++outerIt)
38 {
39 size_t count = 0;
40 for (auto innerIt = std::begin(needles), innerEnd = std::end(needles); innerIt != innerEnd; ++innerIt)
41 if (contains(*outerIt, *innerIt))
42 ++count;
43
44 if (!count)
45 continue;
46
47 if (bonus)
48 count += bonus(*outerIt);
49
50 results.emplace(count, *outerIt);
51 }
52
53 return results;
54 }
55 }
56}
57
58#endif
auto FuzzyFindIn(Container const &container, NeedleContainer const &needles, ContainsOperator const &contains={}, int(*bonus)(decltype((*std::begin(std::declval< Container >()))))=nullptr)
Definition FuzzyFind.h:31