/* list.h: Declarations for C-- lists. */

/* The header file ordering breaks down here; we need to run this file
 * after data.h has completed, not just after the typedefs are done.
 * Thus the ugly conditionals. */

#ifndef DID_LIST_TYPEDEF
typedef struct list List;
#define DID_LIST_TYPEDEF
#endif

#include "data.h"

#ifdef DATA_H_DONE

#ifndef LIST_H
#define LIST_H

struct list {
    int start;
    int len;
    int size;
    int refs;
    Data el[1];
};

List *list_new(int len);
List *list_dup(List *list);
int list_length(List *list);
Data *list_first(List *list);
Data *list_next(List *list, Data *d);
Data *list_last(List *list);
Data *list_prev(List *list, Data *d);
Data *list_elem(List *list, int i);
Data *list_empty_spaces(List *list, int spaces);
int list_search(List *list, Data *data);
int list_cmp(List *l1, List *l2);
List *list_insert(List *list, int pos, Data *elem);
List *list_add(List *list, Data *elem);
List *list_replace(List *list, int pos, Data *elem);
List *list_delete(List *list, int pos);
List *list_delete_element(List *list, Data *elem);
List *list_append(List *list1, List *list2);
List *list_reverse(List *list);
List *list_setadd(List *list, Data *elem);
List *list_setremove(List *list, Data *elem);
List *list_union(List *list1, List *list2);
List *list_sublist(List *list, int start, int len);
void list_discard(List *list);

#endif

#endif