[bit-set-invertible] Implement get_min/max

This commit is contained in:
Behdad Esfahbod 2021-08-18 23:01:06 -06:00
parent 18f50275ed
commit 8aa92ff8f0
2 changed files with 15 additions and 5 deletions

View File

@ -146,9 +146,9 @@ struct hb_bit_set_invertible_t
{ return inverted ? INVALID - s.get_population () : s.get_population (); }
hb_codepoint_t get_min () const
{ return /*XXX(inverted)*/s.get_min (); }
{ return s.get_min (inverted); }
hb_codepoint_t get_max () const
{ return /*XXX(inverted)*/s.get_max (); }
{ return inverted ? /*XXX*/ INVALID - 1 : s.get_max (); }
static constexpr hb_codepoint_t INVALID = hb_bit_set_t::INVALID;

View File

@ -711,16 +711,26 @@ struct hb_bit_set_t
population = pop;
return pop;
}
hb_codepoint_t get_min () const
hb_codepoint_t get_min (bool inverted = false) const
{
unsigned last_major = (unsigned) -1;
unsigned count = pages.length;
for (unsigned i = 0; i < count; i++)
{
const auto& map = page_map[i];
const auto& page = pages[map.index];
if (!page.is_empty ())
return map.major * page_t::PAGE_BITS + page.get_min ();
if (inverted)
{
if (last_major + 1 != map.major)
return (last_major + 1) * page_t::PAGE_BITS;
last_major = map.major;
}
if (!page.is_empty (inverted))
return map.major * page_t::PAGE_BITS + page.get_min (inverted);
}
return INVALID;
}