Mercurial > hgrepos > Python2 > PyMuPDF
diff 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 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mupdf-source/include/mupdf/fitz/heap.h Mon Sep 15 11:43:07 2025 +0200 @@ -0,0 +1,143 @@ +// Copyright (C) 2004-2025 Artifex Software, Inc. +// +// This file is part of MuPDF. +// +// MuPDF is free software: you can redistribute it and/or modify it under the +// terms of the GNU Affero General Public License as published by the Free +// Software Foundation, either version 3 of the License, or (at your option) +// any later version. +// +// MuPDF is distributed in the hope that it will be useful, but WITHOUT ANY +// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS +// FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more +// details. +// +// You should have received a copy of the GNU Affero General Public License +// along with MuPDF. If not, see <https://www.gnu.org/licenses/agpl-3.0.en.html> +// +// Alternative licensing terms are available from the licensor. +// For commercial licensing, see <https://www.artifex.com/> or contact +// Artifex Software, Inc., 39 Mesa Street, Suite 108A, San Francisco, +// CA 94129, USA, for further information. + +/* This file has preprocessor magic in it to instantiate both + * prototypes and implementations for heap sorting structures + * of various different types. Effectively, it's templating for + * C. + * + * If you are including this file directly without intending to + * be instantiating a new set of heap sort functions, you are + * doing the wrong thing. + */ + +/* This header file declares some useful heap functions. (Heap + * as in heap sort, not as in memory heap). It uses some + * clever (read "hacky") multiple inclusion techniques to allow + * us to generate multiple different versions of this code. + * This is kinda like 'templating' in C++, but without language + * support. + */ + +/* For every instance of this code, we end up a heap structure: + * + * typedef struct + * { + * int max; + * int len; + * <TYPE> *heap; + * } fz_<TYPE>_heap; + * + * This can be created and initialised on the stack in user code using: + * + * fz_<TYPE>_heap heap = { 0 }; + * + * and some functions. + * + * When <TYPE> is a simple int (or float or similar), the ordering required is + * obvious, and so the functions are simple (Form 1): + * + * First some to insert elements into the heap: + * + * void fz_<TYPE>_heap_insert(fz_context *ctx, fz_<TYPE>_heap *heap, <TYPE> v); + * + * Once all the elements have been inserted, the heap can be sorted: + * + * void fz_<TYPE>_heap_sort(fz_context *ctx, fz_<TYPE>_heap *heap); + * + * Once sorted, repeated elements can be removed: + * + * void fz_<TYPE>_heap_uniq(fz_context *ctx, fz_<TYPE>_heap *heap); + * + * + * For more complex TYPEs (such as pointers) the ordering may not be implicit within the <TYPE>, + * but rather depends upon the data found by dereferencing those pointers. For such types, + * the functions are modified with a <COMPARE> function, of the form used by qsort etc: + * + * int <COMPARE>(<TYPE>x, <TYPE>y) that returns 0 for x == y, +ve for x > y, and -ve for x < y. + * + * The functions are modified thus (Form 2): + * + * void fz_<TYPE>_heap_insert(fz_context *ctx, fz_<TYPE>_heap *heap, <TYPE> v, <COMPARE> t); + * void fz_<TYPE>_heap_sort(fz_context *ctx, fz_<TYPE>_heap *heap, <COMPARE> t); + * void fz_<TYPE>_heap_uniq(fz_context *ctx, fz_<TYPE>_heap *heap, <COMPARE> t); + * + * Currently, we define: + * + * fz_int_heap Operates on 'int' values. Form 1. + * fz_ptr_heap Operates on 'void *' values. Form 2. + * fz_int2_heap Operates on 'typedef struct { int a; int b} fz_int2' values, + * with the sort/uniq being done based on 'a' alone. Form 1. + * fz_intptr_heap Operates on 'typedef struct { int a; void *b} fz_intptr' values, + * with the sort/uniq being done based on 'a' alone. Form 1. + */ + +/* Everything after this point is preprocessor magic. Ignore it, and just read the above + * unless you are wanting to instantiate a new set of functions. */ + +#ifndef MUPDF_FITZ_HEAP_H + +#define MUPDF_FITZ_HEAP_H + +#define MUPDF_FITZ_HEAP_I_KNOW_WHAT_IM_DOING + +/* Instantiate fz_int_heap */ +#define HEAP_TYPE_NAME fz_int_heap +#define HEAP_CONTAINER_TYPE int +#define HEAP_CMP(a,b) ((*a) - (*b)) +#define HEAP_DUMP(CTX, OUT, I, A) fz_write_printf(CTX, OUT, "%d: %d\n", I, *A) +#include "mupdf/fitz/heap-imp.h" + +/* Instantiate fz_ptr_heap */ +#define HEAP_TYPE_NAME fz_ptr_heap +#define HEAP_CONTAINER_TYPE void * +#include "mupdf/fitz/heap-imp.h" + +/* Instantiate fz_int2_heap */ +#ifndef MUPDF_FITZ_HEAP_IMPLEMENT +typedef struct +{ + int a; + int b; +} fz_int2; +#endif +#define HEAP_TYPE_NAME fz_int2_heap +#define HEAP_CMP(A,B) (((A)->a) - ((B)->a)) +#define HEAP_CONTAINER_TYPE fz_int2 +#define HEAP_DUMP(CTX, OUT, I, A) fz_write_printf(CTX, OUT, "%d: %d %d\n", I, (A)->a, (A)->b) +#include "mupdf/fitz/heap-imp.h" + +/* Instantiate fz_intptr_heap */ +#ifndef MUPDF_FITZ_HEAP_IMPLEMENT +typedef struct +{ + int a; + void *b; +} fz_intptr; +#endif +#define HEAP_TYPE_NAME fz_intptr_heap +#define HEAP_CONTAINER_TYPE fz_intptr +#define HEAP_CMP(A,B) (((A)->a) - ((B)->a)) +#define HEAP_DUMP(CTX, OUT, I, A) fz_write_printf(CTX, OUT, "%d: %d %p\n", I, (A)->a, (A)->b) +#include "mupdf/fitz/heap-imp.h" + +#endif /* MUPDF_FITZ_HEAP_H */
