diff options
| author | Sam Varshavchik | 2020-12-02 22:04:37 -0500 |
|---|---|---|
| committer | Sam Varshavchik | 2020-12-02 22:04:37 -0500 |
| commit | 4ec018fb1ea69a5eab159f090e0512856f471ccc (patch) | |
| tree | 6b154ea28328037ce0fb532d80c35f9529cbf369 /unicode | |
| parent | 5c8538b7b36081ffc6ca6ffef0885a5fc0459826 (diff) | |
| download | courier-libs-4ec018fb1ea69a5eab159f090e0512856f471ccc.tar.bz2 | |
unicode::bidi_reorder - add optional substring indices.
Diffstat (limited to 'unicode')
| -rw-r--r-- | unicode/book.xml | 22 | ||||
| -rw-r--r-- | unicode/courier-unicode.h.in | 8 | ||||
| -rw-r--r-- | unicode/unicodecpp.C | 22 |
3 files changed, 43 insertions, 9 deletions
diff --git a/unicode/book.xml b/unicode/book.xml index c0e0485..4838364 100644 --- a/unicode/book.xml +++ b/unicode/book.xml @@ -2835,13 +2835,17 @@ See COPYING for distribution information. <funcdef>int <function>unicode::bidi_reorder</function></funcdef> <paramdef>std::u32string &<parameter>string</parameter></paramdef> <paramdef>std::vector<unicode_bidi_level_t> &<parameter>embedding_level</parameter></paramdef> - <paramdef>const std::function<void (size_t, size_t) noexcept> &<parameter>reorder_callback</parameter></paramdef> + <paramdef>const std::function<void (size_t, size_t) noexcept> &<parameter>reorder_callback</parameter>=[](size_t, size_t){}</paramdef> + <paramdef>size_t <parameter>starting_pos</parameter>=0</paramdef> + <paramdef>size_t <parameter>n</parameter>=(size_t)-1</paramdef> </funcprototype> <funcprototype> <funcdef>void <function>unicode::bidi_reorder</function></funcdef> <paramdef>std::vector<unicode_bidi_level_t> &<parameter>embedding_level</parameter></paramdef> - <paramdef>const std::function<void (size_t, size_t) noexcept> &<parameter>reorder_callback</parameter></paramdef> + <paramdef>const std::function<void (size_t, size_t) noexcept> &<parameter>reorder_callback</parameter>=[](size_t, size_t){}</paramdef> + <paramdef>size_t <parameter>starting_pos</parameter>=0</paramdef> + <paramdef>size_t <parameter>n</parameter>=(size_t)-1</paramdef> </funcprototype> <funcprototype> @@ -3012,6 +3016,20 @@ auto [levels, level]=unicode::bidi_calc(types); an empty string in case of a mismatch. </para> </listitem> + + <listitem> + <para> + <function>unicode::bidi_reorder</function> + reorders the entire <parameter>string</parameter> and its + <parameter>embedding_level</parameter>s by default. + The optional + <parameter>starting_pos</parameter> and + <parameter>n</parameter> parameters limit the reordering + to the indicated subset of the original string (specified + as the starting position offset index, and the number of + characters). + </para> + </listitem> </itemizedlist> <refsect2 id="unicode_cpp_bidi_literals"> diff --git a/unicode/courier-unicode.h.in b/unicode/courier-unicode.h.in index a3a59f4..469b456 100644 --- a/unicode/courier-unicode.h.in +++ b/unicode/courier-unicode.h.in @@ -2234,12 +2234,16 @@ std::tuple<std::vector<unicode_bidi_level_t>, int bidi_reorder(std::u32string &string, std::vector<unicode_bidi_level_t> &levels, const std::function<void (size_t, size_t)> - &reorder_callback=[](size_t, size_t){}); + &reorder_callback=[](size_t, size_t){}, + size_t starting_pos=0, + size_t n=(size_t)-1); //! Dry-run reorder bidirectional text void bidi_reorder(std::vector<unicode_bidi_level_t> &levels, const std::function<void (size_t, size_t)> - &reorder_callback=[](size_t, size_t){}); + &reorder_callback=[](size_t, size_t){}, + size_t starting_pos=0, + size_t n=(size_t)-1); //! Remove directional markers diff --git a/unicode/unicodecpp.C b/unicode/unicodecpp.C index 48cc3c6..8c43b31 100644 --- a/unicode/unicodecpp.C +++ b/unicode/unicodecpp.C @@ -669,19 +669,23 @@ extern "C" { int unicode::bidi_reorder(std::u32string &string, std::vector<unicode_bidi_level_t> &levels, - const std::function<void (size_t, size_t)> &lambda) + const std::function<void (size_t, size_t)> &lambda, + size_t pos, + size_t n) { size_t s=string.size(); if (s != levels.size()) return -1; - if (!s) + if (pos >= s) return 0; + if (n > s-pos) + n=s-pos; cb_wrapper<void (size_t, size_t)> cb{lambda}; - unicode_bidi_reorder(&string[0], &levels[0], s, + unicode_bidi_reorder(&string[pos], &levels[pos], n, reorder_callback, reinterpret_cast<void *>(&cb)); @@ -690,16 +694,24 @@ int unicode::bidi_reorder(std::u32string &string, } void unicode::bidi_reorder(std::vector<unicode_bidi_level_t> &levels, - const std::function<void (size_t, size_t)> &lambda) + const std::function<void (size_t, size_t)> &lambda, + size_t pos, + size_t n) { size_t s=levels.size(); if (!s) return; + if (pos >= s) + return; + + if (n > s-pos) + n=s-pos; + cb_wrapper<void (size_t, size_t)> cb{lambda}; - unicode_bidi_reorder(0, &levels[0], s, reorder_callback, + unicode_bidi_reorder(0, &levels[pos], n, reorder_callback, reinterpret_cast<void *>(&cb)); cb.rethrow(); |
