blob: c2aef2c7db1275b32a32f5f7d83036787ea40633 [file] [log] [blame]
/*
* Copyright (c) 2000-2001 Silicon Graphics, Inc.
* All Rights Reserved.
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation.
*
* This program is distributed in the hope that it would be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef BAG_H
#define BAG_H
/* bag.[hc] - bag abstraction
*
* user embeds a bagelem_t into items to be bagged. the element contains
* an element key, and a user-specified pointer. items can be inserted
* into the bag, removed from the bag, and searched for in the bag. the
* user-embedded bagelem_t is soley owned by the bag: DON'T try to
* reference bagelem_t members!
*/
struct bagelem {
bool_t be_loaded;
struct bag *be_bagp;
size64_t be_key;
void *be_payloadp;
struct bagelem *be_nextp;
struct bagelem *be_prevp;
};
typedef struct bagelem bagelem_t;
struct bag {
bagelem_t *b_headp;
};
typedef struct bag bag_t;
/* creates a new bag
*/
extern bag_t *bag_alloc(void);
/* insert the item into the bag. the caller supplies a search key
* and arbitrary payload.
*/
extern void bag_insert(bag_t *bagp,
bagelem_t *bagelemp,
size64_t key,
void *payloadp);
/* remove the item from the bag. the key and payload originally supplied
* to the insert operator are returned by reference.
*/
extern void bag_remove(bag_t *bagp,
bagelem_t *bagelemp,
size64_t *keyp,
void **payloadpp);
/* search by key for an element in the bag.
* returns the element pointer if a matching item is found, as well as
* the payload (by reference). if the item is not in the bag, returns
* a null pointer and (by reference) payload.
*/
extern bagelem_t *bag_find(bag_t *bagp,
size64_t key,
void **payloadpp);
/* private bag iterator
*/
struct bagiter {
bag_t *bi_bagp;
bagelem_t *bi_lastp;
bagelem_t *bi_nextp;
};
typedef struct bagiter bagiter_t;
/* initializes a bag iterator
*/
extern void bagiter_init(bag_t *bagp, bagiter_t *iterp);
/* returns the next element in the bag. caller may remove the element
* prior to the next call.
*/
extern bagelem_t * bagiter_next(bagiter_t *iterp, void **payloadpp);
/* destroys the bag.
*/
extern void bag_free(bag_t *bagp);
#endif /* BAG_H */