1 /***************************************************************************/
   2 /*                                                                         */
   3 /*  ftlist.h                                                               */
   4 /*                                                                         */
   5 /*    Generic list support for FreeType (specification).                   */
   6 /*                                                                         */
   7 /*  Copyright 1996-2018 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 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          */
  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 that 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 that 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 that 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.  Set this to NULL if not needed.           */
 252   /*                                                                       */
 253   /*    memory  :: The current memory object that handles deallocation.    */
 254   /*                                                                       */
 255   /*    user    :: A user-supplied field that 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 FT_END_HEADER
 272 
 273 #endif /* FTLIST_H_ */
 274 
 275 
 276 /* END */