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 *
hb_set_create()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 *
hb_set_get_empty()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 *
hb_set_reference(hb_set_t * set)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
hb_set_destroy(hb_set_t * set)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
hb_set_set_user_data(hb_set_t * set,hb_user_data_key_t * key,void * data,hb_destroy_func_t destroy,hb_bool_t replace)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 *
hb_set_get_user_data(hb_set_t * set,hb_user_data_key_t * key)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
hb_set_allocation_successful(const hb_set_t * set)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
hb_set_clear(hb_set_t * set)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
hb_set_is_empty(const hb_set_t * set)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
hb_set_has(const hb_set_t * set,hb_codepoint_t codepoint)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
hb_set_add(hb_set_t * set,hb_codepoint_t codepoint)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
hb_set_add_range(hb_set_t * set,hb_codepoint_t first,hb_codepoint_t last)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
hb_set_del(hb_set_t * set,hb_codepoint_t codepoint)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
hb_set_del_range(hb_set_t * set,hb_codepoint_t first,hb_codepoint_t last)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
hb_set_is_equal(const hb_set_t * set,const hb_set_t * other)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
hb_set_is_subset(const hb_set_t * set,const hb_set_t * larger_set)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
hb_set_set(hb_set_t * set,const hb_set_t * other)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
hb_set_union(hb_set_t * set,const hb_set_t * other)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
hb_set_intersect(hb_set_t * set,const hb_set_t * other)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
hb_set_subtract(hb_set_t * set,const hb_set_t * other)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
hb_set_symmetric_difference(hb_set_t * set,const hb_set_t * other)386 hb_set_symmetric_difference (hb_set_t       *set,
387 			     const hb_set_t *other)
388 {
389   set->symmetric_difference (other);
390 }
391 
392 #ifndef HB_DISABLE_DEPRECATED
393 /**
394  * hb_set_invert:
395  * @set: a set.
396  *
397  *
398  *
399  * Since: 0.9.10
400  *
401  * Deprecated: 1.6.1
402  **/
403 void
hb_set_invert(hb_set_t * set HB_UNUSED)404 hb_set_invert (hb_set_t *set HB_UNUSED)
405 {
406 }
407 #endif
408 
409 /**
410  * hb_set_get_population:
411  * @set: a set.
412  *
413  * Returns the number of numbers in the set.
414  *
415  * Return value: set population.
416  *
417  * Since: 0.9.7
418  **/
419 unsigned int
hb_set_get_population(const hb_set_t * set)420 hb_set_get_population (const hb_set_t *set)
421 {
422   return set->get_population ();
423 }
424 
425 /**
426  * hb_set_get_min:
427  * @set: a set.
428  *
429  * Finds the minimum number in the set.
430  *
431  * Return value: minimum of the set, or %HB_SET_VALUE_INVALID if set is empty.
432  *
433  * Since: 0.9.7
434  **/
435 hb_codepoint_t
hb_set_get_min(const hb_set_t * set)436 hb_set_get_min (const hb_set_t *set)
437 {
438   return set->get_min ();
439 }
440 
441 /**
442  * hb_set_get_max:
443  * @set: a set.
444  *
445  * Finds the maximum number in the set.
446  *
447  * Return value: minimum of the set, or %HB_SET_VALUE_INVALID if set is empty.
448  *
449  * Since: 0.9.7
450  **/
451 hb_codepoint_t
hb_set_get_max(const hb_set_t * set)452 hb_set_get_max (const hb_set_t *set)
453 {
454   return set->get_max ();
455 }
456 
457 /**
458  * hb_set_next:
459  * @set: a set.
460  * @codepoint: (inout):
461  *
462  * Gets the next number in @set that is greater than current value of @codepoint.
463  *
464  * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
465  *
466  * Return value: whether there was a next value.
467  *
468  * Since: 0.9.2
469  **/
470 hb_bool_t
hb_set_next(const hb_set_t * set,hb_codepoint_t * codepoint)471 hb_set_next (const hb_set_t *set,
472 	     hb_codepoint_t *codepoint)
473 {
474   return set->next (codepoint);
475 }
476 
477 /**
478  * hb_set_previous:
479  * @set: a set.
480  * @codepoint: (inout):
481  *
482  * Gets the previous number in @set that is lower than current value of @codepoint.
483  *
484  * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
485  *
486  * Return value: whether there was a previous value.
487  *
488  * Since: 1.8.0
489  **/
490 hb_bool_t
hb_set_previous(const hb_set_t * set,hb_codepoint_t * codepoint)491 hb_set_previous (const hb_set_t *set,
492 		 hb_codepoint_t *codepoint)
493 {
494   return set->previous (codepoint);
495 }
496 
497 /**
498  * hb_set_next_range:
499  * @set: a set.
500  * @first: (out): output first codepoint in the range.
501  * @last: (inout): input current last and output last codepoint in the range.
502  *
503  * Gets the next consecutive range of numbers in @set that
504  * are greater than current value of @last.
505  *
506  * Set @last to %HB_SET_VALUE_INVALID to get started.
507  *
508  * Return value: whether there was a next range.
509  *
510  * Since: 0.9.7
511  **/
512 hb_bool_t
hb_set_next_range(const hb_set_t * set,hb_codepoint_t * first,hb_codepoint_t * last)513 hb_set_next_range (const hb_set_t *set,
514 		   hb_codepoint_t *first,
515 		   hb_codepoint_t *last)
516 {
517   return set->next_range (first, last);
518 }
519 
520 /**
521  * hb_set_previous_range:
522  * @set: a set.
523  * @first: (inout): input current first and output first codepoint in the range.
524  * @last: (out): output last codepoint in the range.
525  *
526  * Gets the previous consecutive range of numbers in @set that
527  * are less than current value of @first.
528  *
529  * Set @first to %HB_SET_VALUE_INVALID to get started.
530  *
531  * Return value: whether there was a previous range.
532  *
533  * Since: 1.8.0
534  **/
535 hb_bool_t
hb_set_previous_range(const hb_set_t * set,hb_codepoint_t * first,hb_codepoint_t * last)536 hb_set_previous_range (const hb_set_t *set,
537 		       hb_codepoint_t *first,
538 		       hb_codepoint_t *last)
539 {
540   return set->previous_range (first, last);
541 }
542