blob: 056490ca931c410e2d8df6fc0c8f24794ccbd5aa [file] [log] [blame]
/* -*-C-*-
********************************************************************************
*
* File: list.h (Formerly list.h)
* Description: List processing procedures declarations.
* Author: Mark Seaman, SW Productivity
* Created: Fri Oct 16 14:37:00 1987
* Modified: Wed Dec 5 15:43:17 1990 (Mark Seaman) marks@hpgrlt
* Language: C
* Package: N/A
* Status: Reusable Software Component
*
* (c) Copyright 1987, Hewlett-Packard Company.
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
** http://www.apache.org/licenses/LICENSE-2.0
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*
********************************************************************************
*
* This file contains the interface for a set of general purpose list
* manipulation routines. For the implementation of these routines see
* the file "list.c".
*
********************************************************************************
*
* INDEX
* =======
*
* BASICS:
* -------
* first_node - Macro to return the first list node (not the cell).
* rest - Macro the return the second list cell
* pop - Destroy one list cell
* push - Create one list cell and set the node and next fields
*
* ITERATION:
* -----------------
* iterate - Macro to create a for loop to visit each cell.
* iterate_list - Macro to visit each cell using a local variable.
* for_each - Applies a function to each node.
*
* LIST CELL COUNTS:
* -----------------
* count - Returns the number of list cells in the list.
* second_node - Returns the second node.
* third - Returns the third node.
* fourth - Returns the fourth node.
* fifth - Returns the fifth node.
* last - Returns the last list cell.
* pair - Creates a list of two elements.
*
* COPYING:
* -----------------
* copy_first - Pushes the first element from list 1 onto list 2.
* copy - Create a copy of a list.
* concat - Creates a new list that is a copy of both input lists.
* delete_n - Creates a new list without the chosen elements.
* reverse - Creates a backwards copy of the input list.
* sort - Use quick sort to construct a new list.
* transform - Creates a new list by transforming each of the nodes.
*
* TRANFORMS: (Note: These functions all modify the input list.)
* ----------
* join - Concatenates list 1 and list 2.
* delete_d - Removes the requested elements from the list.
* transform_d - Modifies the list by applying a function to each node.
* insert - Add a new element into this spot in a list. (not NIL)
* push_last - Add a new element onto the end of a list.
* reverse_d - Reverse a list and destroy the old one.
*
* ASSOCIATED LISTS:
* -----------------
* adelete - Remove a particular entry from an associated list.
* assoc - Find an entry in an associated list that matches a key.
* match - Return the data element of an a-list entry.
*
* DISPLAY:
* -----------------
* print_cell - Print a hex dump of a list cell.
* show - Displays a string and a list (using lprint).
*
* SETS:
* -----
* adjoin - Add a new element to list if it does not exist already.
* intersection - Create a new list that is the set intersection.
* set_union - Create a new list that is the set intersection.
* set_difference - Create a new list that is the set difference.
* s_adjoin - Add an element to a sort list if it is not there.
* s_intersection - Set intersection on a sorted list. Modifies old list.
* s_union - Set intersection on a sorted list. Modifies old list.
* search - Return the pointer to the list cell whose node matches.
*
* COMPARISONS:
* -----------------
* is_same - Compares each node to the key.
* is_not_same - Compares each node to the key.
* is_key - Compares first of each node to the key.
* is_not_key - Compares first of each node to the key.
*
* CELL OPERATIONS:
* -----------------
* new_cell - Obtain a new list cell from the free list. Allocate.
* free_cell - Return a list cell to the free list.
* destroy - Return all list cells in a list.
* destroy_nodes - Apply a function to each list cell and destroy the list.
* set_node - Assign the node field in a list cell.
* set_rest - Assign the next field in a list cell.
*
***********************************************************************/
#ifndef LIST_H
#define LIST_H
#include "cutil.h"
#include "callback.h"
/*----------------------------------------------------------------------
T y p e s
----------------------------------------------------------------------*/
#define NIL (LIST) 0
typedef struct list_rec
{
struct list_rec *node;
struct list_rec *next;
} _LIST_;
typedef _LIST_ *LIST;
/*----------------------------------------------------------------------
M a c r o s
----------------------------------------------------------------------*/
/* Predefinitions */
#define rest(l) ((l) ? (l)->next : NIL)
#define first_node(l) ((l) ? (l)->node : NIL)
/**********************************************************************
* c o p y f i r s t
*
* Do the appropriate kind a push operation to copy the first node from
* one list to another.
*
**********************************************************************/
#define copy_first(l1,l2) \
(l2=push(l2, first_node(l1)))
/**********************************************************************
* i t e r a t e
*
* Visit each node in the list. Replace the old list with the list
* minus the head. Continue until the list is NIL.
**********************************************************************/
#define iterate(l) \
for (; (l) != NIL; (l) = rest (l))
/**********************************************************************
* i t e r a t e l i s t
*
* Visit each node in the list (l). Use a local variable (x) to iterate
* through all of the list cells. This macro is identical to iterate
* except that it does not lose the original list.
**********************************************************************/
#define iterate_list(x,l) \
for ((x)=(l); (x)!=0; (x)=rest(x))
/**********************************************************************
* j o i n o n
*
* Add another list onto the tail of this one. The list given as an input
* parameter is modified.
**********************************************************************/
#define JOIN_ON(list1,list2) \
((list1) = join ((list1), (list2)))
/**********************************************************************
* p o p o f f
*
* Add a cell onto the front of a list. The list given as an input
* parameter is modified.
**********************************************************************/
#define pop_off(list) \
((list) = pop (list))
/**********************************************************************
* p u s h o n
*
* Add a cell onto the front of a list. The list given as an input
* parameter is modified.
**********************************************************************/
#define push_on(list,thing) \
((list) = push (list, (LIST) (thing)))
/**********************************************************************
* s e c o n d
*
* Return the contents of the second list element.
*
* #define second_node(l) first_node (rest (l))
**********************************************************************/
#define second_node(l) \
first_node (rest (l))
/**********************************************************************
* s e t r e s t
*
* Change the "next" field of a list element to point to a desired place.
*
* #define set_rest(l,node) l->next = node;
**********************************************************************/
#define set_rest(l,cell)\
((l)->next = (cell))
/**********************************************************************
* t h i r d
*
* Return the contents of the third list element.
*
* #define third(l) first_node (rest (rest (l)))
**********************************************************************/
#define third(l) \
first_node (rest (rest (l)))
/*----------------------------------------------------------------------
Public Funtion Prototypes
----------------------------------------------------------------------*/
int count(LIST var_list);
LIST delete_d(LIST list, void *key, int_compare is_equal);
LIST delete_d(LIST list, void *key,
ResultCallback2<int, void*, void*>* is_equal);
LIST destroy(LIST list);
void destroy_nodes(LIST list, void_dest destructor);
void insert(LIST list, void *node);
int is_same_node(void *item1, void *item2);
int is_same(void *item1, void *item2);
LIST join(LIST list1, LIST list2);
LIST last(LIST var_list);
void *nth_cell(LIST var_list, int item_num);
LIST pop(LIST list);
LIST push(LIST list, void *element);
LIST push_last(LIST list, void *item);
LIST reverse(LIST list);
LIST reverse_d(LIST list);
LIST s_adjoin(LIST var_list, void *variable, int_compare compare);
LIST search(LIST list, void *key, int_compare is_equal);
LIST search(LIST list, void *key, ResultCallback2<int, void*, void*>*);
/*
#if defined(__STDC__) || defined(__cplusplus)
# define _ARGS(s) s
#else
# define _ARGS(s) ()
#endif
typedef void (*destructor) _ARGS((LIST l));
typedef LIST (*list_proc) _ARGS((LIST a));
int count
_ARGS((LIST var_list));
LIST delete_d
_ARGS((LIST list,
LIST key,
int_compare is_equal));
LIST destroy
_ARGS((LIST list));
LIST destroy_nodes
_ARGS((LIST list,
void_dest destructor));
void insert
_ARGS((LIST list,
LIST node));
int is_same_node
_ARGS((LIST s1,
LIST s2));
int is_same
_ARGS((LIST s1,
LIST s2));
LIST join
_ARGS((LIST list1,
LIST list2));
LIST last
_ARGS((LIST var_list));
LIST nth_cell
_ARGS((LIST var_list,
int item_num));
LIST pop
_ARGS((LIST list));
LIST push
_ARGS((LIST list,
LIST element));
LIST push_last
_ARGS((LIST list,
LIST item));
LIST reverse
_ARGS((LIST list));
LIST reverse_d
_ARGS((LIST list));
LIST s_adjoin
_ARGS((LIST var_list,
LIST variable,
int_compare compare));
LIST search
_ARGS((LIST list,
LIST key,
int_compare is_equal));
#undef _ARGS
*/
#endif