[bit-set-invertible] Implement next/previous
This makes invertible set functionality complete.
This commit is contained in:
parent
c27f5b1288
commit
248ad3bce5
|
@ -177,16 +177,53 @@ struct hb_bit_set_invertible_t
|
||||||
|
|
||||||
bool next (hb_codepoint_t *codepoint) const
|
bool next (hb_codepoint_t *codepoint) const
|
||||||
{
|
{
|
||||||
/*XXX(inverted)*/
|
if (likely (!inverted))
|
||||||
return s.next (codepoint);
|
return s.next (codepoint);
|
||||||
|
|
||||||
|
auto old = *codepoint;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
auto v = old;
|
||||||
|
s.next (&v);
|
||||||
|
if (old + 1 < v)
|
||||||
|
{
|
||||||
|
*codepoint = old + 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
old++;
|
||||||
|
}
|
||||||
|
while (old != INVALID);
|
||||||
|
|
||||||
|
*codepoint = INVALID;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
bool previous (hb_codepoint_t *codepoint) const
|
bool previous (hb_codepoint_t *codepoint) const
|
||||||
{
|
{
|
||||||
/*XXX(inverted)*/
|
if (likely (!inverted))
|
||||||
return s.previous (codepoint);
|
return s.previous (codepoint);
|
||||||
|
|
||||||
|
auto old = *codepoint;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
auto v = old;
|
||||||
|
s.previous (&v);
|
||||||
|
if (old - 1 > v)
|
||||||
|
{
|
||||||
|
*codepoint = old - 1;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
old--;
|
||||||
|
}
|
||||||
|
while (old != INVALID);
|
||||||
|
|
||||||
|
*codepoint = INVALID;
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
bool next_range (hb_codepoint_t *first, hb_codepoint_t *last) const
|
bool next_range (hb_codepoint_t *first, hb_codepoint_t *last) const
|
||||||
{
|
{
|
||||||
|
if (likely (!inverted))
|
||||||
|
return s.next_range (first, last);
|
||||||
|
|
||||||
hb_codepoint_t i;
|
hb_codepoint_t i;
|
||||||
|
|
||||||
i = *last;
|
i = *last;
|
||||||
|
@ -205,6 +242,9 @@ struct hb_bit_set_invertible_t
|
||||||
}
|
}
|
||||||
bool previous_range (hb_codepoint_t *first, hb_codepoint_t *last) const
|
bool previous_range (hb_codepoint_t *first, hb_codepoint_t *last) const
|
||||||
{
|
{
|
||||||
|
if (likely (!inverted))
|
||||||
|
return s.previous_range (first, last);
|
||||||
|
|
||||||
hb_codepoint_t i;
|
hb_codepoint_t i;
|
||||||
|
|
||||||
i = *first;
|
i = *first;
|
||||||
|
|
Loading…
Reference in New Issue