3#include <rapidfuzz/details/Range.hpp>
4#include <rapidfuzz/details/type_traits.hpp>
9template <
typename InputIt>
10class SplittedSentenceView {
12 using CharT = iter_value_t<InputIt>;
14 SplittedSentenceView(RangeVec<InputIt> sentence)
noexcept(
15 std::is_nothrow_move_constructible<RangeVec<InputIt>>::value)
16 : m_sentence(std::move(sentence))
29 return m_sentence.empty();
32 size_t word_count()
const
34 return m_sentence.size();
37 std::vector<CharT> join()
const;
39 const RangeVec<InputIt>& words()
const
45 RangeVec<InputIt> m_sentence;
48template <
typename InputIt>
49size_t SplittedSentenceView<InputIt>::dedupe()
51 size_t old_word_count = word_count();
52 m_sentence.erase(std::unique(m_sentence.begin(), m_sentence.end()), m_sentence.end());
53 return old_word_count - word_count();
56template <
typename InputIt>
57size_t SplittedSentenceView<InputIt>::size()
const
59 if (m_sentence.empty())
return 0;
62 size_t result = m_sentence.size() - 1;
63 for (
const auto& word : m_sentence) {
64 result +=
static_cast<size_t>(std::distance(word.begin(), word.end()));
70template <
typename InputIt>
71auto SplittedSentenceView<InputIt>::join() const -> std::vector<CharT>
73 if (m_sentence.empty()) {
74 return std::vector<CharT>();
77 auto sentence_iter = m_sentence.begin();
78 std::vector<CharT> joined(sentence_iter->begin(), sentence_iter->end());
80 for (; sentence_iter != m_sentence.end(); ++sentence_iter) {
81 joined.push_back(0x20);
82 joined.insert(joined.end(), sentence_iter->begin(), sentence_iter->end());