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: 1.0
39 **/
40hb_set_t *
41hb_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: 1.0
59 **/
60hb_set_t *
61hb_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: 1.0
80 **/
81hb_set_t *
82hb_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: 1.0
92 **/
93void
94hb_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 (closure data):
109 * @replace:
110 *
111 * Return value:
112 *
113 * Since: 1.0
114 **/
115hb_bool_t
116hb_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: 1.0
133 **/
134void *
135hb_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: 1.0
151 **/
152hb_bool_t
153hb_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: 1.0
165 **/
166void
167hb_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: 1.0
181 **/
182hb_bool_t
183hb_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: 1.0
198 **/
199hb_bool_t
200hb_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: 1.0
214 **/
215void
216hb_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: 1.0
231 **/
232void
233hb_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: 1.0
248 **/
249void
250hb_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: 1.0
265 **/
266void
267hb_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: 1.0
284 **/
285hb_bool_t
286hb_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: 1.0
300 **/
301void
302hb_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: 1.0
316 **/
317void
318hb_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: 1.0
332 **/
333void
334hb_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: 1.0
348 **/
349void
350hb_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: 1.0
364 **/
365void
366hb_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: 1.0
379 **/
380void
381hb_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: 1.0
395 **/
396unsigned int
397hb_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: 1.0
411 **/
412hb_codepoint_t
413hb_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: 1.0
427 **/
428hb_codepoint_t
429hb_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: 1.0
444 **/
445hb_bool_t
446hb_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: 1.0
464 **/
465hb_bool_t
466hb_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}
472