5#include <rapidfuzz/distance/DamerauLevenshtein.hpp>
6#include <rapidfuzz/distance/Hamming.hpp>
7#include <rapidfuzz/distance/Indel.hpp>
8#include <rapidfuzz/distance/Jaro.hpp>
9#include <rapidfuzz/distance/JaroWinkler.hpp>
10#include <rapidfuzz/distance/LCSseq.hpp>
11#include <rapidfuzz/distance/Levenshtein.hpp>
12#include <rapidfuzz/distance/OSA.hpp>
13#include <rapidfuzz/distance/Postfix.hpp>
14#include <rapidfuzz/distance/Prefix.hpp>
19template <
typename ReturnType,
typename InputIt1,
typename InputIt2>
20ReturnType editops_apply_impl(
const Editops& ops, InputIt1 first1, InputIt1 last1, InputIt2 first2,
23 auto len1 =
static_cast<size_t>(std::distance(first1, last1));
24 auto len2 =
static_cast<size_t>(std::distance(first2, last2));
27 res_str.resize(len1 + len2);
31 for (
const auto& op : ops) {
33 while (src_pos < op.src_pos) {
35 static_cast<typename ReturnType::value_type
>(first1[
static_cast<ptrdiff_t
>(src_pos)]);
42 case EditType::Replace:
44 static_cast<typename ReturnType::value_type
>(first2[
static_cast<ptrdiff_t
>(op.dest_pos)]);
48 case EditType::Insert:
50 static_cast<typename ReturnType::value_type
>(first2[
static_cast<ptrdiff_t
>(op.dest_pos)]);
53 case EditType::Delete: src_pos++;
break;
58 while (src_pos < len1) {
60 static_cast<typename ReturnType::value_type
>(first1[
static_cast<ptrdiff_t
>(src_pos)]);
65 res_str.resize(dest_pos);
69template <
typename ReturnType,
typename InputIt1,
typename InputIt2>
70ReturnType opcodes_apply_impl(
const Opcodes& ops, InputIt1 first1, InputIt1 last1, InputIt2 first2,
73 auto len1 =
static_cast<size_t>(std::distance(first1, last1));
74 auto len2 =
static_cast<size_t>(std::distance(first2, last2));
77 res_str.resize(len1 + len2);
80 for (
const auto& op : ops) {
83 for (
auto i = op.src_begin; i < op.src_end; ++i) {
85 static_cast<typename ReturnType::value_type
>(first1[
static_cast<ptrdiff_t
>(i)]);
88 case EditType::Replace:
89 case EditType::Insert:
90 for (
auto i = op.dest_begin; i < op.dest_end; ++i) {
92 static_cast<typename ReturnType::value_type
>(first2[
static_cast<ptrdiff_t
>(i)]);
95 case EditType::Delete:
break;
99 res_str.resize(dest_pos);
111template <
typename CharT,
typename InputIt1,
typename InputIt2>
112std::basic_string<CharT> editops_apply_str(
const Editops& ops, InputIt1 first1, InputIt1 last1,
113 InputIt2 first2, InputIt2 last2)
115 return detail::editops_apply_impl<std::basic_string<CharT>>(ops, first1, last1, first2, last2);
118template <
typename CharT,
typename Sentence1,
typename Sentence2>
119std::basic_string<CharT> editops_apply_str(
const Editops& ops,
const Sentence1& s1,
const Sentence2& s2)
121 return detail::editops_apply_impl<std::basic_string<CharT>>(ops, detail::to_begin(s1), detail::to_end(s1),
122 detail::to_begin(s2), detail::to_end(s2));
125template <
typename CharT,
typename InputIt1,
typename InputIt2>
126std::basic_string<CharT> opcodes_apply_str(
const Opcodes& ops, InputIt1 first1, InputIt1 last1,
127 InputIt2 first2, InputIt2 last2)
129 return detail::opcodes_apply_impl<std::basic_string<CharT>>(ops, first1, last1, first2, last2);
132template <
typename CharT,
typename Sentence1,
typename Sentence2>
133std::basic_string<CharT> opcodes_apply_str(
const Opcodes& ops,
const Sentence1& s1,
const Sentence2& s2)
135 return detail::opcodes_apply_impl<std::basic_string<CharT>>(ops, detail::to_begin(s1), detail::to_end(s1),
136 detail::to_begin(s2), detail::to_end(s2));
139template <
typename CharT,
typename InputIt1,
typename InputIt2>
140std::vector<CharT> editops_apply_vec(
const Editops& ops, InputIt1 first1, InputIt1 last1, InputIt2 first2,
143 return detail::editops_apply_impl<std::vector<CharT>>(ops, first1, last1, first2, last2);
146template <
typename CharT,
typename Sentence1,
typename Sentence2>
147std::vector<CharT> editops_apply_vec(
const Editops& ops,
const Sentence1& s1,
const Sentence2& s2)
149 return detail::editops_apply_impl<std::vector<CharT>>(ops, detail::to_begin(s1), detail::to_end(s1),
150 detail::to_begin(s2), detail::to_end(s2));
153template <
typename CharT,
typename InputIt1,
typename InputIt2>
154std::vector<CharT> opcodes_apply_vec(
const Opcodes& ops, InputIt1 first1, InputIt1 last1, InputIt2 first2,
157 return detail::opcodes_apply_impl<std::vector<CharT>>(ops, first1, last1, first2, last2);
160template <
typename CharT,
typename Sentence1,
typename Sentence2>
161std::vector<CharT> opcodes_apply_vec(
const Opcodes& ops,
const Sentence1& s1,
const Sentence2& s2)
163 return detail::opcodes_apply_impl<std::vector<CharT>>(ops, detail::to_begin(s1), detail::to_end(s1),
164 detail::to_begin(s2), detail::to_end(s2));