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: 0.9.2 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: 0.9.2 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: 0.9.2 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: 0.9.2 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: 0.9.2 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: 0.9.2 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: 0.9.2 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: 0.9.2 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: 0.9.7 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: 0.9.2 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: 0.9.2 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: 0.9.7 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: 0.9.2 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: 0.9.7 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: 0.9.7 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: 0.9.2 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: 0.9.2 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: 0.9.2 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: 0.9.2 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: 0.9.2 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: 0.9.10 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: 0.9.7 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: 0.9.7 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: 0.9.7 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: 0.9.2 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: 0.9.7 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