[bit-set-invertible] Implement get_min/max
This commit is contained in:
parent
18f50275ed
commit
8aa92ff8f0
|
@ -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;
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue