1 /**************************************************************************** 2 * 3 * ftlist.h 4 * 5 * Generic list support for FreeType (specification). 6 * 7 * Copyright (C) 1996-2019 by 8 * David Turner, Robert Wilhelm, and Werner Lemberg. 9 * 10 * This file is part of the FreeType project, and may only be used, 11 * modified, and distributed under the terms of the FreeType project 12 * license, LICENSE.TXT. By continuing to use, modify, or distribute 13 * this file you indicate that you have read the license and 14 * understand and accept it fully. 15 * 16 */ 17 18 19 /************************************************************************** 20 * 21 * This file implements functions relative to list processing. Its data 22 * structures are defined in `freetype.h`. 23 * 24 */ 25 26 27 #ifndef FTLIST_H_ 28 #define FTLIST_H_ 29 30 31 #include <ft2build.h> 32 #include FT_FREETYPE_H 33 34 #ifdef FREETYPE_H 35 #error "freetype.h of FreeType 1 has been loaded!" 36 #error "Please fix the directory search order for header files" 37 #error "so that freetype.h of FreeType 2 is found first." 38 #endif 39 40 41 FT_BEGIN_HEADER 42 43 44 /************************************************************************** 45 * 46 * @section: 47 * list_processing 48 * 49 * @title: 50 * List Processing 51 * 52 * @abstract: 53 * Simple management of lists. 54 * 55 * @description: 56 * This section contains various definitions related to list processing 57 * using doubly-linked nodes. 58 * 59 * @order: 60 * FT_List 61 * FT_ListNode 62 * FT_ListRec 63 * FT_ListNodeRec 64 * 65 * FT_List_Add 66 * FT_List_Insert 67 * FT_List_Find 68 * FT_List_Remove 69 * FT_List_Up 70 * FT_List_Iterate 71 * FT_List_Iterator 72 * FT_List_Finalize 73 * FT_List_Destructor 74 * 75 */ 76 77 78 /************************************************************************** 79 * 80 * @function: 81 * FT_List_Find 82 * 83 * @description: 84 * Find the list node for a given listed object. 85 * 86 * @input: 87 * list :: 88 * A pointer to the parent list. 89 * data :: 90 * The address of the listed object. 91 * 92 * @return: 93 * List node. `NULL` if it wasn't found. 94 */ 95 FT_EXPORT( FT_ListNode ) 96 FT_List_Find( FT_List list, 97 void* data ); 98 99 100 /************************************************************************** 101 * 102 * @function: 103 * FT_List_Add 104 * 105 * @description: 106 * Append an element to the end of a list. 107 * 108 * @inout: 109 * list :: 110 * A pointer to the parent list. 111 * node :: 112 * The node to append. 113 */ 114 FT_EXPORT( void ) 115 FT_List_Add( FT_List list, 116 FT_ListNode node ); 117 118 119 /************************************************************************** 120 * 121 * @function: 122 * FT_List_Insert 123 * 124 * @description: 125 * Insert an element at the head of a list. 126 * 127 * @inout: 128 * list :: 129 * A pointer to parent list. 130 * node :: 131 * The node to insert. 132 */ 133 FT_EXPORT( void ) 134 FT_List_Insert( FT_List list, 135 FT_ListNode node ); 136 137 138 /************************************************************************** 139 * 140 * @function: 141 * FT_List_Remove 142 * 143 * @description: 144 * Remove a node from a list. This function doesn't check whether the 145 * node is in the list! 146 * 147 * @input: 148 * node :: 149 * The node to remove. 150 * 151 * @inout: 152 * list :: 153 * A pointer to the parent list. 154 */ 155 FT_EXPORT( void ) 156 FT_List_Remove( FT_List list, 157 FT_ListNode node ); 158 159 160 /************************************************************************** 161 * 162 * @function: 163 * FT_List_Up 164 * 165 * @description: 166 * Move a node to the head/top of a list. Used to maintain LRU lists. 167 * 168 * @inout: 169 * list :: 170 * A pointer to the parent list. 171 * node :: 172 * The node to move. 173 */ 174 FT_EXPORT( void ) 175 FT_List_Up( FT_List list, 176 FT_ListNode node ); 177 178 179 /************************************************************************** 180 * 181 * @functype: 182 * FT_List_Iterator 183 * 184 * @description: 185 * An FT_List iterator function that is called during a list parse by 186 * @FT_List_Iterate. 187 * 188 * @input: 189 * node :: 190 * The current iteration list node. 191 * 192 * user :: 193 * A typeless pointer passed to @FT_List_Iterate. Can be used to point 194 * to the iteration's state. 195 */ 196 typedef FT_Error 197 (*FT_List_Iterator)( FT_ListNode node, 198 void* user ); 199 200 201 /************************************************************************** 202 * 203 * @function: 204 * FT_List_Iterate 205 * 206 * @description: 207 * Parse a list and calls a given iterator function on each element. 208 * Note that parsing is stopped as soon as one of the iterator calls 209 * returns a non-zero value. 210 * 211 * @input: 212 * list :: 213 * A handle to the list. 214 * iterator :: 215 * An iterator function, called on each node of the list. 216 * user :: 217 * A user-supplied field that is passed as the second argument to the 218 * iterator. 219 * 220 * @return: 221 * The result (a FreeType error code) of the last iterator call. 222 */ 223 FT_EXPORT( FT_Error ) 224 FT_List_Iterate( FT_List list, 225 FT_List_Iterator iterator, 226 void* user ); 227 228 229 /************************************************************************** 230 * 231 * @functype: 232 * FT_List_Destructor 233 * 234 * @description: 235 * An @FT_List iterator function that is called during a list 236 * finalization by @FT_List_Finalize to destroy all elements in a given 237 * list. 238 * 239 * @input: 240 * system :: 241 * The current system object. 242 * 243 * data :: 244 * The current object to destroy. 245 * 246 * user :: 247 * A typeless pointer passed to @FT_List_Iterate. It can be used to 248 * point to the iteration's state. 249 */ 250 typedef void 251 (*FT_List_Destructor)( FT_Memory memory, 252 void* data, 253 void* user ); 254 255 256 /************************************************************************** 257 * 258 * @function: 259 * FT_List_Finalize 260 * 261 * @description: 262 * Destroy all elements in the list as well as the list itself. 263 * 264 * @input: 265 * list :: 266 * A handle to the list. 267 * 268 * destroy :: 269 * A list destructor that will be applied to each element of the list. 270 * Set this to `NULL` if not needed. 271 * 272 * memory :: 273 * The current memory object that handles deallocation. 274 * 275 * user :: 276 * A user-supplied field that is passed as the last argument to the 277 * destructor. 278 * 279 * @note: 280 * This function expects that all nodes added by @FT_List_Add or 281 * @FT_List_Insert have been dynamically allocated. 282 */ 283 FT_EXPORT( void ) 284 FT_List_Finalize( FT_List list, 285 FT_List_Destructor destroy, 286 FT_Memory memory, 287 void* user ); 288 289 /* */ 290 291 292 FT_END_HEADER 293 294 #endif /* FTLIST_H_ */ 295 296 297 /* END */