tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

hb-set.cc (13636B)


      1 /*
      2 * Copyright © 2012  Google, Inc.
      3 *
      4 *  This is part of HarfBuzz, a text shaping library.
      5 *
      6 * Permission is hereby granted, without written agreement and without
      7 * license or royalty fees, to use, copy, modify, and distribute this
      8 * software and its documentation for any purpose, provided that the
      9 * above copyright notice and the following two paragraphs appear in
     10 * all copies of this software.
     11 *
     12 * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
     13 * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
     14 * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
     15 * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
     16 * DAMAGE.
     17 *
     18 * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
     19 * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
     20 * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
     21 * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
     22 * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
     23 *
     24 * Google Author(s): Behdad Esfahbod
     25 */
     26 
     27 #include "hb-set.hh"
     28 
     29 
     30 /**
     31 * SECTION:hb-set
     32 * @title: hb-set
     33 * @short_description: Objects representing a set of integers
     34 * @include: hb.h
     35 *
     36 * Set objects represent a mathematical set of integer values.  They are
     37 * used in non-shaping APIs to query certain sets of characters or glyphs,
     38 * or other integer values.
     39 **/
     40 
     41 
     42 /**
     43 * hb_set_create:
     44 *
     45 * Creates a new, initially empty set.
     46 *
     47 * Return value: (transfer full): The new #hb_set_t
     48 *
     49 * Since: 0.9.2
     50 **/
     51 hb_set_t *
     52 hb_set_create ()
     53 {
     54  hb_set_t *set;
     55 
     56  if (!(set = hb_object_create<hb_set_t> ()))
     57    return hb_set_get_empty ();
     58 
     59  return set;
     60 }
     61 
     62 /**
     63 * hb_set_get_empty:
     64 *
     65 * Fetches the singleton empty #hb_set_t.
     66 *
     67 * Return value: (transfer full): The empty #hb_set_t
     68 *
     69 * Since: 0.9.2
     70 **/
     71 hb_set_t *
     72 hb_set_get_empty ()
     73 {
     74  return const_cast<hb_set_t *> (&Null (hb_set_t));
     75 }
     76 
     77 /**
     78 * hb_set_reference: (skip)
     79 * @set: A set
     80 *
     81 * Increases the reference count on a set.
     82 *
     83 * Return value: (transfer full): The set
     84 *
     85 * Since: 0.9.2
     86 **/
     87 hb_set_t *
     88 hb_set_reference (hb_set_t *set)
     89 {
     90  return hb_object_reference (set);
     91 }
     92 
     93 /**
     94 * hb_set_destroy: (skip)
     95 * @set: A set
     96 *
     97 * Decreases the reference count on a set. When
     98 * the reference count reaches zero, the set is
     99 * destroyed, freeing all memory.
    100 *
    101 * Since: 0.9.2
    102 **/
    103 void
    104 hb_set_destroy (hb_set_t *set)
    105 {
    106  if (!hb_object_destroy (set)) return;
    107 
    108  hb_free (set);
    109 }
    110 
    111 /**
    112 * hb_set_set_user_data: (skip)
    113 * @set: A set
    114 * @key: The user-data key to set
    115 * @data: A pointer to the user data to set
    116 * @destroy: (nullable): A callback to call when @data is not needed anymore
    117 * @replace: Whether to replace an existing data with the same key
    118 *
    119 * Attaches a user-data key/data pair to the specified set.
    120 *
    121 * Return value: `true` if success, `false` otherwise
    122 *
    123 * Since: 0.9.2
    124 **/
    125 hb_bool_t
    126 hb_set_set_user_data (hb_set_t           *set,
    127 	      hb_user_data_key_t *key,
    128 	      void *              data,
    129 	      hb_destroy_func_t   destroy,
    130 	      hb_bool_t           replace)
    131 {
    132  return hb_object_set_user_data (set, key, data, destroy, replace);
    133 }
    134 
    135 /**
    136 * hb_set_get_user_data: (skip)
    137 * @set: A set
    138 * @key: The user-data key to query
    139 *
    140 * Fetches the user data associated with the specified key,
    141 * attached to the specified set.
    142 *
    143 * Return value: (transfer none): A pointer to the user data
    144 *
    145 * Since: 0.9.2
    146 **/
    147 void *
    148 hb_set_get_user_data (const hb_set_t     *set,
    149 	      hb_user_data_key_t *key)
    150 {
    151  return hb_object_get_user_data (set, key);
    152 }
    153 
    154 
    155 /**
    156 * hb_set_allocation_successful:
    157 * @set: A set
    158 *
    159 * Tests whether memory allocation for a set was successful.
    160 *
    161 * Return value: `true` if allocation succeeded, `false` otherwise
    162 *
    163 * Since: 0.9.2
    164 **/
    165 hb_bool_t
    166 hb_set_allocation_successful (const hb_set_t  *set)
    167 {
    168  return !set->in_error ();
    169 }
    170 
    171 /**
    172 * hb_set_copy:
    173 * @set: A set
    174 *
    175 * Allocate a copy of @set.
    176 *
    177 * Return value: (transfer full): Newly-allocated set.
    178 *
    179 * Since: 2.8.2
    180 **/
    181 hb_set_t *
    182 hb_set_copy (const hb_set_t *set)
    183 {
    184  hb_set_t *copy = hb_set_create ();
    185  if (unlikely (copy->in_error ()))
    186    return hb_set_get_empty ();
    187 
    188  copy->set (*set);
    189  return copy;
    190 }
    191 
    192 /**
    193 * hb_set_clear:
    194 * @set: A set
    195 *
    196 * Clears out the contents of a set.
    197 *
    198 * Since: 0.9.2
    199 **/
    200 void
    201 hb_set_clear (hb_set_t *set)
    202 {
    203  /* Immutable-safe. */
    204  set->clear ();
    205 }
    206 
    207 /**
    208 * hb_set_is_empty:
    209 * @set: a set.
    210 *
    211 * Tests whether a set is empty (contains no elements).
    212 *
    213 * Return value: `true` if @set is empty
    214 *
    215 * Since: 0.9.7
    216 **/
    217 hb_bool_t
    218 hb_set_is_empty (const hb_set_t *set)
    219 {
    220  return set->is_empty ();
    221 }
    222 
    223 /**
    224 * hb_set_has:
    225 * @set: A set
    226 * @codepoint: The element to query
    227 *
    228 * Tests whether @codepoint belongs to @set.
    229 *
    230 * Return value: `true` if @codepoint is in @set, `false` otherwise
    231 *
    232 * Since: 0.9.2
    233 **/
    234 hb_bool_t
    235 hb_set_has (const hb_set_t *set,
    236     hb_codepoint_t  codepoint)
    237 {
    238  return set->has (codepoint);
    239 }
    240 
    241 /**
    242 * hb_set_add:
    243 * @set: A set
    244 * @codepoint: The element to add to @set
    245 *
    246 * Adds @codepoint to @set.
    247 *
    248 * Since: 0.9.2
    249 **/
    250 void
    251 hb_set_add (hb_set_t       *set,
    252     hb_codepoint_t  codepoint)
    253 {
    254  /* Immutable-safe. */
    255  set->add (codepoint);
    256 }
    257 
    258 /**
    259 * hb_set_add_sorted_array:
    260 * @set: A set
    261 * @sorted_codepoints: (array length=num_codepoints): Array of codepoints to add
    262 * @num_codepoints: Length of @sorted_codepoints
    263 *
    264 * Adds @num_codepoints codepoints to a set at once.
    265 * The codepoints array must be in increasing order,
    266 * with size at least @num_codepoints.
    267 *
    268 * Since: 4.1.0
    269 */
    270 HB_EXTERN void
    271 hb_set_add_sorted_array (hb_set_t             *set,
    272 	         const hb_codepoint_t *sorted_codepoints,
    273 	         unsigned int          num_codepoints)
    274 {
    275  /* Immutable-safe. */
    276  set->add_sorted_array (sorted_codepoints,
    277 	         num_codepoints,
    278 	         sizeof(hb_codepoint_t));
    279 }
    280 
    281 /**
    282 * hb_set_add_range:
    283 * @set: A set
    284 * @first: The first element to add to @set
    285 * @last: The final element to add to @set
    286 *
    287 * Adds all of the elements from @first to @last
    288 * (inclusive) to @set.
    289 *
    290 * Since: 0.9.7
    291 **/
    292 void
    293 hb_set_add_range (hb_set_t       *set,
    294 	  hb_codepoint_t  first,
    295 	  hb_codepoint_t  last)
    296 {
    297  /* Immutable-safe. */
    298  set->add_range (first, last);
    299 }
    300 
    301 /**
    302 * hb_set_del:
    303 * @set: A set
    304 * @codepoint: Removes @codepoint from @set
    305 *
    306 * Removes @codepoint from @set.
    307 *
    308 * Since: 0.9.2
    309 **/
    310 void
    311 hb_set_del (hb_set_t       *set,
    312     hb_codepoint_t  codepoint)
    313 {
    314  /* Immutable-safe. */
    315  set->del (codepoint);
    316 }
    317 
    318 /**
    319 * hb_set_del_range:
    320 * @set: A set
    321 * @first: The first element to remove from @set
    322 * @last: The final element to remove from @set
    323 *
    324 * Removes all of the elements from @first to @last
    325 * (inclusive) from @set.
    326 *
    327 * If @last is #HB_SET_VALUE_INVALID, then all values
    328 * greater than or equal to @first are removed.
    329 *
    330 * Since: 0.9.7
    331 **/
    332 void
    333 hb_set_del_range (hb_set_t       *set,
    334 	  hb_codepoint_t  first,
    335 	  hb_codepoint_t  last)
    336 {
    337  /* Immutable-safe. */
    338  set->del_range (first, last);
    339 }
    340 
    341 /**
    342 * hb_set_is_equal:
    343 * @set: A set
    344 * @other: Another set
    345 *
    346 * Tests whether @set and @other are equal (contain the same
    347 * elements).
    348 *
    349 * Return value: `true` if the two sets are equal, `false` otherwise.
    350 *
    351 * Since: 0.9.7
    352 **/
    353 hb_bool_t
    354 hb_set_is_equal (const hb_set_t *set,
    355 	 const hb_set_t *other)
    356 {
    357  return set->is_equal (*other);
    358 }
    359 
    360 /**
    361 * hb_set_hash:
    362 * @set: A set
    363 *
    364 * Creates a hash representing @set.
    365 *
    366 * Return value:
    367 * A hash of @set.
    368 *
    369 * Since: 4.4.0
    370 **/
    371 HB_EXTERN unsigned int
    372 hb_set_hash (const hb_set_t *set)
    373 {
    374  return set->hash ();
    375 }
    376 
    377 /**
    378 * hb_set_is_subset:
    379 * @set: A set
    380 * @larger_set: Another set
    381 *
    382 * Tests whether @set is a subset of @larger_set.
    383 *
    384 * Return value: `true` if the @set is a subset of (or equal to) @larger_set, `false` otherwise.
    385 *
    386 * Since: 1.8.1
    387 **/
    388 hb_bool_t
    389 hb_set_is_subset (const hb_set_t *set,
    390 	  const hb_set_t *larger_set)
    391 {
    392  return set->is_subset (*larger_set);
    393 }
    394 
    395 /**
    396 * hb_set_set:
    397 * @set: A set
    398 * @other: Another set
    399 *
    400 * Makes the contents of @set equal to the contents of @other.
    401 *
    402 * Since: 0.9.2
    403 **/
    404 void
    405 hb_set_set (hb_set_t       *set,
    406     const hb_set_t *other)
    407 {
    408  /* Immutable-safe. */
    409  set->set (*other);
    410 }
    411 
    412 /**
    413 * hb_set_union:
    414 * @set: A set
    415 * @other: Another set
    416 *
    417 * Makes @set the union of @set and @other.
    418 *
    419 * Since: 0.9.2
    420 **/
    421 void
    422 hb_set_union (hb_set_t       *set,
    423       const hb_set_t *other)
    424 {
    425  /* Immutable-safe. */
    426  set->union_ (*other);
    427 }
    428 
    429 /**
    430 * hb_set_intersect:
    431 * @set: A set
    432 * @other: Another set
    433 *
    434 * Makes @set the intersection of @set and @other.
    435 *
    436 * Since: 0.9.2
    437 **/
    438 void
    439 hb_set_intersect (hb_set_t       *set,
    440 	  const hb_set_t *other)
    441 {
    442  /* Immutable-safe. */
    443  set->intersect (*other);
    444 }
    445 
    446 /**
    447 * hb_set_subtract:
    448 * @set: A set
    449 * @other: Another set
    450 *
    451 * Subtracts the contents of @other from @set.
    452 *
    453 * Since: 0.9.2
    454 **/
    455 void
    456 hb_set_subtract (hb_set_t       *set,
    457 	 const hb_set_t *other)
    458 {
    459  /* Immutable-safe. */
    460  set->subtract (*other);
    461 }
    462 
    463 /**
    464 * hb_set_symmetric_difference:
    465 * @set: A set
    466 * @other: Another set
    467 *
    468 * Makes @set the symmetric difference of @set
    469 * and @other.
    470 *
    471 * Since: 0.9.2
    472 **/
    473 void
    474 hb_set_symmetric_difference (hb_set_t       *set,
    475 		     const hb_set_t *other)
    476 {
    477  /* Immutable-safe. */
    478  set->symmetric_difference (*other);
    479 }
    480 
    481 /**
    482 * hb_set_invert:
    483 * @set: A set
    484 *
    485 * Inverts the contents of @set.
    486 *
    487 * Since: 3.0.0
    488 **/
    489 void
    490 hb_set_invert (hb_set_t *set)
    491 {
    492  /* Immutable-safe. */
    493  set->invert ();
    494 }
    495 
    496 /**
    497 * hb_set_is_inverted:
    498 * @set: A set
    499 *
    500 * Returns whether the set is inverted.
    501 *
    502 * Return value: `true` if the set is inverted, `false` otherwise
    503 *
    504 * Since: 7.0.0
    505 **/
    506 hb_bool_t
    507 hb_set_is_inverted (const hb_set_t *set)
    508 {
    509  return set->is_inverted ();
    510 }
    511 
    512 /**
    513 * hb_set_get_population:
    514 * @set: A set
    515 *
    516 * Returns the number of elements in the set.
    517 *
    518 * Return value: The population of @set
    519 *
    520 * Since: 0.9.7
    521 **/
    522 unsigned int
    523 hb_set_get_population (const hb_set_t *set)
    524 {
    525  return set->get_population ();
    526 }
    527 
    528 /**
    529 * hb_set_get_min:
    530 * @set: A set
    531 *
    532 * Finds the smallest element in the set.
    533 *
    534 * Return value: minimum of @set, or #HB_SET_VALUE_INVALID if @set is empty.
    535 *
    536 * Since: 0.9.7
    537 **/
    538 hb_codepoint_t
    539 hb_set_get_min (const hb_set_t *set)
    540 {
    541  return set->get_min ();
    542 }
    543 
    544 /**
    545 * hb_set_get_max:
    546 * @set: A set
    547 *
    548 * Finds the largest element in the set.
    549 *
    550 * Return value: maximum of @set, or #HB_SET_VALUE_INVALID if @set is empty.
    551 *
    552 * Since: 0.9.7
    553 **/
    554 hb_codepoint_t
    555 hb_set_get_max (const hb_set_t *set)
    556 {
    557  return set->get_max ();
    558 }
    559 
    560 /**
    561 * hb_set_next:
    562 * @set: A set
    563 * @codepoint: (inout): Input = Code point to query
    564 *             Output = Code point retrieved
    565 *
    566 * Fetches the next element in @set that is greater than current value of @codepoint.
    567 *
    568 * Set @codepoint to #HB_SET_VALUE_INVALID to get started.
    569 *
    570 * Return value: `true` if there was a next value, `false` otherwise
    571 *
    572 * Since: 0.9.2
    573 **/
    574 hb_bool_t
    575 hb_set_next (const hb_set_t *set,
    576      hb_codepoint_t *codepoint)
    577 {
    578  return set->next (codepoint);
    579 }
    580 
    581 /**
    582 * hb_set_previous:
    583 * @set: A set
    584 * @codepoint: (inout): Input = Code point to query
    585 *             Output = Code point retrieved
    586 *
    587 * Fetches the previous element in @set that is lower than current value of @codepoint.
    588 *
    589 * Set @codepoint to #HB_SET_VALUE_INVALID to get started.
    590 *
    591 * Return value: `true` if there was a previous value, `false` otherwise
    592 *
    593 * Since: 1.8.0
    594 **/
    595 hb_bool_t
    596 hb_set_previous (const hb_set_t *set,
    597 	 hb_codepoint_t *codepoint)
    598 {
    599  return set->previous (codepoint);
    600 }
    601 
    602 /**
    603 * hb_set_next_range:
    604 * @set: A set
    605 * @first: (out): The first code point in the range
    606 * @last: (inout): Input = The current last code point in the range
    607 *         Output = The last code point in the range
    608 *
    609 * Fetches the next consecutive range of elements in @set that
    610 * are greater than current value of @last.
    611 *
    612 * Set @last to #HB_SET_VALUE_INVALID to get started.
    613 *
    614 * Return value: `true` if there was a next range, `false` otherwise
    615 *
    616 * Since: 0.9.7
    617 **/
    618 hb_bool_t
    619 hb_set_next_range (const hb_set_t *set,
    620 	   hb_codepoint_t *first,
    621 	   hb_codepoint_t *last)
    622 {
    623  return set->next_range (first, last);
    624 }
    625 
    626 /**
    627 * hb_set_previous_range:
    628 * @set: A set
    629 * @first: (inout): Input = The current first code point in the range
    630 *         Output = The first code point in the range
    631 * @last: (out): The last code point in the range
    632 *
    633 * Fetches the previous consecutive range of elements in @set that
    634 * are greater than current value of @last.
    635 *
    636 * Set @first to #HB_SET_VALUE_INVALID to get started.
    637 *
    638 * Return value: `true` if there was a previous range, `false` otherwise
    639 *
    640 * Since: 1.8.0
    641 **/
    642 hb_bool_t
    643 hb_set_previous_range (const hb_set_t *set,
    644 	       hb_codepoint_t *first,
    645 	       hb_codepoint_t *last)
    646 {
    647  return set->previous_range (first, last);
    648 }
    649 
    650 /**
    651 * hb_set_next_many:
    652 * @set: A set
    653 * @codepoint: Outputting codepoints starting after this one.
    654 *             Use #HB_SET_VALUE_INVALID to get started.
    655 * @out: (array length=size): An array of codepoints to write to.
    656 * @size: The maximum number of codepoints to write out.
    657 *
    658 * Finds the next element in @set that is greater than @codepoint. Writes out
    659 * codepoints to @out, until either the set runs out of elements, or @size
    660 * codepoints are written, whichever comes first.
    661 *
    662 * Return value: the number of values written.
    663 *
    664 * Since: 4.2.0
    665 **/
    666 unsigned int
    667 hb_set_next_many (const hb_set_t *set,
    668 	  hb_codepoint_t  codepoint,
    669 	  hb_codepoint_t *out,
    670 	  unsigned int    size)
    671 {
    672  return set->next_many (codepoint, out, size);
    673 }