You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdebase/ksysguard/CContLib/ccont.h

162 lines
4.1 KiB

/*
Lightweight C Container Library
Copyright (c) 2002 Tobias Koenig <tokoe@kde.org>
Original code was written by Chris Schlaeger <cs@kde.org>
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public License
along with this library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
#ifndef _CCONT_H
#define _CCONT_H
#ifndef NIL
#define NIL ((void*) 0)
#endif
#define destr_ctnr(x, y) zero_destr_ctnr(x, y); x=0
struct container {
struct container* next;
struct container* prev;
void* data;
};
typedef struct container T_CONTAINER;
typedef struct container* CONTAINER;
typedef long INDEX;
typedef void (*DESTR_FUNC)(void*);
typedef int (*COMPARE_FUNC)(void*, void*);
/**
* Initialize the container @p ctnr.
*/
CONTAINER new_ctnr(void);
/**
* Remove all entries from @p ctnr and reset its
* internal structure. Use @ref new_ctnr() @em before @em
* access the container next time.
*
* Note: use the 'destr_ctnr' macro to get zeroed pointer
* automatically.
*
* @param destr_func The function that is called to
* free the single entries.
*/
void zero_destr_ctnr(CONTAINER ctnr, DESTR_FUNC destr_func);
/**
* @return the number of entries in @p ctnr.
*/
INDEX level_ctnr(CONTAINER ctnr);
/**
* Insert a new entry in container.
*
* @param object A pointer to the object.
* @param pos The position where the object should be insert.
*/
void insert_ctnr(CONTAINER ctnr, void* object, INDEX pos);
/**
* Add a new entry at the end of container.
*
* @param object The object that should be added.
*/
void push_ctnr(CONTAINER ctnr, void* object);
/**
* Remove an entry from container.
*
* @param pos The position of the object that should be removed.
*
* @return A pointer to the removed object or @p 0L if it doesn't exist.
*/
void* remove_at_ctnr(CONTAINER ctnr, INDEX pos);
/**
* Remove the first entry of container.
*
* @return A pointer to the removed object or @p 0L if there is now entry.
*/
void* pop_ctnr(CONTAINER ctnr);
/**
* @return A pointer to the object at position @a pos
* or @p 0L if it doesn't exist.
*/
void* get_ctnr(CONTAINER ctnr, INDEX pos);
/**
* @return The position of a matching entry.
*
* @param compare_func A Pointer to the function that is
* called to compare all entries in the
* container with the given pattern.
* @param pattern The pattern for coparison.
*/
INDEX search_ctnr(CONTAINER ctnr, COMPARE_FUNC compare_func, void* pattern);
/**
* Swap two objects in container.
*
* @param pos1 Position of the first object.
* @param pos2 Position of the second object.
*/
void swop_ctnr(CONTAINER ctnr, INDEX pos1, INDEX pos2);
/**
* Sort all entries of container.
*
* @param compare_func A Pointer to the function that is
* called to compare to entries of the
* container.
*/
void bsort_ctnr(CONTAINER ctnr, COMPARE_FUNC compare_func);
/**
* Use this function to iterate over the container.
*
* for (ptr = first_ctnr(ctnr); ptr; ptr = next_ctnr(ctnr)) {
* do_anything(ptr);
* }
*
* @return A Pointer to the first object in container.
*/
void* first_ctnr(CONTAINER ctnr);
/**
* Use this function to iterate over the container.
*
* @return A Pointer to the next object in container.
*/
void* next_ctnr(CONTAINER ctnr);
/**
* Use this function to remove the current entry while
* iterating over the container.
*
* @return A Pointer to the removed object or @p 0L if it doesn't exist.
*/
void* remove_ctnr(CONTAINER ctnr);
#endif