Add option to insert a sorted arrays of values to sets.
This commit is contained in:
parent
7a1e79c3ba
commit
ef588ea97b
|
@ -203,7 +203,7 @@ struct hb_bit_set_t
|
||||||
bool set_sorted_array (bool v, const T *array, unsigned int count, unsigned int stride=sizeof(T))
|
bool set_sorted_array (bool v, const T *array, unsigned int count, unsigned int stride=sizeof(T))
|
||||||
{
|
{
|
||||||
if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
|
if (unlikely (!successful)) return true; /* https://github.com/harfbuzz/harfbuzz/issues/657 */
|
||||||
if (!count) return true;
|
if (unlikely (!count)) return true;
|
||||||
dirty ();
|
dirty ();
|
||||||
hb_codepoint_t g = *array;
|
hb_codepoint_t g = *array;
|
||||||
hb_codepoint_t last_g = g;
|
hb_codepoint_t last_g = g;
|
||||||
|
@ -222,7 +222,7 @@ struct hb_bit_set_t
|
||||||
if (v || page) /* The v check is to optimize out the page check if v is true. */
|
if (v || page) /* The v check is to optimize out the page check if v is true. */
|
||||||
page->add (g);
|
page->add (g);
|
||||||
|
|
||||||
array = (const T *) ((const char *) array + stride);
|
array = &StructAtOffsetUnaligned<T> (array, stride);
|
||||||
count--;
|
count--;
|
||||||
}
|
}
|
||||||
while (count && (g = *array, g < end));
|
while (count && (g = *array, g < end));
|
||||||
|
|
|
@ -61,6 +61,24 @@ hb_set_create ()
|
||||||
return set;
|
return set;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a set initially populated with num_codepoint codepoints, which must
|
||||||
|
* be in increasing order.
|
||||||
|
*
|
||||||
|
* Since: REPLACEME
|
||||||
|
*/
|
||||||
|
HB_EXTERN void
|
||||||
|
hb_set_add_sorted_array (hb_set_t *set,
|
||||||
|
const hb_codepoint_t *sorted_codepoints,
|
||||||
|
unsigned int num_codepoints)
|
||||||
|
{
|
||||||
|
if (unlikely(!set || !sorted_codepoints || !num_codepoints)) return;
|
||||||
|
|
||||||
|
set->add_sorted_array (sorted_codepoints,
|
||||||
|
num_codepoints,
|
||||||
|
sizeof(hb_codepoint_t));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* hb_set_get_empty:
|
* hb_set_get_empty:
|
||||||
*
|
*
|
||||||
|
|
|
@ -60,6 +60,11 @@ typedef struct hb_set_t hb_set_t;
|
||||||
HB_EXTERN hb_set_t *
|
HB_EXTERN hb_set_t *
|
||||||
hb_set_create (void);
|
hb_set_create (void);
|
||||||
|
|
||||||
|
HB_EXTERN void
|
||||||
|
hb_set_add_sorted_array (hb_set_t *set,
|
||||||
|
const hb_codepoint_t *sorted_codepoints,
|
||||||
|
unsigned int num_codepoints);
|
||||||
|
|
||||||
HB_EXTERN hb_set_t *
|
HB_EXTERN hb_set_t *
|
||||||
hb_set_get_empty (void);
|
hb_set_get_empty (void);
|
||||||
|
|
||||||
|
|
|
@ -1067,6 +1067,23 @@ test_set_inverted_operations (void)
|
||||||
g_assert (all_succeeded);
|
g_assert (all_succeeded);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
test_hb_set_add_sorted_array (void)
|
||||||
|
{
|
||||||
|
hb_set_t *set = hb_set_create ();
|
||||||
|
hb_codepoint_t array[7] = {1, 2, 3, 1000, 2000, 2001, 2002};
|
||||||
|
hb_set_add_sorted_array (set, array, 7);
|
||||||
|
g_assert_cmpint (hb_set_get_population (set), ==, 7);
|
||||||
|
g_assert (hb_set_has (set, 1));
|
||||||
|
g_assert (hb_set_has (set, 2));
|
||||||
|
g_assert (hb_set_has (set, 3));
|
||||||
|
g_assert (hb_set_has (set, 1000));
|
||||||
|
g_assert (hb_set_has (set, 2000));
|
||||||
|
g_assert (hb_set_has (set, 2001));
|
||||||
|
g_assert (hb_set_has (set, 2002));
|
||||||
|
hb_set_destroy (set);
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main (int argc, char **argv)
|
main (int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
@ -1090,5 +1107,7 @@ main (int argc, char **argv)
|
||||||
hb_test_add (test_set_inverted_equality);
|
hb_test_add (test_set_inverted_equality);
|
||||||
hb_test_add (test_set_inverted_operations);
|
hb_test_add (test_set_inverted_operations);
|
||||||
|
|
||||||
|
hb_test_add (test_hb_set_add_sorted_array);
|
||||||
|
|
||||||
return hb_test_run();
|
return hb_test_run();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue