f3fe1ba43355dd08f71d4ca7682dd70807a78f83
[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->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:
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 }