[bit-set-invertible] Implement a couple other missing corner cases

Also, in bit-set, don't compute population in is_equal/is_subset()
if we don't have it computed already.
This commit is contained in:
Behdad Esfahbod 2021-08-19 14:59:57 -06:00
parent 2579dc648f
commit e8911d137c
2 changed files with 12 additions and 9 deletions

View File

@ -123,11 +123,10 @@ struct hb_bit_set_invertible_t
bool is_subset (const hb_bit_set_invertible_t &larger_set) const bool is_subset (const hb_bit_set_invertible_t &larger_set) const
{ {
if (unlikely (inverted && !larger_set.inverted)) return false; /*XXX*/ if (unlikely (inverted != larger_set.inverted))
if (unlikely (!inverted && larger_set.inverted))
return hb_all (hb_iter (s) | hb_map (larger_set.s)); return hb_all (hb_iter (s) | hb_map (larger_set.s));
/* inverted == larger_set.inverted */ else
return unlikely (inverted) ? larger_set.s.is_subset (s) : s.is_subset (larger_set.s); return unlikely (inverted) ? larger_set.s.is_subset (s) : s.is_subset (larger_set.s);
} }
protected: protected:

View File

@ -342,7 +342,8 @@ struct hb_bit_set_t
bool is_equal (const hb_bit_set_t &other) const bool is_equal (const hb_bit_set_t &other) const
{ {
if (get_population () != other.get_population ()) if (has_population () && other.has_population () &&
get_population () != other.get_population ())
return false; return false;
unsigned int na = pages.length; unsigned int na = pages.length;
@ -369,9 +370,11 @@ struct hb_bit_set_t
bool is_subset (const hb_bit_set_t &larger_set) const bool is_subset (const hb_bit_set_t &larger_set) const
{ {
/* TODO: Merge this and is_equal() into something like process(). */ // /* TODO: Merge this and is_equal() into something like process(). */
if (unlikely(larger_set.is_empty ()))
return is_empty (); if (has_population () && larger_set.has_population () &&
get_population () != larger_set.get_population ())
return false;
uint32_t spi = 0; uint32_t spi = 0;
for (uint32_t lpi = 0; spi < page_map.length && lpi < larger_set.page_map.length; lpi++) for (uint32_t lpi = 0; spi < page_map.length && lpi < larger_set.page_map.length; lpi++)
@ -698,9 +701,10 @@ struct hb_bit_set_t
return true; return true;
} }
bool has_population () const { return population != UINT_MAX; }
unsigned int get_population () const unsigned int get_population () const
{ {
if (population != UINT_MAX) if (has_population ())
return population; return population;
unsigned int pop = 0; unsigned int pop = 0;