/*
 * Copyright (c) 2001, 2002, 2003, 2004, 2005  Netli, Inc.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $Id: ncnf_coll.h,v 1.1 2005/05/26 12:08:19 vlm Exp $
 */
/*
 * Collection structure.
 */
#ifndef	__NCNF_COLL_H__
#define	__NCNF_COLL_H__

/* [Martin 12/16/04]: ncnf_int.h also includes us...
 *                    forward declaration whenever possible 
 *                    to avoid this and also less pressure on make dependency
 *                    check.
 */
/* #include "ncnf_int.h" */
struct ncnf_obj_s;

typedef struct collection_entry_s {
	struct ncnf_obj_s *object;
	int ignore_in_search;
} collection_entry;

typedef struct collection_s {
	collection_entry *entry;
	unsigned int entries;	/* Number of meaningful entries */
	unsigned int size;	/* Number of allocated entries */
} collection_t;

/*
 * How to insert or merge values?
 */
enum merge_flags {
	MERGE_NOFLAGS	= 0,
	MERGE_DUPCHECK	= 1,	/* Check for duplicates */
	MERGE_PTRCHECK	= 2,	/* Check for pointer duplicates */
	MERGE_EMPTYSRC	= 4,	/* Empty source bin (_coll_join()) */
};

/*
 * Insert new object into collection.
 */
int _ncnf_coll_insert(void *ignore, collection_t *, struct ncnf_obj_s *obj, enum merge_flags);

/*
 * Add contents of the second collection into the first one,
 * optionally assigning parent.
 * Returns -1 if any error.
 */
int _ncnf_coll_join(void *ignore, collection_t *to, collection_t *from, struct ncnf_obj_s *opt_parent, enum merge_flags);

/*
 * Search in given collection for object specified by type or value or both.
 */

enum cget_flags {
  CG_IGNORE_REFERENCES	= (1 << 0),	/* Skip references */
  CG_MARK_UNSEARCHABLE	= (1 << 1),	/* Mark found as unsearchable */
  CG_RETURN_POSITION	= (1 << 2),	/* Return stop position */
  CG_RETURN_CHAIN	= (1 << 3),	/* Chain the results */
  CG_TYPE_NOCASE	= (1 << 4),	/* Case insensitive type comparison */
  CG_NAME_NOCASE	= (1 << 5),	/* Case insensitive name comparison */
};

/*
 * Iterator may be an struct ncnf_obj_s *iterator
 */
struct ncnf_obj_s *_ncnf_coll_get(collection_t *coll,
	enum cget_flags,
	const char *opt_type, const char *opt_name,
	void *opt_iterator);


/* Adjust _storage size_ */
int _ncnf_coll_adjust_size(void *ignore, collection_t *coll, int new_count);

/* Remove marked elements */
void _ncnf_coll_remove_marked(collection_t *coll, int match_mark);

/*
 * Empty the collection.
 */
void _ncnf_coll_clear(void *ignore, collection_t *coll, int destroy);

/*
 * return the number of entry (coll->count)
 */
int ncnf_coll_get_nentry(collection_t *coll);

/*
 * return the ncnf_obj_s at index (coll->entry[index].object)
 */
struct ncnf_obj_s* ncnf_coll_get_obj_at(collection_t *coll, int idx);

#endif	/* __NCNF_COLL_H__ */


syntax highlighted by Code2HTML, v. 0.9.1