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 **/
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->init ();
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 **/
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: 0.9.2
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: 0.9.2
92 **/
93void
94hb_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 **/
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: 0.9.2
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: 0.9.2
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: 0.9.2
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: 0.9.7
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: 0.9.2
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: 0.9.2
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: 0.9.7
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: 0.9.2
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: 0.9.7
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: 0.9.7
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: 0.9.2
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: 0.9.2
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: 0.9.2
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: 0.9.2
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: 0.9.2
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: 0.9.10
379 *
380 * Deprecated: 1.6.1
381 **/
382void
383hb_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 **/
397unsigned int
398hb_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 **/
413hb_codepoint_t
414hb_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 **/
429hb_codepoint_t
430hb_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 *
441 *
442 * Return value: whether there was a next value.
443 *
444 * Since: 0.9.2
445 **/
446hb_bool_t
447hb_set_next (const hb_set_t *set,
448	     hb_codepoint_t *codepoint)
449{
450  return set->next (codepoint);
451}
452
453/**
454 * hb_set_next_range:
455 * @set: a set.
456 * @first: (out): output first codepoint in the range.
457 * @last: (inout): input current last and output last codepoint in the range.
458 *
459 * Gets the next consecutive range of numbers in @set that
460 * are greater than current value of @last.
461 *
462 * Return value: whether there was a next range.
463 *
464 * Since: 0.9.7
465 **/
466hb_bool_t
467hb_set_next_range (const hb_set_t *set,
468		   hb_codepoint_t *first,
469		   hb_codepoint_t *last)
470{
471  return set->next_range (first, last);
472}
473