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