~aleteoryx/muditaos

ref: 13d6915dc55e1b45f5e0c2918630c381c7c65e25 muditaos/module-utils/NumberHolderMatcher.hpp -rw-r--r-- 2.2 KiB
13d6915d — Piotr Tański [EGD-7362] Development features flag restored 4 years ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
// Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#pragma once

#include <PhoneNumber.hpp>

namespace utils
{

    /**
     * @brief
     *
     * @tparam STL container
     * @tparam Number holder class
     */
    template <template <class, class> class C, class THolder> class NumberHolderMatcher
    {
      private:
        using TContainer = C<THolder, std::allocator<THolder>>;
        using TIter      = typename TContainer::const_iterator;
        using MatchMap   = std::map<PhoneNumber::Match, std::vector<THolder>>;
        using OwnType    = NumberHolderMatcher<C, THolder>;
        TIter startIterator;

      public:
        /**
         * @brief Default constructor (null object constructor)
         *
         */
        NumberHolderMatcher()
        {}

        /**
         * @brief NumberHolderMatcher range constructor
         *
         * @param cont_begin - start iterator of a container with NumberHolders
         * @param cont_end - end iterator
         */
        NumberHolderMatcher(TIter cont_begin, TIter cont_end) : startIterator(cont_begin), END(cont_end)
        {}

        OwnType &operator=(const OwnType &) = delete;
        OwnType &operator=(OwnType &&m) = default;

        /**
         * @brief Matches a number on a specified level against a vector of numbers via NumberHolder extractor wrapper
         *
         * @param other - number to match with
         * @param level - minimum acceptable match level
         * @return TIter - an iterator instance pointing to best matched element in a container or an end iterator if
         * none could be matched
         */
        TIter bestMatch(const PhoneNumber &other, PhoneNumber::Match level = PhoneNumber::Match::EXACT) const
        {
            TIter i = startIterator;

            while (i != END) {
                auto match = other.match(i->getNumber());
                if (match >= level) {
                    return i;
                }
                i++;
            }

            return END;
        }

        /**
         * @brief end iterator for convienience
         *
         */
        TIter END;
    };

}; // namespace utils