ZRCola::mapping is generic now
This commit is contained in:
parent
5e4331903b
commit
a021dd31f7
@ -51,7 +51,7 @@ void wxZRColaComposerPanel::OnDecomposedPaint(wxPaintEvent& event)
|
||||
// Save new selection first, to avoid loop.
|
||||
m_selDecomposed.first = from;
|
||||
m_selDecomposed.second = to;
|
||||
m_composed->SetSelection(m_mapping.to_composed(from), m_mapping.to_composed(to));
|
||||
m_composed->SetSelection(m_mapping.to_src(from), m_mapping.to_src(to));
|
||||
}
|
||||
}
|
||||
|
||||
@ -73,6 +73,7 @@ void wxZRColaComposerPanel::OnDecomposedText(wxCommandEvent& event)
|
||||
|
||||
std::wstring dst;
|
||||
((ZRColaApp*)wxTheApp)->m_t_db.Compose(src.data(), src.size(), dst, &m_mapping);
|
||||
m_mapping.invert();
|
||||
|
||||
long from, to;
|
||||
m_decomposed->GetSelection(&from, &to);
|
||||
@ -80,7 +81,7 @@ void wxZRColaComposerPanel::OnDecomposedText(wxCommandEvent& event)
|
||||
// Update composed text.
|
||||
m_progress = true;
|
||||
m_composed->SetValue(dst);
|
||||
m_composed->SetSelection(m_mapping.to_composed(from), m_mapping.to_composed(to));
|
||||
m_composed->SetSelection(m_mapping.to_src(from), m_mapping.to_src(to));
|
||||
event.Skip();
|
||||
m_progress = false;
|
||||
}
|
||||
@ -98,7 +99,7 @@ void wxZRColaComposerPanel::OnComposedPaint(wxPaintEvent& event)
|
||||
// Save new selection first, to avoid loop.
|
||||
m_selComposed.first = from;
|
||||
m_selComposed.second = to;
|
||||
m_decomposed->SetSelection(m_mapping.to_decomposed(from), m_mapping.to_decomposed(to));
|
||||
m_decomposed->SetSelection(m_mapping.to_dst(from), m_mapping.to_dst(to));
|
||||
}
|
||||
}
|
||||
|
||||
@ -132,7 +133,7 @@ void wxZRColaComposerPanel::OnComposedText(wxCommandEvent& event)
|
||||
// Update decomposed text.
|
||||
m_progress = true;
|
||||
m_decomposed->SetValue(dst);
|
||||
m_decomposed->SetSelection(m_mapping.to_decomposed(from), m_mapping.to_decomposed(to));
|
||||
m_decomposed->SetSelection(m_mapping.to_dst(from), m_mapping.to_dst(to));
|
||||
event.Skip();
|
||||
m_progress = false;
|
||||
}
|
||||
|
@ -223,15 +223,20 @@ namespace ZRCola {
|
||||
|
||||
|
||||
///
|
||||
/// Composed-decomposed index transformation mapping
|
||||
/// Source-destination index transformation mapping
|
||||
///
|
||||
class ZRCOLA_NOVTABLE ZRCOLA_API mapping {
|
||||
public:
|
||||
size_t cmp; ///< Character index in composed string
|
||||
size_t decmp; ///< Character index in decomposed string
|
||||
size_t src; ///< Character index in source string
|
||||
size_t dst; ///< Character index in destination string
|
||||
|
||||
inline mapping() {};
|
||||
inline mapping(_In_ size_t c, _In_ size_t d) : cmp(c), decmp(d) {}
|
||||
inline mapping(_In_ size_t s, _In_ size_t d) : src(s), dst(d) {}
|
||||
|
||||
///
|
||||
/// Reverses source and destination indexes
|
||||
///
|
||||
inline void invert() { size_t tmp = src; src = dst; dst = tmp; }
|
||||
};
|
||||
|
||||
|
||||
@ -241,22 +246,31 @@ namespace ZRCola {
|
||||
class ZRCOLA_API mapping_vector : public std::vector<mapping> {
|
||||
public:
|
||||
///
|
||||
/// Transforms character index of decomposed to composed string
|
||||
/// Transforms character index of destination to source
|
||||
///
|
||||
/// \param[in] decmp Character index in decomposed string
|
||||
/// \param[in] decmp Character index in destination string
|
||||
///
|
||||
/// \returns Character index in composed string
|
||||
/// \returns Character index in source string
|
||||
///
|
||||
size_t to_composed(_In_ size_t decmp) const;
|
||||
size_t to_src(_In_ size_t dst) const;
|
||||
|
||||
///
|
||||
/// Transforms destination index to source index
|
||||
/// Transforms source index to destination index
|
||||
///
|
||||
/// \param[in] cmp Character index in composed string
|
||||
/// \param[in] cmp Character index in source string
|
||||
///
|
||||
/// \returns Character index in decomposed string
|
||||
/// \returns Character index in destination string
|
||||
///
|
||||
size_t to_decomposed(_In_ size_t cmp) const;
|
||||
size_t to_dst(_In_ size_t src) const;
|
||||
|
||||
///
|
||||
/// Reverses source and destination indexes
|
||||
///
|
||||
inline void invert()
|
||||
{
|
||||
for (iterator i = begin(), iEnd = end(); i != iEnd; ++i)
|
||||
i->invert();
|
||||
}
|
||||
};
|
||||
};
|
||||
|
||||
|
@ -20,51 +20,51 @@
|
||||
#include "stdafx.h"
|
||||
|
||||
|
||||
size_t ZRCola::mapping_vector::to_composed(_In_ size_t decmp) const
|
||||
size_t ZRCola::mapping_vector::to_src(_In_ size_t dst) const
|
||||
{
|
||||
for (size_type l = 0, r = size();;) {
|
||||
if (l < r) {
|
||||
size_type m = (l + r) / 2;
|
||||
const mapping &el = (*this)[m];
|
||||
|
||||
if (decmp < el.decmp) r = m;
|
||||
else if (el.decmp < decmp) l = m + 1;
|
||||
if ( dst < el.dst) r = m;
|
||||
else if (el.dst < dst) l = m + 1;
|
||||
else {
|
||||
// An exact match found.
|
||||
return el.cmp;
|
||||
return el.src;
|
||||
}
|
||||
} else if (l) {
|
||||
// We found a map interval.
|
||||
const mapping &el = (*this)[l - 1];
|
||||
return el.cmp + (decmp - el.decmp);
|
||||
return el.src + (dst - el.dst);
|
||||
} else {
|
||||
// The decomposed character index is far left.
|
||||
return decmp;
|
||||
// The destination character index is far left.
|
||||
return dst;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
size_t ZRCola::mapping_vector::to_decomposed(_In_ size_t cmp) const
|
||||
size_t ZRCola::mapping_vector::to_dst(_In_ size_t src) const
|
||||
{
|
||||
for (size_type l = 0, r = size();;) {
|
||||
if (l < r) {
|
||||
size_type m = (l + r) / 2;
|
||||
const mapping &el = (*this)[m];
|
||||
|
||||
if (cmp < el.cmp) r = m;
|
||||
else if (el.cmp < cmp) l = m + 1;
|
||||
if ( src < el.src) r = m;
|
||||
else if (el.src < src) l = m + 1;
|
||||
else {
|
||||
// An exact match found.
|
||||
return el.decmp;
|
||||
return el.dst;
|
||||
}
|
||||
} else if (l) {
|
||||
// We found a map interval.
|
||||
const mapping &el = (*this)[l - 1];
|
||||
return el.decmp + (cmp - el.cmp);
|
||||
return el.dst + (src - el.src);
|
||||
} else {
|
||||
// The composed character index is far left.
|
||||
return cmp;
|
||||
// The source character index is far left.
|
||||
return src;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -91,7 +91,7 @@ void ZRCola::translation_db::Compose(_In_z_count_(inputMax) const wchar_t* input
|
||||
i += trans.str_len;
|
||||
if (trans.str_len > 1 && map) {
|
||||
// Mapping changed.
|
||||
map->push_back(ZRCola::mapping(output.length(), i));
|
||||
map->push_back(ZRCola::mapping(i, output.length()));
|
||||
}
|
||||
} else {
|
||||
// The match was not found.
|
||||
|
Loading…
x
Reference in New Issue
Block a user