Imported Upstream version 2.6.4
[platform/upstream/harfbuzz.git] / src / hb-set.cc
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 #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
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
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
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
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
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
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
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
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 }