/*
 * Summary: lists interfaces
 * Description: this module implement the list support used in 
 * various place in the library.
 *
 * Copy: See Copyright for the status of this software.
 *
 * Author: Gary Pennington <Gary.Pennington@uk.sun.com>
 */

#ifndef __XML_LINK_INCLUDE__
#define __XML_LINK_INCLUDE__

#include "xmlversion.h"

#ifdef __cplusplus
extern "C" {
#endif

typedef struct _xmlLink xmlLink;
typedef xmlLink *xmlLinkPtr;

typedef struct _xmlList xmlList;
typedef xmlList *xmlListPtr;

/**
 * xmlListDeallocator:
 * @lk:  the data to deallocate
 *
 * Callback function used to free data from a list.
 */
typedef void (*xmlListDeallocator) (xmlLinkPtr lk);
/**
 * xmlListDataCompare:
 * @data0: the first data
 * @data1: the second data
 *
 * Callback function used to compare 2 data.
 *
 * Returns 0 is equality, -1 or 1 otherwise depending on the ordering.
 */
typedef int  (*xmlListDataCompare) (const void *data0, const void *data1);
/**
 * xmlListWalker:
 * @data: the data found in the list
 * @user: extra user provided data to the walker
 *
 * Callback function used when walking a list with xmlListWalk().
 *
 * Returns 0 to stop walking the list, 1 otherwise.
 */
typedef int (*xmlListWalker) (const void *data, const void *user);

/* Creation/Deletion */
XMLPUBFUN xmlListPtr XMLCALL
                xmlListCreate           (xmlListDeallocator deallocator,
                                         xmlListDataCompare compare);
XMLPUBFUN void XMLCALL          
                xmlListDelete           (xmlListPtr l);

/* Basic Operators */
XMLPUBFUN void * XMLCALL                
                xmlListSearch           (xmlListPtr l,
                                         void *data);
XMLPUBFUN void * XMLCALL                
                xmlListReverseSearch    (xmlListPtr l,
                                         void *data);
XMLPUBFUN int XMLCALL           
                xmlListInsert           (xmlListPtr l,
                                         void *data) ;
XMLPUBFUN int XMLCALL           
                xmlListAppend           (xmlListPtr l,
                                         void *data) ;
XMLPUBFUN int XMLCALL           
                xmlListRemoveFirst      (xmlListPtr l,
                                         void *data);
XMLPUBFUN int XMLCALL           
                xmlListRemoveLast       (xmlListPtr l,
                                         void *data);
XMLPUBFUN int XMLCALL           
                xmlListRemoveAll        (xmlListPtr l,
                                         void *data);
XMLPUBFUN void XMLCALL          
                xmlListClear            (xmlListPtr l);
XMLPUBFUN int XMLCALL           
                xmlListEmpty            (xmlListPtr l);
XMLPUBFUN xmlLinkPtr XMLCALL    
                xmlListFront            (xmlListPtr l);
XMLPUBFUN xmlLinkPtr XMLCALL    
                xmlListEnd              (xmlListPtr l);
XMLPUBFUN int XMLCALL           
                xmlListSize             (xmlListPtr l);

XMLPUBFUN void XMLCALL          
                xmlListPopFront         (xmlListPtr l);
XMLPUBFUN void XMLCALL          
                xmlListPopBack          (xmlListPtr l);
XMLPUBFUN int XMLCALL           
                xmlListPushFront        (xmlListPtr l,
                                         void *data);
XMLPUBFUN int XMLCALL           
                xmlListPushBack         (xmlListPtr l,
                                         void *data);

/* Advanced Operators */
XMLPUBFUN void XMLCALL          
                xmlListReverse          (xmlListPtr l);
XMLPUBFUN void XMLCALL          
                xmlListSort             (xmlListPtr l);
XMLPUBFUN void XMLCALL          
                xmlListWalk             (xmlListPtr l,
                                         xmlListWalker walker,
                                         const void *user);
XMLPUBFUN void XMLCALL          
                xmlListReverseWalk      (xmlListPtr l,
                                         xmlListWalker walker,
                                         const void *user);
XMLPUBFUN void XMLCALL          
                xmlListMerge            (xmlListPtr l1,
                                         xmlListPtr l2);
XMLPUBFUN xmlListPtr XMLCALL    
                xmlListDup              (const xmlListPtr old);
XMLPUBFUN int XMLCALL           
                xmlListCopy             (xmlListPtr cur,
                                         const xmlListPtr old);
/* Link operators */
XMLPUBFUN void * XMLCALL          
                xmlLinkGetData          (xmlLinkPtr lk);

/* xmlListUnique() */
/* xmlListSwap */

#ifdef __cplusplus
}
#endif

#endif /* __XML_LINK_INCLUDE__ */
