1/***************************************************************************/
2/*                                                                         */
3/*  ftlist.h                                                               */
4/*                                                                         */
5/*    Generic list support for FreeType (specification).                   */
6/*                                                                         */
7/*  Copyright 1996-2001, 2003, 2007, 2010 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     */
22  /*  data 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 "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
41FT_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          */
57  /*    processing 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 :: A pointer to the parent list.                              */
88  /*    data :: The address of the listed object.                          */
89  /*                                                                       */
90  /* <Return>                                                              */
91  /*    List node.  NULL if it wasn't found.                               */
92  /*                                                                       */
93  FT_EXPORT( FT_ListNode )
94  FT_List_Find( FT_List  list,
95                void*    data );
96
97
98  /*************************************************************************/
99  /*                                                                       */
100  /* <Function>                                                            */
101  /*    FT_List_Add                                                        */
102  /*                                                                       */
103  /* <Description>                                                         */
104  /*    Append an element to the end of a list.                            */
105  /*                                                                       */
106  /* <InOut>                                                               */
107  /*    list :: A pointer to the parent list.                              */
108  /*    node :: The node to append.                                        */
109  /*                                                                       */
110  FT_EXPORT( void )
111  FT_List_Add( FT_List      list,
112               FT_ListNode  node );
113
114
115  /*************************************************************************/
116  /*                                                                       */
117  /* <Function>                                                            */
118  /*    FT_List_Insert                                                     */
119  /*                                                                       */
120  /* <Description>                                                         */
121  /*    Insert an element at the head of a list.                           */
122  /*                                                                       */
123  /* <InOut>                                                               */
124  /*    list :: A pointer to parent list.                                  */
125  /*    node :: The node to insert.                                        */
126  /*                                                                       */
127  FT_EXPORT( void )
128  FT_List_Insert( FT_List      list,
129                  FT_ListNode  node );
130
131
132  /*************************************************************************/
133  /*                                                                       */
134  /* <Function>                                                            */
135  /*    FT_List_Remove                                                     */
136  /*                                                                       */
137  /* <Description>                                                         */
138  /*    Remove a node from a list.  This function doesn't check whether    */
139  /*    the node is in the list!                                           */
140  /*                                                                       */
141  /* <Input>                                                               */
142  /*    node :: The node to remove.                                        */
143  /*                                                                       */
144  /* <InOut>                                                               */
145  /*    list :: A pointer to the parent list.                              */
146  /*                                                                       */
147  FT_EXPORT( void )
148  FT_List_Remove( FT_List      list,
149                  FT_ListNode  node );
150
151
152  /*************************************************************************/
153  /*                                                                       */
154  /* <Function>                                                            */
155  /*    FT_List_Up                                                         */
156  /*                                                                       */
157  /* <Description>                                                         */
158  /*    Move a node to the head/top of a list.  Used to maintain LRU       */
159  /*    lists.                                                             */
160  /*                                                                       */
161  /* <InOut>                                                               */
162  /*    list :: A pointer to the parent list.                              */
163  /*    node :: The node to move.                                          */
164  /*                                                                       */
165  FT_EXPORT( void )
166  FT_List_Up( FT_List      list,
167              FT_ListNode  node );
168
169
170  /*************************************************************************/
171  /*                                                                       */
172  /* <FuncType>                                                            */
173  /*    FT_List_Iterator                                                   */
174  /*                                                                       */
175  /* <Description>                                                         */
176  /*    An FT_List iterator function which is called during a list parse   */
177  /*    by @FT_List_Iterate.                                               */
178  /*                                                                       */
179  /* <Input>                                                               */
180  /*    node :: The current iteration list node.                           */
181  /*                                                                       */
182  /*    user :: A typeless pointer passed to @FT_List_Iterate.             */
183  /*            Can be used to point to the iteration's state.             */
184  /*                                                                       */
185  typedef FT_Error
186  (*FT_List_Iterator)( FT_ListNode  node,
187                       void*        user );
188
189
190  /*************************************************************************/
191  /*                                                                       */
192  /* <Function>                                                            */
193  /*    FT_List_Iterate                                                    */
194  /*                                                                       */
195  /* <Description>                                                         */
196  /*    Parse a list and calls a given iterator function on each element.  */
197  /*    Note that parsing is stopped as soon as one of the iterator calls  */
198  /*    returns a non-zero value.                                          */
199  /*                                                                       */
200  /* <Input>                                                               */
201  /*    list     :: A handle to the list.                                  */
202  /*    iterator :: An iterator function, called on each node of the list. */
203  /*    user     :: A user-supplied field which is passed as the second    */
204  /*                argument to the iterator.                              */
205  /*                                                                       */
206  /* <Return>                                                              */
207  /*    The result (a FreeType error code) of the last iterator call.      */
208  /*                                                                       */
209  FT_EXPORT( FT_Error )
210  FT_List_Iterate( FT_List           list,
211                   FT_List_Iterator  iterator,
212                   void*             user );
213
214
215  /*************************************************************************/
216  /*                                                                       */
217  /* <FuncType>                                                            */
218  /*    FT_List_Destructor                                                 */
219  /*                                                                       */
220  /* <Description>                                                         */
221  /*    An @FT_List iterator function which is called during a list        */
222  /*    finalization by @FT_List_Finalize to destroy all elements in a     */
223  /*    given list.                                                        */
224  /*                                                                       */
225  /* <Input>                                                               */
226  /*    system :: The current system object.                               */
227  /*                                                                       */
228  /*    data   :: The current object to destroy.                           */
229  /*                                                                       */
230  /*    user   :: A typeless pointer passed to @FT_List_Iterate.  It can   */
231  /*              be used to point to the iteration's state.               */
232  /*                                                                       */
233  typedef void
234  (*FT_List_Destructor)( FT_Memory  memory,
235                         void*      data,
236                         void*      user );
237
238
239  /*************************************************************************/
240  /*                                                                       */
241  /* <Function>                                                            */
242  /*    FT_List_Finalize                                                   */
243  /*                                                                       */
244  /* <Description>                                                         */
245  /*    Destroy all elements in the list as well as the list itself.       */
246  /*                                                                       */
247  /* <Input>                                                               */
248  /*    list    :: A handle to the list.                                   */
249  /*                                                                       */
250  /*    destroy :: A list destructor that will be applied to each element  */
251  /*               of the list.                                            */
252  /*                                                                       */
253  /*    memory  :: The current memory object which handles deallocation.   */
254  /*                                                                       */
255  /*    user    :: A user-supplied field which is passed as the last       */
256  /*               argument to the destructor.                             */
257  /*                                                                       */
258  /* <Note>                                                                */
259  /*    This function expects that all nodes added by @FT_List_Add or      */
260  /*    @FT_List_Insert have been dynamically allocated.                   */
261  /*                                                                       */
262  FT_EXPORT( void )
263  FT_List_Finalize( FT_List             list,
264                    FT_List_Destructor  destroy,
265                    FT_Memory           memory,
266                    void*               user );
267
268
269  /* */
270
271
272FT_END_HEADER
273
274#endif /* __FTLIST_H__ */
275
276
277/* END */
278