comparison mupdf-source/thirdparty/tesseract/src/cutil/oldlist.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 /******************************************************************************
2 *
3 * File: oldlist.h (Formerly list.h)
4 * Description: List processing procedures declarations.
5 * Author: Mark Seaman, SW Productivity
6 *
7 * (c) Copyright 1987, Hewlett-Packard Company.
8 ** Licensed under the Apache License, Version 2.0 (the "License");
9 ** you may not use this file except in compliance with the License.
10 ** You may obtain a copy of the License at
11 ** http://www.apache.org/licenses/LICENSE-2.0
12 ** Unless required by applicable law or agreed to in writing, software
13 ** distributed under the License is distributed on an "AS IS" BASIS,
14 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 ** See the License for the specific language governing permissions and
16 ** limitations under the License.
17 *
18 ******************************************************************************
19 *
20 * This file contains the interface for a set of general purpose list
21 * manipulation routines. For the implementation of these routines see
22 * the file "list.c".
23 *
24 ******************************************************************************
25 *
26 * INDEX
27 * =======
28 *
29 * BASICS:
30 * -------
31 * first_node - Macro to return the first list node (not the cell).
32 * list_rest - Macro the return the second list cell
33 * pop - Destroy one list cell
34 * push - Create one list cell and set the node and next fields
35 *
36 * ITERATION:
37 * -----------------
38 * iterate - Macro to create a for loop to visit each cell.
39 *
40 * LIST CELL COUNTS:
41 * -----------------
42 * count - Returns the number of list cells in the list.
43 * last - Returns the last list cell.
44 *
45 * TRANSFORMS: (Note: These functions all modify the input list.)
46 * ----------
47 * delete_d - Removes the requested elements from the list.
48 * push_last - Add a new element onto the end of a list.
49 *
50 * SETS:
51 * -----
52 * search - Return the pointer to the list cell whose node matches.
53 *
54 * CELL OPERATIONS:
55 * -----------------
56 * destroy - Return all list cells in a list.
57 * destroy_nodes - Apply a function to each list cell and destroy the list.
58 * set_rest - Assign the next field in a list cell.
59 *
60 ***********************************************************************/
61
62 #ifndef LIST_H
63 #define LIST_H
64
65 #include <tesseract/export.h>
66
67 #include <cstddef> // for size_t
68
69 namespace tesseract {
70
71 /*----------------------------------------------------------------------
72 T y p e s
73 ----------------------------------------------------------------------*/
74
75 #define NIL_LIST static_cast<LIST>(nullptr)
76
77 using int_compare = int (*)(void *, void *);
78 using void_dest = void (*)(void *);
79
80 /*----------------------------------------------------------------------
81 M a c r o s
82 ----------------------------------------------------------------------*/
83
84 /**********************************************************************
85 * i t e r a t e
86 *
87 * Visit each node in the list. Replace the old list with the list
88 * minus the head. Continue until the list is NIL_LIST.
89 **********************************************************************/
90
91 #define iterate(l) for (; (l) != nullptr; (l) = (l)->list_rest())
92
93 /**********************************************************************
94 * s e t r e s t
95 *
96 * Change the "next" field of a list element to point to a desired place.
97 *
98 * #define set_rest(l,node) l->next = node;
99 **********************************************************************/
100
101 #define set_rest(l, cell) ((l)->next = (cell))
102
103 struct list_rec {
104 list_rec *node;
105 list_rec *next;
106
107 list_rec *first_node() {
108 return node;
109 }
110
111 list_rec *list_rest() {
112 return next;
113 }
114
115 //********************************************************************
116 // Recursively count the elements in a list. Return the count.
117 //********************************************************************
118 size_t size() {
119 auto var_list = this;
120 size_t n = 0;
121 iterate(var_list) n++;
122 return n;
123 }
124 };
125 using LIST = list_rec *;
126
127 /*----------------------------------------------------------------------
128 Public Function Prototypes
129 ----------------------------------------------------------------------*/
130
131 LIST delete_d(LIST list, void *key, int_compare is_equal);
132
133 TESS_API
134 LIST destroy(LIST list);
135
136 void destroy_nodes(LIST list, void_dest destructor);
137
138 LIST last(LIST var_list);
139
140 LIST pop(LIST list);
141
142 TESS_API
143 LIST push(LIST list, void *element);
144
145 TESS_API
146 LIST push_last(LIST list, void *item);
147
148 LIST search(LIST list, void *key, int_compare is_equal);
149
150 } // namespace tesseract
151
152 #endif