API doc: use minus sign (U+2212) where appropriate instead of `-`
[babeltrace.git] / include / babeltrace2 / integer-range-set.h
CommitLineData
fb91c0ef 1/*
0235b0db 2 * SPDX-License-Identifier: MIT
fb91c0ef 3 *
0235b0db 4 * Copyright (C) 2010-2019 EfficiOS Inc. and Linux Foundation
fb91c0ef
PP
5 */
6
0235b0db
MJ
7#ifndef BABELTRACE2_INTEGER_RANGE_SET_H
8#define BABELTRACE2_INTEGER_RANGE_SET_H
9
fb91c0ef
PP
10#ifndef __BT_IN_BABELTRACE_H
11# error "Please include <babeltrace2/babeltrace.h> instead."
12#endif
13
14#include <stdint.h>
15#include <stddef.h>
16
17#include <babeltrace2/types.h>
fb91c0ef
PP
18
19#ifdef __cplusplus
20extern "C" {
21#endif
22
43c59509
PP
23/*!
24@defgroup api-int-rs Integer range sets
25
26@brief
27 Sets of unsigned and signed 64-bit integer ranges.
28
29An <strong><em>integer range set</em></strong>
30is an \em unordered set of integer ranges.
31
32An <strong><em>integer range</em></strong> represents all the
33integers \b 𝑥 which satisfy
34(<em>lower&nbsp;value</em>&nbsp;≤&nbsp;<strong>𝑥</strong>&nbsp;≤&nbsp;<em>upper&nbsp;value</em>).
35
36For example, an unsigned integer range set could contain the ranges
37[5,&nbsp;14], [199,&nbsp;2001], and [1976,&nbsp;3000].
38
39This integer range set API offers unsigned and signed 64-bit integer
40ranges and integer range sets with dedicated C&nbsp;types:
41
42- #bt_integer_range_unsigned
43- #bt_integer_range_signed
44- #bt_integer_range_set_unsigned
45- #bt_integer_range_set_signed
46
47This API uses the \em abstract #bt_integer_range_set type for common
48properties and operations (for example,
49bt_integer_range_set_get_range_count()).
50\ref api-fund-c-typing "Upcast" a specific
51integer range set to the #bt_integer_range_set type with
52bt_integer_range_set_unsigned_as_range_set_const() or
53bt_integer_range_set_signed_as_range_set_const().
54
55An integer range set is a \ref api-fund-shared-object "shared object":
56get a new reference with bt_integer_range_set_unsigned_get_ref() or
57bt_integer_range_set_signed_get_ref() and put an existing reference with
58bt_integer_range_set_unsigned_put_ref() or
59bt_integer_range_set_signed_put_ref().
60
61An integer range is a \ref api-fund-unique-object "unique object": it
62belongs to the integer range set which contains it.
63
64Some library functions \ref api-fund-freezing "freeze" integer range
65sets on success. The documentation of those functions indicate this
66postcondition.
67
68Create an empty integer range set with
69bt_integer_range_set_unsigned_create() or
70bt_integer_range_set_signed_create().
71
72Add an integer range to an integer range set with
73bt_integer_range_set_unsigned_add_range() or
74bt_integer_range_set_signed_add_range(). Although integer ranges can
75overlap, specific functions of the \bt_api expect an integer range set
76with non-overlapping integer ranges.
77
78As of \bt_name_version_min_maj, you cannot remove an existing
79integer range from an integer range set.
80
81Check that two integer ranges are equal with
82bt_integer_range_unsigned_is_equal() or
83bt_integer_range_signed_is_equal().
84
85Check that two integer range sets are equal with
86bt_integer_range_set_unsigned_is_equal() or
87bt_integer_range_set_signed_is_equal().
88*/
89
90/*! @{ */
91
92/*!
93@name Types
94@{
95
96@typedef struct bt_integer_range_unsigned bt_integer_range_unsigned
97
98@brief
99 Unsigned 64-bit integer range.
100
43c59509
PP
101@typedef struct bt_integer_range_signed bt_integer_range_signed
102
103@brief
104 Signed 64-bit integer range.
105
43c59509
PP
106@typedef struct bt_integer_range_set bt_integer_range_set
107
108@brief
109 Set of 64-bit integer ranges.
110
111This is an abstract type for common properties and operations. See \ref
112api-fund-c-typing to learn more about conceptual object type
113inheritance.
114
43c59509
PP
115@typedef struct bt_integer_range_set_unsigned bt_integer_range_set_unsigned;
116
117@brief
118 Set of unsigned 64-bit integer ranges.
119
43c59509
PP
120@typedef struct bt_integer_range_set_signed bt_integer_range_set_signed;
121
122@brief
123 Set of signed 64-bit integer ranges.
124
125@}
126*/
127
128/*!
129@name Unsigned integer range
130@{
131*/
132
133/*!
134@brief
135 Returns the lower value of the unsigned integer range
136 \bt_p{int_range}.
137
138The returned lower value is included in \bt_p{int_range}.
139
140@param[in] int_range
141 Unsigned integer range of which to get the lower value.
142
143@returns
144 Lower value of \bt_p{int_range}.
145
146@bt_pre_not_null{int_range}
147@bt_pre_is_bool_val{int_range}
148*/
149extern uint64_t bt_integer_range_unsigned_get_lower(
150 const bt_integer_range_unsigned *int_range);
fb91c0ef 151
43c59509
PP
152/*!
153@brief
154 Returns the upper value of the unsigned integer range
155 \bt_p{int_range}.
156
157The returned upper value is included in \bt_p{int_range}.
158
159@param[in] int_range
160 Unsigned integer range of which to get the upper value.
161
162@returns
163 Upper value of \bt_p{int_range}.
164
165@bt_pre_not_null{int_range}
166@bt_pre_is_bool_val{int_range}
167*/
168extern uint64_t bt_integer_range_unsigned_get_upper(
169 const bt_integer_range_unsigned *int_range);
170
171/*!
172@brief
173 Returns whether or not the unsigned integer range
174 \bt_p{a_int_range} is equal to \bt_p{b_int_range}.
175
176Two unsigned integer ranges are considered equal if they have the same
177lower and upper values.
178
179@param[in] a_int_range
180 Unsigned integer range A.
181@param[in] b_int_range
182 Unsigned integer range B.
183
184@returns
185 #BT_TRUE if \bt_p{a_int_range} is equal to
186 \bt_p{b_int_range}.
187
188@bt_pre_not_null{a_int_range}
189@bt_pre_not_null{b_int_range}
190*/
191extern bt_bool bt_integer_range_unsigned_is_equal(
192 const bt_integer_range_unsigned *a_int_range,
193 const bt_integer_range_unsigned *b_int_range);
194
195/*! @} */
196
197/*!
198@name Signed integer range
199@{
200*/
201
202/*!
203@brief
204 Returns the lower value of the signed integer range
205 \bt_p{int_range}.
206
207The returned lower value is included in \bt_p{int_range}.
208
209@param[in] int_range
210 Signed integer range of which to get the lower value.
211
212@returns
213 Lower value of \bt_p{int_range}.
214
215@bt_pre_not_null{int_range}
216@bt_pre_is_bool_val{int_range}
217*/
218extern int64_t bt_integer_range_signed_get_lower(
219 const bt_integer_range_signed *int_range);
220
221/*!
222@brief
223 Returns the upper value of the signed integer range
224 \bt_p{int_range}.
225
226The returned upper value is included in \bt_p{int_range}.
227
228@param[in] int_range
229 Signed integer range of which to get the upper value.
230
231@returns
232 Upper value of \bt_p{int_range}.
233
234@bt_pre_not_null{int_range}
235@bt_pre_is_bool_val{int_range}
236*/
237extern int64_t bt_integer_range_signed_get_upper(
238 const bt_integer_range_signed *int_range);
239
240/*!
241@brief
242 Returns whether or not the signed integer range
243 \bt_p{a_int_range} is equal to \bt_p{b_int_range}.
244
245Two signed integer ranges are considered equal if they have the same
246lower and upper values.
247
248@param[in] a_int_range
249 Signed integer range A.
250@param[in] b_int_range
251 Signed integer range B.
252
253@returns
254 #BT_TRUE if \bt_p{a_int_range} is equal to
255 \bt_p{b_int_range}.
256
257@bt_pre_not_null{a_int_range}
258@bt_pre_not_null{b_int_range}
259*/
260extern bt_bool bt_integer_range_signed_is_equal(
261 const bt_integer_range_signed *a_int_range,
262 const bt_integer_range_signed *b_int_range);
263
264/*! @} */
265
266/*!
267@name Integer range set: common
268@{
269*/
270
271/*!
272@brief
273 Status codes for bt_integer_range_set_unsigned_add_range() and
274 bt_integer_range_set_signed_add_range().
275*/
fb91c0ef 276typedef enum bt_integer_range_set_add_range_status {
43c59509
PP
277 /*!
278 @brief
279 Success.
280 */
281 BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_OK = __BT_FUNC_STATUS_OK,
282
283 /*!
284 @brief
285 Out of memory.
286 */
287 BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_MEMORY_ERROR = __BT_FUNC_STATUS_MEMORY_ERROR,
fb91c0ef
PP
288} bt_integer_range_set_add_range_status;
289
43c59509
PP
290/*!
291@brief
292 Returns the number of integer ranges contained in the integer
293 range set \bt_p{int_range_set}.
294
295@note
296 The parameter \bt_p{int_range_set} has the abstract type
297 #bt_integer_range_set: use
298 bt_integer_range_set_unsigned_as_range_set_const() or
299 bt_integer_range_set_signed_as_range_set_const() to upcast a
300 specific integer range set to this type.
301
302@param[in] int_range_set
303 Integer range set of which to get the number of contained integer
304 ranges.
305
306@returns
307 Number of contained integer ranges in \bt_p{int_range_set}.
308
309@bt_pre_not_null{int_range_set}
310*/
311extern uint64_t bt_integer_range_set_get_range_count(
312 const bt_integer_range_set *int_range_set);
313
314/*! @} */
315
316/*!
317@name Unsigned integer range set
318@{
319*/
320
321/*!
322@brief
323 Creates and returns an empty set of unsigned 64-bit integer ranges.
324
325@returns
326 New unsigned integer range set, or \c NULL on memory error.
327*/
328extern bt_integer_range_set_unsigned *bt_integer_range_set_unsigned_create(void);
329
330/*!
331@brief
332 Adds an unsigned 64-bit integer range having the lower value
333 \bt_p{lower} and the upper value \bt_p{upper} to the unsigned
334 integer range set
335 \bt_p{int_range_set}.
336
337The values \bt_p{lower} and \bt_p{upper} are included in the unsigned
338integer range to add to \bt_p{int_range_set}.
339
340@param[in] int_range_set
341 Unsigned integer range set to which to add an unsigned integer
342 range.
343@param[in] lower
344 Lower value (included) of the unsigned integer range to add to
345 \bt_p{int_range_set}.
346@param[in] upper
347 Upper value (included) of the unsigned integer range to add to
348 \bt_p{int_range_set}.
349
350@retval #BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_OK
351 Success.
352@retval #BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_MEMORY_ERROR
353 Out of memory.
354
355@bt_pre_not_null{int_range_set}
356@bt_pre_hot{int_range_set}
357@pre
358 \bt_p{lower} ≤ \bt_p{upper}.
359*/
360extern bt_integer_range_set_add_range_status
361bt_integer_range_set_unsigned_add_range(
362 bt_integer_range_set_unsigned *int_range_set,
fb91c0ef
PP
363 uint64_t lower, uint64_t upper);
364
43c59509
PP
365/*!
366@brief
367 Borrows the unsigned integer range at index \bt_p{index} from the
368 unsigned integer range set \bt_p{int_range_set}.
369
370@param[in] int_range_set
371 Unsigned integer range set from which to borrow the unsigned integer
372 range at index \bt_p{index}.
373@param[in] index
374 Index of the unsigned integer range to borrow from
375 \bt_p{int_range_set}.
376
377@returns
378 @parblock
379 \em Borrowed reference of the unsigned integer range of
380 \bt_p{int_range_set} at index \bt_p{index}.
381
382 The returned pointer remains valid until \bt_p{int_range_set} is
383 modified.
384 @endparblock
385
386@bt_pre_not_null{int_range_set}
387@pre
388 \bt_p{index} is less than the number of unsigned integer ranges in
389 \bt_p{int_range_set} (as returned by
390 bt_integer_range_set_get_range_count()).
391*/
392extern const bt_integer_range_unsigned *
393bt_integer_range_set_unsigned_borrow_range_by_index_const(
394 const bt_integer_range_set_unsigned *int_range_set,
395 uint64_t index);
396
397/*!
398@brief
399 Returns whether or not the unsigned integer range set
400 \bt_p{int_range_set_a} is equal to \bt_p{int_range_set_b}.
401
402Two unsigned integer range sets are considered equal if they contain the
403exact same unsigned integer ranges, whatever the order. In other words,
404an unsigned integer range set containing [2,&nbsp;9] and [10,&nbsp;15]
405is \em not equal to an unsigned integer range containing [2,&nbsp;15].
406
407@param[in] int_range_set_a
408 Unsigned integer range set A.
409@param[in] int_range_set_b
410 Unsigned integer range set B.
411
412@returns
413 #BT_TRUE if \bt_p{int_range_set_a} is equal to
414 \bt_p{int_range_set_b}.
415
416@bt_pre_not_null{int_range_set_a}
417@bt_pre_not_null{int_range_set_b}
418*/
419extern bt_bool bt_integer_range_set_unsigned_is_equal(
420 const bt_integer_range_set_unsigned *int_range_set_a,
421 const bt_integer_range_set_unsigned *int_range_set_b);
422
423/*!
424@brief
425 \ref api-fund-c-typing "Upcasts" the unsigned integer range set
426 \bt_p{int_range_set} to the abstract #bt_integer_range_set type.
427
428@param[in] int_range_set
429 @parblock
430 Unsigned integer range set to upcast.
431
432 Can be \c NULL.
433 @endparblock
434
435@returns
436 \bt_p{int_range_set} as an abstract integer range set.
437*/
438static inline
439const bt_integer_range_set *bt_integer_range_set_unsigned_as_range_set_const(
440 const bt_integer_range_set_unsigned *int_range_set)
441{
442 return __BT_UPCAST_CONST(bt_integer_range_set, int_range_set);
443}
444
445/*!
446@brief
447 Increments the \ref api-fund-shared-object "reference count" of
448 the unsigned integer range set \bt_p{int_range_set}.
449
450@param[in] int_range_set
451 @parblock
452 Unsigned integer range set of which to increment the reference
453 count.
454
455 Can be \c NULL.
456 @endparblock
457
458@sa bt_integer_range_set_unsigned_put_ref() &mdash;
459 Decrements the reference count of an unsigned integer range set.
460*/
461extern void bt_integer_range_set_unsigned_get_ref(
462 const bt_integer_range_set_unsigned *int_range_set);
463
464/*!
465@brief
466 Decrements the \ref api-fund-shared-object "reference count" of
467 the unsigned integer range set \bt_p{int_range_set}.
468
469@param[in] int_range_set
470 @parblock
471 Unsigned integer range set of which to decrement the reference
472 count.
473
474 Can be \c NULL.
475 @endparblock
476
477@sa bt_integer_range_set_unsigned_get_ref() &mdash;
478 Increments the reference count of an unsigned integer range set.
479*/
480extern void bt_integer_range_set_unsigned_put_ref(
481 const bt_integer_range_set_unsigned *int_range_set);
482
483/*!
484@brief
485 Decrements the reference count of the unsigned integer range set
486 \bt_p{_int_range_set}, and then sets \bt_p{_int_range_set} to \c
487 NULL.
488
489@param _int_range_set
490 @parblock
491 Unsigned integer range set of which to decrement the reference
492 count.
493
494 Can contain \c NULL.
495 @endparblock
496
497@bt_pre_assign_expr{_int_range_set}
498*/
499#define BT_INTEGER_RANGE_SET_UNSIGNED_PUT_REF_AND_RESET(_int_range_set) \
500 do { \
501 bt_integer_range_set_unsigned_put_ref(_int_range_set); \
502 (_int_range_set) = NULL; \
503 } while (0)
504
505/*!
506@brief
507 Decrements the reference count of the unsigned integer range set
508 \bt_p{_dst}, sets \bt_p{_dst} to \bt_p{_src}, and then sets
509 \bt_p{_src} to \c NULL.
510
511This macro effectively moves an unsigned integer range set reference
512from the expression \bt_p{_src} to the expression \bt_p{_dst}, putting
513the existing \bt_p{_dst} reference.
514
515@param _dst
516 @parblock
517 Destination expression.
518
519 Can contain \c NULL.
520 @endparblock
521@param _src
522 @parblock
523 Source expression.
524
525 Can contain \c NULL.
526 @endparblock
527
528@bt_pre_assign_expr{_dst}
529@bt_pre_assign_expr{_src}
530*/
531#define BT_INTEGER_RANGE_SET_UNSIGNED_MOVE_REF(_dst, _src) \
532 do { \
533 bt_integer_range_set_unsigned_put_ref(_dst); \
534 (_dst) = (_src); \
535 (_src) = NULL; \
536 } while (0)
537
538/*! @} */
539
540/*!
541@name Signed integer range set
542@{
543*/
544
545/*!
546@brief
547 Creates and returns an empty set of signed 64-bit integer ranges.
548
549@returns
550 New signed integer range set, or \c NULL on memory error.
551*/
fb91c0ef
PP
552extern bt_integer_range_set_signed *bt_integer_range_set_signed_create(void);
553
43c59509
PP
554/*!
555@brief
556 Adds a signed 64-bit integer range having the lower value
557 \bt_p{lower} and the upper value \bt_p{upper} to the signed
558 integer range set
559 \bt_p{int_range_set}.
560
561The values \bt_p{lower} and \bt_p{upper} are included in the signed
562integer range to add to \bt_p{int_range_set}.
563
564@param[in] int_range_set
565 Signed integer range set to which to add a signed integer
566 range.
567@param[in] lower
568 Lower value (included) of the signed integer range to add to
569 \bt_p{int_range_set}.
570@param[in] upper
571 Upper value (included) of the signed integer range to add to
572 \bt_p{int_range_set}.
573
574@retval #BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_OK
575 Success.
576@retval #BT_INTEGER_RANGE_SET_ADD_RANGE_STATUS_MEMORY_ERROR
577 Out of memory.
578
579@bt_pre_not_null{int_range_set}
580@bt_pre_hot{int_range_set}
581@pre
582 \bt_p{lower} ≤ \bt_p{upper}.
583*/
584extern bt_integer_range_set_add_range_status
585bt_integer_range_set_signed_add_range(
586 bt_integer_range_set_signed *int_range_set,
fb91c0ef
PP
587 int64_t lower, int64_t upper);
588
43c59509
PP
589/*!
590@brief
591 Borrows the signed integer range at index \bt_p{index} from the
592 signed integer range set \bt_p{int_range_set}.
593
594@param[in] int_range_set
595 Signed integer range set from which to borrow the signed integer
596 range at index \bt_p{index}.
597@param[in] index
598 Index of the signed integer range to borrow from
599 \bt_p{int_range_set}.
600
601@returns
602 @parblock
603 \em Borrowed reference of the signed integer range of
604 \bt_p{int_range_set} at index \bt_p{index}.
605
606 The returned pointer remains valid until \bt_p{int_range_set} is
607 modified.
608 @endparblock
609
610@bt_pre_not_null{int_range_set}
611@pre
612 \bt_p{index} is less than the number of signed integer ranges in
613 \bt_p{int_range_set} (as returned by
614 bt_integer_range_set_get_range_count()).
615*/
616extern const bt_integer_range_signed *
617bt_integer_range_set_signed_borrow_range_by_index_const(
618 const bt_integer_range_set_signed *int_range_set, uint64_t index);
619
620/*!
621@brief
622 Returns whether or not the signed integer range set
623 \bt_p{int_range_set_a} is equal to \bt_p{int_range_set_b}.
624
625Two signed integer range sets are considered equal if they contain the
626exact same signed integer ranges, whatever the order. In other words,
1eca514c
PP
627a signed integer range set containing [−57,&nbsp;23] and [24,&nbsp;42]
628is \em not equal to a signed integer range containing [−57,&nbsp;42].
43c59509
PP
629
630@param[in] int_range_set_a
631 Signed integer range set A.
632@param[in] int_range_set_b
633 Signed integer range set B.
634
635@returns
636 #BT_TRUE if \bt_p{int_range_set_a} is equal to
637 \bt_p{int_range_set_b}.
638
639@bt_pre_not_null{int_range_set_a}
640@bt_pre_not_null{int_range_set_b}
641*/
642extern bt_bool bt_integer_range_set_signed_is_equal(
643 const bt_integer_range_set_signed *int_range_set_a,
644 const bt_integer_range_set_signed *int_range_set_b);
645
646/*!
647@brief
648 \ref api-fund-c-typing "Upcasts" the signed integer range set
649 \bt_p{int_range_set} to the abstract #bt_integer_range_set type.
650
651@param[in] int_range_set
652 @parblock
653 Signed integer range set to upcast.
654
655 Can be \c NULL.
656 @endparblock
657
658@returns
659 \bt_p{int_range_set} as an abstract integer range set.
660*/
661static inline
662const bt_integer_range_set *bt_integer_range_set_signed_as_range_set_const(
663 const bt_integer_range_set_signed *int_range_set)
664{
665 return __BT_UPCAST_CONST(bt_integer_range_set, int_range_set);
666}
667
668/*!
669@brief
670 Increments the \ref api-fund-shared-object "reference count" of
671 the signed integer range set \bt_p{int_range_set}.
672
673@param[in] int_range_set
674 @parblock
675 Signed integer range set of which to increment the reference
676 count.
677
678 Can be \c NULL.
679 @endparblock
680
681@sa bt_integer_range_set_signed_put_ref() &mdash;
682 Decrements the reference count of a signed integer range set.
683*/
684extern void bt_integer_range_set_signed_get_ref(
685 const bt_integer_range_set_signed *int_range_set);
686
687/*!
688@brief
689 Decrements the \ref api-fund-shared-object "reference count" of
690 the signed integer range set \bt_p{int_range_set}.
691
692@param[in] int_range_set
693 @parblock
694 Signed integer range set of which to decrement the reference
695 count.
696
697 Can be \c NULL.
698 @endparblock
699
700@sa bt_integer_range_set_signed_get_ref() &mdash;
701 Increments the reference count of a signed integer range set.
702*/
703extern void bt_integer_range_set_signed_put_ref(
704 const bt_integer_range_set_signed *int_range_set);
705
706/*!
707@brief
708 Decrements the reference count of the signed integer range set
709 \bt_p{_int_range_set}, and then sets \bt_p{_int_range_set} to \c
710 NULL.
711
712@param _int_range_set
713 @parblock
714 Signed integer range set of which to decrement the reference
715 count.
716
717 Can contain \c NULL.
718 @endparblock
719
720@bt_pre_assign_expr{_int_range_set}
721*/
722#define BT_INTEGER_RANGE_SET_SIGNED_PUT_REF_AND_RESET(_int_range_set) \
723 do { \
724 bt_integer_range_set_signed_put_ref(_int_range_set); \
725 (_int_range_set) = NULL; \
726 } while (0)
727
728/*!
729@brief
730 Decrements the reference count of the signed integer range set
731 \bt_p{_dst}, sets \bt_p{_dst} to \bt_p{_src}, and then sets
732 \bt_p{_src} to \c NULL.
733
734This macro effectively moves a signed integer range set reference
735from the expression \bt_p{_src} to the expression \bt_p{_dst}, putting
736the existing \bt_p{_dst} reference.
737
738@param _dst
739 @parblock
740 Destination expression.
741
742 Can contain \c NULL.
743 @endparblock
744@param _src
745 @parblock
746 Source expression.
747
748 Can contain \c NULL.
749 @endparblock
750
751@bt_pre_assign_expr{_dst}
752@bt_pre_assign_expr{_src}
753*/
754#define BT_INTEGER_RANGE_SET_SIGNED_MOVE_REF(_dst, _src) \
755 do { \
756 bt_integer_range_set_signed_put_ref(_dst); \
757 (_dst) = (_src); \
758 (_src) = NULL; \
759 } while (0)
760
761/*! @} */
762
763/*! @} */
764
fb91c0ef
PP
765#ifdef __cplusplus
766}
767#endif
768
769#endif /* BABELTRACE2_INTEGER_RANGE_SET_H */
This page took 0.079864 seconds and 4 git commands to generate.