comparison mupdf-source/include/mupdf/fitz/heap.h @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
comparison
equal deleted inserted replaced
1:1d09e1dec1d9 2:b50eed0cc0ef
1 // Copyright (C) 2004-2025 Artifex Software, Inc.
2 //
3 // This file is part of MuPDF.
4 //
5 // MuPDF is free software: you can redistribute it and/or modify it under the
6 // terms of the GNU Affero General Public License as published by the Free
7 // Software Foundation, either version 3 of the License, or (at your option)
8 // any later version.
9 //
10 // MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY
11 // WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
12 // FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
13 // details.
14 //
15 // You should have received a copy of the GNU Affero General Public License
16 // along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html>
17 //
18 // Alternative licensing terms are available from the licensor.
19 // For commercial licensing, see <https://www.artifex.com/> or contact
20 // Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco,
21 // CA 94129, USA, for further information.
22
23 /* This file has preprocessor magic in it to instantiate both
24 * prototypes and implementations for heap sorting structures
25 * of various different types. Effectively, it's templating for
26 * C.
27 *
28 * If you are including this file directly without intending to
29 * be instantiating a new set of heap sort functions, you are
30 * doing the wrong thing.
31 */
32
33 /* This header file declares some useful heap functions. (Heap
34 * as in heap sort, not as in memory heap). It uses some
35 * clever (read "hacky") multiple inclusion techniques to allow
36 * us to generate multiple different versions of this code.
37 * This is kinda like 'templating' in C++, but without language
38 * support.
39 */
40
41 /* For every instance of this code, we end up a heap structure:
42 *
43 * typedef struct
44 * {
45 * int max;
46 * int len;
47 * <TYPE> *heap;
48 * } fz_<TYPE>_heap;
49 *
50 * This can be created and initialised on the stack in user code using:
51 *
52 * fz_<TYPE>_heap heap = { 0 };
53 *
54 * and some functions.
55 *
56 * When <TYPE> is a simple int (or float or similar), the ordering required is
57 * obvious, and so the functions are simple (Form 1):
58 *
59 * First some to insert elements into the heap:
60 *
61 * void fz_<TYPE>_heap_insert(fz_context *ctx, fz_<TYPE>_heap *heap, <TYPE> v);
62 *
63 * Once all the elements have been inserted, the heap can be sorted:
64 *
65 * void fz_<TYPE>_heap_sort(fz_context *ctx, fz_<TYPE>_heap *heap);
66 *
67 * Once sorted, repeated elements can be removed:
68 *
69 * void fz_<TYPE>_heap_uniq(fz_context *ctx, fz_<TYPE>_heap *heap);
70 *
71 *
72 * For more complex TYPEs (such as pointers) the ordering may not be implicit within the <TYPE>,
73 * but rather depends upon the data found by dereferencing those pointers. For such types,
74 * the functions are modified with a <COMPARE> function, of the form used by qsort etc:
75 *
76 * int <COMPARE>(<TYPE>x, <TYPE>y) that returns 0 for x == y, +ve for x > y, and -ve for x < y.
77 *
78 * The functions are modified thus (Form 2):
79 *
80 * void fz_<TYPE>_heap_insert(fz_context *ctx, fz_<TYPE>_heap *heap, <TYPE> v, <COMPARE> t);
81 * void fz_<TYPE>_heap_sort(fz_context *ctx, fz_<TYPE>_heap *heap, <COMPARE> t);
82 * void fz_<TYPE>_heap_uniq(fz_context *ctx, fz_<TYPE>_heap *heap, <COMPARE> t);
83 *
84 * Currently, we define:
85 *
86 * fz_int_heap Operates on 'int' values. Form 1.
87 * fz_ptr_heap Operates on 'void *' values. Form 2.
88 * fz_int2_heap Operates on 'typedef struct { int a; int b} fz_int2' values,
89 * with the sort/uniq being done based on 'a' alone. Form 1.
90 * fz_intptr_heap Operates on 'typedef struct { int a; void *b} fz_intptr' values,
91 * with the sort/uniq being done based on 'a' alone. Form 1.
92 */
93
94 /* Everything after this point is preprocessor magic. Ignore it, and just read the above
95 * unless you are wanting to instantiate a new set of functions. */
96
97 #ifndef MUPDF_FITZ_HEAP_H
98
99 #define MUPDF_FITZ_HEAP_H
100
101 #define MUPDF_FITZ_HEAP_I_KNOW_WHAT_IM_DOING
102
103 /* Instantiate fz_int_heap */
104 #define HEAP_TYPE_NAME fz_int_heap
105 #define HEAP_CONTAINER_TYPE int
106 #define HEAP_CMP(a,b) ((*a) - (*b))
107 #define HEAP_DUMP(CTX, OUT, I, A) fz_write_printf(CTX, OUT, "%d: %d\n", I, *A)
108 #include "mupdf/fitz/heap-imp.h"
109
110 /* Instantiate fz_ptr_heap */
111 #define HEAP_TYPE_NAME fz_ptr_heap
112 #define HEAP_CONTAINER_TYPE void *
113 #include "mupdf/fitz/heap-imp.h"
114
115 /* Instantiate fz_int2_heap */
116 #ifndef MUPDF_FITZ_HEAP_IMPLEMENT
117 typedef struct
118 {
119 int a;
120 int b;
121 } fz_int2;
122 #endif
123 #define HEAP_TYPE_NAME fz_int2_heap
124 #define HEAP_CMP(A,B) (((A)->a) - ((B)->a))
125 #define HEAP_CONTAINER_TYPE fz_int2
126 #define HEAP_DUMP(CTX, OUT, I, A) fz_write_printf(CTX, OUT, "%d: %d %d\n", I, (A)->a, (A)->b)
127 #include "mupdf/fitz/heap-imp.h"
128
129 /* Instantiate fz_intptr_heap */
130 #ifndef MUPDF_FITZ_HEAP_IMPLEMENT
131 typedef struct
132 {
133 int a;
134 void *b;
135 } fz_intptr;
136 #endif
137 #define HEAP_TYPE_NAME fz_intptr_heap
138 #define HEAP_CONTAINER_TYPE fz_intptr
139 #define HEAP_CMP(A,B) (((A)->a) - ((B)->a))
140 #define HEAP_DUMP(CTX, OUT, I, A) fz_write_printf(CTX, OUT, "%d: %d %p\n", I, (A)->a, (A)->b)
141 #include "mupdf/fitz/heap-imp.h"
142
143 #endif /* MUPDF_FITZ_HEAP_H */