Imported Upstream version 1.7.6
[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-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->init ();
49
50   return set;
51 }
52
53 static const hb_set_t _hb_set_nil = {
54   HB_OBJECT_HEADER_STATIC,
55   true, /* in_error */
56
57   {0} /* elts */
58 };
59
60 /**
61  * hb_set_get_empty:
62  *
63  * Return value: (transfer full):
64  *
65  * Since: 0.9.2
66  **/
67 hb_set_t *
68 hb_set_get_empty (void)
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->finish ();
99
100   free (set);
101 }
102
103 /**
104  * hb_set_set_user_data: (skip)
105  * @set: a set.
106  * @key:
107  * @data:
108  * @destroy:
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  * Deprecated: 1.6.1
381  **/
382 void
383 hb_set_invert (hb_set_t *set)
384 {
385 }
386
387 /**
388  * hb_set_get_population:
389  * @set: a set.
390  *
391  * Returns the number of numbers in the set.
392  *
393  * Return value: set population.
394  *
395  * Since: 0.9.7
396  **/
397 unsigned int
398 hb_set_get_population (const hb_set_t *set)
399 {
400   return set->get_population ();
401 }
402
403 /**
404  * hb_set_get_min:
405  * @set: a set.
406  *
407  * Finds the minimum number in the set.
408  *
409  * Return value: minimum of the set, or %HB_SET_VALUE_INVALID if set is empty.
410  *
411  * Since: 0.9.7
412  **/
413 hb_codepoint_t
414 hb_set_get_min (const hb_set_t *set)
415 {
416   return set->get_min ();
417 }
418
419 /**
420  * hb_set_get_max:
421  * @set: a set.
422  *
423  * Finds the maximum number in the set.
424  *
425  * Return value: minimum of the set, or %HB_SET_VALUE_INVALID if set is empty.
426  *
427  * Since: 0.9.7
428  **/
429 hb_codepoint_t
430 hb_set_get_max (const hb_set_t *set)
431 {
432   return set->get_max ();
433 }
434
435 /**
436  * hb_set_next:
437  * @set: a set.
438  * @codepoint: (inout):
439  *
440  * Gets the next number in @set that is greater than current value of @codepoint.
441  *
442  * Set @codepoint to %HB_SET_VALUE_INVALID to get started.
443  *
444  * Return value: whether there was a next value.
445  *
446  * Since: 0.9.2
447  **/
448 hb_bool_t
449 hb_set_next (const hb_set_t *set,
450              hb_codepoint_t *codepoint)
451 {
452   return set->next (codepoint);
453 }
454
455 /**
456  * hb_set_previous:
457  * @set: a set.
458  * @codepoint: (inout):
459  *
460  * Gets the previous number in @set that is slower 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 previous value.
465  *
466  * Since: 1.8.0
467  **/
468 hb_bool_t
469 hb_set_previous (const hb_set_t *set,
470                  hb_codepoint_t *codepoint)
471 {
472   return set->previous (codepoint);
473 }
474
475 /**
476  * hb_set_next_range:
477  * @set: a set.
478  * @first: (out): output first codepoint in the range.
479  * @last: (inout): input current last and output last codepoint in the range.
480  *
481  * Gets the next consecutive range of numbers in @set that
482  * are greater than current value of @last.
483  *
484  * Set @last to %HB_SET_VALUE_INVALID to get started.
485  *
486  * Return value: whether there was a next range.
487  *
488  * Since: 0.9.7
489  **/
490 hb_bool_t
491 hb_set_next_range (const hb_set_t *set,
492                    hb_codepoint_t *first,
493                    hb_codepoint_t *last)
494 {
495   return set->next_range (first, last);
496 }
497
498 /**
499  * hb_set_previous_range:
500  * @set: a set.
501  * @first: (inout): input current first and output first codepoint in the range.
502  * @last: (out): output last codepoint in the range.
503  *
504  * Gets the previous consecutive range of numbers in @set that
505  * are greater than current value of @last.
506  *
507  * Set @first to %HB_SET_VALUE_INVALID to get started.
508  *
509  * Return value: whether there was a previous range.
510  *
511  * Since: 1.8.0
512  **/
513 hb_bool_t
514 hb_set_previous_range (const hb_set_t *set,
515                        hb_codepoint_t *first,
516                        hb_codepoint_t *last)
517 {
518   return set->previous_range (first, last);
519 }