Home | History | Annotate | Download | only in src
      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: Object 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 API to query certain set of characters or glyphs,
     38  * or other integer values.
     39  **/
     40 
     41 
     42 /**
     43  * hb_set_create: (Xconstructor)
     44  *
     45  * Return value: (transfer full):
     46  *
     47  * Since: 0.9.2
     48  **/
     49 hb_set_t *
     50 hb_set_create ()
     51 {
     52   hb_set_t *set;
     53 
     54   if (!(set = hb_object_create<hb_set_t> ()))
     55     return hb_set_get_empty ();
     56 
     57   set->init_shallow ();
     58 
     59   return set;
     60 }
     61 
     62 /**
     63  * hb_set_get_empty:
     64  *
     65  * Return value: (transfer full):
     66  *
     67  * Since: 0.9.2
     68  **/
     69 hb_set_t *
     70 hb_set_get_empty ()
     71 {
     72   return const_cast<hb_set_t *> (&Null(hb_set_t));
     73 }
     74 
     75 /**
     76  * hb_set_reference: (skip)
     77  * @set: a set.
     78  *
     79  * Return value: (transfer full):
     80  *
     81  * Since: 0.9.2
     82  **/
     83 hb_set_t *
     84 hb_set_reference (hb_set_t *set)
     85 {
     86   return hb_object_reference (set);
     87 }
     88 
     89 /**
     90  * hb_set_destroy: (skip)
     91  * @set: a set.
     92  *
     93  * Since: 0.9.2
     94  **/
     95 void
     96 hb_set_destroy (hb_set_t *set)
     97 {
     98   if (!hb_object_destroy (set)) return;
     99 
    100   set->fini_shallow ();
    101 
    102   free (set);
    103 }
    104 
    105 /**
    106  * hb_set_set_user_data: (skip)
    107  * @set: a set.
    108  * @key:
    109  * @data:
    110  * @destroy:
    111  * @replace:
    112  *
    113  * Return value:
    114  *
    115  * Since: 0.9.2
    116  **/
    117 hb_bool_t
    118 hb_set_set_user_data (hb_set_t           *set,
    119 		      hb_user_data_key_t *key,
    120 		      void *              data,
    121 		      hb_destroy_func_t   destroy,
    122 		      hb_bool_t           replace)
    123 {
    124   return hb_object_set_user_data (set, key, data, destroy, replace);
    125 }
    126 
    127 /**
    128  * hb_set_get_user_data: (skip)
    129  * @set: a set.
    130  * @key:
    131  *
    132  * Return value: (transfer none):
    133  *
    134  * Since: 0.9.2
    135  **/
    136 void *
    137 hb_set_get_user_data (hb_set_t           *set,
    138 		      hb_user_data_key_t *key)
    139 {
    140   return hb_object_get_user_data (set, key);
    141 }
    142 
    143 
    144 /**
    145  * hb_set_allocation_successful:
    146  * @set: a set.
    147  *
    148  *
    149  *
    150  * Return value:
    151  *
    152  * Since: 0.9.2
    153  **/
    154 hb_bool_t
    155 hb_set_allocation_successful (const hb_set_t  *set)
    156 {
    157   return set->successful;
    158 }
    159 
    160 /**
    161  * hb_set_clear:
    162  * @set: a set.
    163  *
    164  *
    165  *
    166  * Since: 0.9.2
    167  **/
    168 void
    169 hb_set_clear (hb_set_t *set)
    170 {
    171   set->clear ();
    172 }
    173 
    174 /**
    175  * hb_set_is_empty:
    176  * @set: a set.
    177  *
    178  *
    179  *
    180  * Return value:
    181  *
    182  * Since: 0.9.7
    183  **/
    184 hb_bool_t
    185 hb_set_is_empty (const hb_set_t *set)
    186 {
    187   return set->is_empty ();
    188 }
    189 
    190 /**
    191  * hb_set_has:
    192  * @set: a set.
    193  * @codepoint:
    194  *
    195  *
    196  *
    197  * Return value:
    198  *
    199  * Since: 0.9.2
    200  **/
    201 hb_bool_t
    202 hb_set_has (const hb_set_t *set,
    203 	    hb_codepoint_t  codepoint)
    204 {
    205   return set->has (codepoint);
    206 }
    207 
    208 /**
    209  * hb_set_add:
    210  * @set: a set.
    211  * @codepoint:
    212  *
    213  *
    214  *
    215  * Since: 0.9.2
    216  **/
    217 void
    218 hb_set_add (hb_set_t       *set,
    219 	    hb_codepoint_t  codepoint)
    220 {
    221   set->add (codepoint);
    222 }
    223 
    224 /**
    225  * hb_set_add_range:
    226  * @set: a set.
    227  * @first:
    228  * @last:
    229  *
    230  *
    231  *
    232  * Since: 0.9.7
    233  **/
    234 void
    235 hb_set_add_range (hb_set_t       *set,
    236 		  hb_codepoint_t  first,
    237 		  hb_codepoint_t  last)
    238 {
    239   set->add_range (first, last);
    240 }
    241 
    242 /**
    243  * hb_set_del:
    244  * @set: a set.
    245  * @codepoint:
    246  *
    247  *
    248  *
    249  * Since: 0.9.2
    250  **/
    251 void
    252 hb_set_del (hb_set_t       *set,
    253 	    hb_codepoint_t  codepoint)
    254 {
    255   set->del (codepoint);
    256 }
    257 
    258 /**
    259  * hb_set_del_range:
    260  * @set: a set.
    261  * @first:
    262  * @last:
    263  *
    264  *
    265  *
    266  * Since: 0.9.7
    267  **/
    268 void
    269 hb_set_del_range (hb_set_t       *set,
    270 		  hb_codepoint_t  first,
    271 		  hb_codepoint_t  last)
    272 {
    273   set->del_range (first, last);
    274 }
    275 
    276 /**
    277  * hb_set_is_equal:
    278  * @set: a set.
    279  * @other: other set.
    280  *
    281  *
    282  *
    283  * Return value: %TRUE if the two sets are equal, %FALSE otherwise.
    284  *
    285  * Since: 0.9.7
    286  **/
    287 hb_bool_t
    288 hb_set_is_equal (const hb_set_t *set,
    289 		 const hb_set_t *other)
    290 {
    291   return set->is_equal (other);
    292 }
    293 
    294 /**
    295  * hb_set_is_subset:
    296  * @set: a set.
    297  * @larger_set: other set.
    298  *
    299  *
    300  *
    301  * Return value: %TRUE if the @set is a subset of (or equal to) @larger_set, %FALSE otherwise.
    302  *
    303  * Since: 1.8.1
    304  **/
    305 hb_bool_t
    306 hb_set_is_subset (const hb_set_t *set,
    307 		  const hb_set_t *larger_set)
    308 {
    309   return set->is_subset (larger_set);
    310 }
    311 
    312 /**
    313  * hb_set_set:
    314  * @set: a set.
    315  * @other:
    316  *
    317  *
    318  *
    319  * Since: 0.9.2
    320  **/
    321 void
    322 hb_set_set (hb_set_t       *set,
    323 	    const hb_set_t *other)
    324 {
    325   set->set (other);
    326 }
    327 
    328 /**
    329  * hb_set_union:
    330  * @set: a set.
    331  * @other:
    332  *
    333  *
    334  *
    335  * Since: 0.9.2
    336  **/
    337 void
    338 hb_set_union (hb_set_t       *set,
    339 	      const hb_set_t *other)
    340 {
    341   set->union_ (other);
    342 }
    343 
    344 /**
    345  * hb_set_intersect:
    346  * @set: a set.
    347  * @other:
    348  *
    349  *
    350  *
    351  * Since: 0.9.2
    352  **/
    353 void
    354 hb_set_intersect (hb_set_t       *set,
    355 		  const hb_set_t *other)
    356 {
    357   set->intersect (other);
    358 }
    359 
    360 /**
    361  * hb_set_subtract:
    362  * @set: a set.
    363  * @other:
    364  *
    365  *
    366  *
    367  * Since: 0.9.2
    368  **/
    369 void
    370 hb_set_subtract (hb_set_t       *set,
    371 		 const hb_set_t *other)
    372 {
    373   set->subtract (other);
    374 }
    375 
    376 /**
    377  * hb_set_symmetric_difference:
    378  * @set: a set.
    379  * @other:
    380  *
    381  *
    382  *
    383  * Since: 0.9.2
    384  **/
    385 void
    386 hb_set_symmetric_difference (hb_set_t       *set,
    387 			     const hb_set_t *other)
    388 {
    389   set->symmetric_difference (other);
    390 }
    391 
    392 /**
    393  * hb_set_invert:
    394  * @set: a set.
    395  *
    396  *
    397  *
    398  * Since: 0.9.10
    399  *
    400  * Deprecated: 1.6.1
    401  **/
    402 void
    403 hb_set_invert (hb_set_t *set HB_UNUSED)
    404 {
    405 }
    406 
    407 /**
    408  * hb_set_get_population:
    409  * @set: a set.
    410  *
    411  * Returns the number of numbers in the set.
    412  *
    413  * Return value: set population.
    414  *
    415  * Since: 0.9.7
    416  **/
    417 unsigned int
    418 hb_set_get_population (const hb_set_t *set)
    419 {
    420   return set->get_population ();
    421 }
    422 
    423 /**
    424  * hb_set_get_min:
    425  * @set: a set.
    426  *
    427  * Finds the minimum number in the set.
    428  *
    429  * Return value: minimum of the set, or %HB_SET_VALUE_INVALID if set is empty.
    430  *
    431  * Since: 0.9.7
    432  **/
    433 hb_codepoint_t
    434 hb_set_get_min (const hb_set_t *set)
    435 {
    436   return set->get_min ();
    437 }
    438 
    439 /**
    440  * hb_set_get_max:
    441  * @set: a set.
    442  *
    443  * Finds the maximum number in the set.
    444  *
    445  * Return value: minimum of the set, or %HB_SET_VALUE_INVALID if set is empty.
    446  *
    447  * Since: 0.9.7
    448  **/
    449 hb_codepoint_t
    450 hb_set_get_max (const hb_set_t *set)
    451 {
    452   return set->get_max ();
    453 }
    454 
    455 /**
    456  * hb_set_next:
    457  * @set: a set.
    458  * @codepoint: (inout):
    459  *
    460  * Gets the next number in @set that is greater than current value of @codepoint.
    461  *
    462  * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
    463  *
    464  * Return value: whether there was a next value.
    465  *
    466  * Since: 0.9.2
    467  **/
    468 hb_bool_t
    469 hb_set_next (const hb_set_t *set,
    470 	     hb_codepoint_t *codepoint)
    471 {
    472   return set->next (codepoint);
    473 }
    474 
    475 /**
    476  * hb_set_previous:
    477  * @set: a set.
    478  * @codepoint: (inout):
    479  *
    480  * Gets the previous number in @set that is slower than current value of @codepoint.
    481  *
    482  * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
    483  *
    484  * Return value: whether there was a previous value.
    485  *
    486  * Since: 1.8.0
    487  **/
    488 hb_bool_t
    489 hb_set_previous (const hb_set_t *set,
    490 		 hb_codepoint_t *codepoint)
    491 {
    492   return set->previous (codepoint);
    493 }
    494 
    495 /**
    496  * hb_set_next_range:
    497  * @set: a set.
    498  * @first: (out): output first codepoint in the range.
    499  * @last: (inout): input current last and output last codepoint in the range.
    500  *
    501  * Gets the next consecutive range of numbers in @set that
    502  * are greater than current value of @last.
    503  *
    504  * Set @last to %HB_SET_VALUE_INVALID to get started.
    505  *
    506  * Return value: whether there was a next range.
    507  *
    508  * Since: 0.9.7
    509  **/
    510 hb_bool_t
    511 hb_set_next_range (const hb_set_t *set,
    512 		   hb_codepoint_t *first,
    513 		   hb_codepoint_t *last)
    514 {
    515   return set->next_range (first, last);
    516 }
    517 
    518 /**
    519  * hb_set_previous_range:
    520  * @set: a set.
    521  * @first: (inout): input current first and output first codepoint in the range.
    522  * @last: (out): output last codepoint in the range.
    523  *
    524  * Gets the previous consecutive range of numbers in @set that
    525  * are greater than current value of @last.
    526  *
    527  * Set @first to %HB_SET_VALUE_INVALID to get started.
    528  *
    529  * Return value: whether there was a previous range.
    530  *
    531  * Since: 1.8.0
    532  **/
    533 hb_bool_t
    534 hb_set_previous_range (const hb_set_t *set,
    535 		       hb_codepoint_t *first,
    536 		       hb_codepoint_t *last)
    537 {
    538   return set->previous_range (first, last);
    539 }
    540