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