RapidFuzz
Loading...
Searching...
No Matches
DamerauLevenshtein.hpp
1/* SPDX-License-Identifier: MIT */
2/* Copyright © 2022-present Max Bachmann */
3
4#include <algorithm>
5#include <rapidfuzz/distance/DamerauLevenshtein_impl.hpp>
6
7namespace rapidfuzz {
8
14/* the API will require a change when adding custom weights */
15namespace experimental {
37template <typename InputIt1, typename InputIt2>
38size_t damerau_levenshtein_distance(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2,
39 size_t score_cutoff = std::numeric_limits<size_t>::max())
40{
41 return detail::DamerauLevenshtein::distance(first1, last1, first2, last2, score_cutoff, score_cutoff);
42}
43
44template <typename Sentence1, typename Sentence2>
45size_t damerau_levenshtein_distance(const Sentence1& s1, const Sentence2& s2,
46 size_t score_cutoff = std::numeric_limits<size_t>::max())
47{
48 return detail::DamerauLevenshtein::distance(s1, s2, score_cutoff, score_cutoff);
49}
50
51template <typename InputIt1, typename InputIt2>
52size_t damerau_levenshtein_similarity(InputIt1 first1, InputIt1 last1, InputIt2 first2, InputIt2 last2,
53 size_t score_cutoff = 0)
54{
55 return detail::DamerauLevenshtein::similarity(first1, last1, first2, last2, score_cutoff, score_cutoff);
56}
57
58template <typename Sentence1, typename Sentence2>
59size_t damerau_levenshtein_similarity(const Sentence1& s1, const Sentence2& s2, size_t score_cutoff = 0)
60{
61 return detail::DamerauLevenshtein::similarity(s1, s2, score_cutoff, score_cutoff);
62}
63
64template <typename InputIt1, typename InputIt2>
65double damerau_levenshtein_normalized_distance(InputIt1 first1, InputIt1 last1, InputIt2 first2,
66 InputIt2 last2, double score_cutoff = 1.0)
67{
68 return detail::DamerauLevenshtein::normalized_distance(first1, last1, first2, last2, score_cutoff,
69 score_cutoff);
70}
71
72template <typename Sentence1, typename Sentence2>
73double damerau_levenshtein_normalized_distance(const Sentence1& s1, const Sentence2& s2,
74 double score_cutoff = 1.0)
75{
76 return detail::DamerauLevenshtein::normalized_distance(s1, s2, score_cutoff, score_cutoff);
77}
78
103template <typename InputIt1, typename InputIt2>
104double damerau_levenshtein_normalized_similarity(InputIt1 first1, InputIt1 last1, InputIt2 first2,
105 InputIt2 last2, double score_cutoff = 0.0)
106{
107 return detail::DamerauLevenshtein::normalized_similarity(first1, last1, first2, last2, score_cutoff,
108 score_cutoff);
109}
110
111template <typename Sentence1, typename Sentence2>
112double damerau_levenshtein_normalized_similarity(const Sentence1& s1, const Sentence2& s2,
113 double score_cutoff = 0.0)
114{
115 return detail::DamerauLevenshtein::normalized_similarity(s1, s2, score_cutoff, score_cutoff);
116}
117
118template <typename CharT1>
119struct CachedDamerauLevenshtein : public detail::CachedDistanceBase<CachedDamerauLevenshtein<CharT1>, size_t,
120 0, std::numeric_limits<int64_t>::max()> {
121 template <typename Sentence1>
122 explicit CachedDamerauLevenshtein(const Sentence1& s1_)
123 : CachedDamerauLevenshtein(detail::to_begin(s1_), detail::to_end(s1_))
124 {}
125
126 template <typename InputIt1>
127 CachedDamerauLevenshtein(InputIt1 first1, InputIt1 last1) : s1(first1, last1)
128 {}
129
130private:
131 friend detail::CachedDistanceBase<CachedDamerauLevenshtein<CharT1>, size_t, 0,
132 std::numeric_limits<int64_t>::max()>;
133 friend detail::CachedNormalizedMetricBase<CachedDamerauLevenshtein<CharT1>>;
134
135 template <typename InputIt2>
136 size_t maximum(const detail::Range<InputIt2>& s2) const
137 {
138 return std::max(s1.size(), s2.size());
139 }
140
141 template <typename InputIt2>
142 size_t _distance(const detail::Range<InputIt2>& s2, size_t score_cutoff, size_t) const
143 {
144 return rapidfuzz::experimental::damerau_levenshtein_distance(s1, s2, score_cutoff);
145 }
146
147 std::vector<CharT1> s1;
148};
149
150#ifdef RAPIDFUZZ_DEDUCTION_GUIDES
151template <typename Sentence1>
152explicit CachedDamerauLevenshtein(const Sentence1& s1_) -> CachedDamerauLevenshtein<char_type<Sentence1>>;
153
154template <typename InputIt1>
155CachedDamerauLevenshtein(InputIt1 first1, InputIt1 last1) -> CachedDamerauLevenshtein<iter_value_t<InputIt1>>;
156#endif
157
158} // namespace experimental
159
162} // namespace rapidfuzz