/* * Copyright 1999-2006 University of Chicago * * 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. */ /** * @file globus_list.h * @brief Linked List */ /** * @defgroup globus_list Linked List * @ingroup globus_common * @brief Linked List */ #ifndef GLOBUS_LIST_H #define GLOBUS_LIST_H #ifdef __cplusplus extern "C" { #endif /** * @brief List data type * @ingroup globus_list * @param * A structure representing a node containing a single datum and a reference to * additional elements in the list. * * The special value NULL is used to represent a list with zero elements, also * called an empty list. */ typedef struct globus_list { void * volatile datum; struct globus_list * volatile next; int malloced; } globus_list_t; /** * @brief List search predicate * @ingroup globus_list * @details * An anonymous predicate that evaluates a datum as true or false in the * context of user-provided arg. These predicates are used for example in * general searches with globus_list_search_pred(), and the arg field is used * to implement in C something approximating closures in a functional language * by encapsulating instance-specific search criteria. * * These predicates return non-zero for truth and zero for falsity so they can * be used in C conditional expressions. * @param datum * Datum of the list item to compute the predicate against. * @param arg * Parameter supplied to globus_list_search_pred() */ typedef int (*globus_list_pred_t) (void *datum, void *arg); /** * @brief Relation predicate * @ingroup globus_list * @details * An anonymous predicate that defines a partial ordering of data. Such * ordering predicates evaluate true if low_datum is less than * (or comes before) high_datum in the ordering, and false otherwise. * These predicates are used for example in general sorts with * globus_list_sort(), and the relation_arg field is used to implement in C * something approximating closures in a functional language by encapsulating * instance-specific ordering criteria. * * These predicates return non-zero for truth and zero for falsity so they can * be used in C conditional expressions. * @param low_datum * Datum to compare * @param high_datum * Datum to compare * @param relation_arg * Parameter supplied to globus_list_sort() */ typedef int (*globus_list_relation_t) (void *low_datum, void *high_datum, void *relation_arg); int globus_i_list_pre_activate(void); extern int globus_list_int_less (void * low_datum, void * high_datum, void * ignored); extern int globus_list_empty (globus_list_t * head); globus_list_t * globus_list_concat( globus_list_t * front_list, globus_list_t * back_list); extern void * globus_list_first (globus_list_t * head); extern globus_list_t * globus_list_rest (globus_list_t * head); extern globus_list_t ** globus_list_rest_ref (globus_list_t * head); extern int globus_list_size (globus_list_t * head); extern void * globus_list_replace_first (globus_list_t * head, void *datum); extern globus_list_t * globus_list_search (globus_list_t * head, void * datum); extern globus_list_t * globus_list_search_pred (globus_list_t * head, globus_list_pred_t predicate, void * pred_args); extern globus_list_t * globus_list_min (globus_list_t * head, globus_list_relation_t relation, void * relation_args); extern globus_list_t * globus_list_sort_destructive (globus_list_t * head, globus_list_relation_t relation, void *relation_args); extern void globus_list_halves_destructive (globus_list_t * head, globus_list_t * volatile * left_halfp, globus_list_t * volatile * right_halfp); extern globus_list_t * globus_list_sort_merge_destructive (globus_list_t *left, globus_list_t *right, globus_list_relation_t relation, void * relation_args); extern globus_list_t * globus_list_sort (globus_list_t *head, globus_list_relation_t relation, void *relation_args); extern int globus_list_insert (globus_list_t * volatile *headp, void *datum); extern globus_list_t * globus_list_cons (void * datum, globus_list_t *list); extern globus_list_t * globus_list_copy (globus_list_t *head); extern void * globus_list_remove (globus_list_t * volatile *headp, globus_list_t *entry); extern void globus_list_free (globus_list_t *head); void globus_list_destroy_all( globus_list_t * head, void (*data_free)(void *)); extern globus_list_t * globus_list_from_string( const char * in_string, int delim, const char * ignored); #ifdef __cplusplus } #endif #endif /* GLOBUS_LIST_H */