Files
2026-07-30 11:19:44 +05:30

275 lines
9.3 KiB
C

/*
******************************************************************************
* INTERPEAK API HEADER FILE
*
* Document no: @(#) $Name: VXWORKS_ITER40_2019102207 $ $RCSfile: ipcom_set.h,v $ $Revision: 1.7 $
* $Source: /home/interpeak/CVSRoot/ipcom/include/ipcom_set.h,v $
* $Author: kenneth $ $Date: 2006-05-08 14:15:43 $
* $State: Exp $ $Locker: $
*
* INTERPEAK_COPYRIGHT_STRING
* Design and implementation by Kenneth Jonsson <kenneth@interpeak.se>
******************************************************************************
*/
#ifndef IPCOM_SET_H
#define IPCOM_SET_H
/*
****************************************************************************
* 1 DESCRIPTION
****************************************************************************
* Minimalistic unorder set implementation.
*/
/*
****************************************************************************
* 2 CONFIGURATION
****************************************************************************
*/
#include "ipcom_config.h"
/*
****************************************************************************
* 3 INCLUDE FILES
****************************************************************************
*/
#include <ipcom_type.h>
#include <ipcom_cstyle.h>
#ifdef __cplusplus
extern "C" {
#endif
/*
****************************************************************************
* 4 DEFINES
****************************************************************************
*/
/* Helper constants for the "set->user" variable, the set implementation
does not used the variable for anything */
#define IPCOM_SET_IS_INCLUDE 1
#define IPCOM_SET_IS_EXCLUDE 2
/*
****************************************************************************
* 5 TYPES
****************************************************************************
*/
/*
*===========================================================================
* Ipcom_set_foreach_cb_func
*===========================================================================
* Description: Callback function that is called for each element in the set
* when using ipcom_set_for_each().
* Parameters: obj - A object in the set.
* data - User defined data passed to ipcom_set_for_each().
* Returns:
*
*/
typedef void (*Ipcom_set_foreach_cb_func)(void *obj, void *data);
typedef struct Ipcom_set_struct
{
Ip_size_t obj_maxcount; /* The current maximum number of elements */
Ip_size_t obj_count; /* Number of elements in the set */
Ip_size_t obj_len; /* Size of each element */
char *objs; /* Buffer where all elements are stored */
int user; /* Use defined data associated with this set */
}
Ipcom_set;
/*
****************************************************************************
* 6 FUNCTIONS
****************************************************************************
*/
/*
*===========================================================================
* ipcom_set_new
*===========================================================================
* Description: Create a new empty set.
* Parameters: obj_len - The length of each element.
* key to an element.
* Returns: A newly created set.
*
*/
IP_PUBLIC Ipcom_set *
ipcom_set_new(Ip_size_t obj_len);
/*
*===========================================================================
* ipcom_set_delete
*===========================================================================
* Description: Frees the resources allocated by the set.
* Parameters: set - The set to delete.
* Returns:
*
*/
IP_PUBLIC void
ipcom_set_delete(Ipcom_set *set);
/*
*===========================================================================
* ipcom_set_clone
*===========================================================================
* Description: Returns a set with the same members as the passed set.
* Parameters: set - The set to clone.
* Returns: The cloned set or IP_NULL if out of memory.
*
*/
IP_PUBLIC Ipcom_set *
ipcom_set_clone(Ipcom_set *set);
/*
*===========================================================================
* ipcom_set_add
*===========================================================================
* Description: Adds an object to the set, a deep copy is made of obj.
* Parameters: set - A set pointer.
* obj - The object to add.
* Returns: IPCOM_SUCCESS if the object was added
* IPCOM_ERR_ALREADY_INSTALLED if a matching (or same) object
* already exists
* IPCOM_ERR_NO_MEMORY if the object could not be added due to
* insufficient memory
*
*/
IP_PUBLIC Ip_err
ipcom_set_add(Ipcom_set *set, void *obj);
/*
*===========================================================================
* ipcom_set_remove
*===========================================================================
* Description: Removes an object from the set.
* Parameters: set - A set pointer.
* obj - The object to delete.
* Returns: IPCOM_SUCCESS if the object was removed.
* IPCOM_ERR_NOT_FOUND the object was not found in the set.
*
*/
IP_PUBLIC Ip_err
ipcom_set_remove(Ipcom_set *set, void *obj);
/*
*===========================================================================
* ipcom_set_remove_all
*===========================================================================
* Description: Removes all object from the set.
* Parameters: set - A set pointer.
* Returns:
*
*/
IP_PUBLIC void
ipcom_set_remove_all(Ipcom_set *set);
/*
*===========================================================================
* ipcom_set_contains
*===========================================================================
* Description: Returns if a specific object is already in the set.
* Parameters: set - A set pointer.
* obj - The object to check if it is part of the set.
* Returns: IP_TRUE if the object is part of the set.
* IP_FALSE otherwise
*
*/
IP_PUBLIC Ip_bool
ipcom_set_contains(Ipcom_set *set, IP_CONST void *obj);
/*
*===========================================================================
* ipcom_set_equal
*===========================================================================
* Description: Returns if 'a' contains the same members as 'b'
* Parameters: a - A set pointer, must not be IP_NULL.
* b - Another set pointer, may be IP_NULL which is treated like
* an empty set.
* Returns: IP_TRUE if they contains the same members.
* IP_FALSE otherwise
*
*/
IP_PUBLIC Ip_bool
ipcom_set_equal(Ipcom_set *a, Ipcom_set *b);
/*
*===========================================================================
* ipcom_set_subtract
*===========================================================================
* Description: Removes all members of set 'b' from set 'a' and stores
* the result in 'a'
* Parameters: a - a set.
* b - a set of members to remove from 'a'
* Returns:
*
*/
IP_PUBLIC void
ipcom_set_subtract(Ipcom_set *a, Ipcom_set *b);
/*
*===========================================================================
* ipcom_set_union
*===========================================================================
* Description: Returns the union of two sets and stores the result in 'a'.
* Parameters: a - A set.
* b - Another set.
* Returns: IPCOM_SUCCESS if the object was added
* IPCOM_ERR_NO_MEMORY if an object could not be added due to
* insufficient memory
*
*/
IP_PUBLIC Ip_err
ipcom_set_union(Ipcom_set *a, Ipcom_set *b);
/*
*===========================================================================
* ipcom_set_intersection
*===========================================================================
* Description: Returns the intersection of two sets, 'a' will contain
* all members that was part of both 'a' and 'b'.
* Parameters: a - A set.
* b - Another set.
* Returns: The intersection of the two sets.
*
*/
IP_PUBLIC void
ipcom_set_intersection(Ipcom_set *a, Ipcom_set *b);
/*
*===========================================================================
* ipcom_set_for_each
*===========================================================================
* Description: Calls the suppled function for each object in the set.
* Parameters: set - The set to travers.
* cb_func - Function to call for each element, with 'obj'
* set to the current object and 'data' is the values passed
* as 3:rd argument to this function.
* data - User defined data.
* Returns:
*
*/
IP_PUBLIC void
ipcom_set_for_each(Ipcom_set *set,
Ipcom_set_foreach_cb_func cb_func,
void *data);
#ifdef __cplusplus
}
#endif
#endif
/*
****************************************************************************
* END OF FILE
****************************************************************************
*/