Files
epics-base/modules/libcom/src/bucketLib/bucketLib.h
T
Andrew Johnson 3c99391d93 Added SPDX License ID to all EPICS-original source files
In some cases the license-identification header was missing,
so I added that as well. Replaced the remaining headers that
specifically identified "Versions 3.13.7 and higher".

Makefiles and the build system were deliberately excluded.
2020-08-03 11:53:01 -05:00

200 lines
6.4 KiB
C

/*************************************************************************\
* Copyright (c) 2002 The University of Chicago, as Operator of Argonne
* National Laboratory.
* Copyright (c) 2002 The Regents of the University of California, as
* Operator of Los Alamos National Laboratory.
* SPDX-License-Identifier: EPICS
* EPICS BASE is distributed subject to a Software License Agreement found
* in file LICENSE that is included with this distribution.
\*************************************************************************/
/**
* \file bucketLib.h
* \author Jeffrey O. Hill
* \brief A hash table. Do not use for new code.
*
* \details
* A hash table for which keys may be unsigned integers, pointers, or
* strings. This API is used by the IOC's Channel Access Server, but
* it should not be used by other code.
*
* \note Storage for identifiers must persist until an item is deleted
*/
#ifndef INCbucketLibh
#define INCbucketLibh
#ifdef __cplusplus
extern "C" {
#endif
#include "errMdef.h"
#include "epicsTypes.h"
#include "libComAPI.h"
/** \brief Internal: bucket identifier */
typedef unsigned BUCKETID;
/** \brief Internal: bucket key type */
typedef enum {bidtUnsigned, bidtPointer, bidtString} buckTypeOfId;
/** \brief Internal: bucket item structure */
typedef struct item{
struct item *pItem;
const void *pId;
const void *pApp;
buckTypeOfId type;
}ITEM;
/** \brief Internal: Hash table structure */
typedef struct bucket{
ITEM **pTable;
void *freeListPVT;
unsigned hashIdMask;
unsigned hashIdNBits;
unsigned nInUse;
}BUCKET;
/**
* \brief Creates a new hash table
* \param nHashTableEntries Table size
* \return Pointer to the newly created hash table, or NULL.
*/
LIBCOM_API BUCKET * epicsStdCall bucketCreate (unsigned nHashTableEntries);
/**
* \brief Release memory used by a hash table
* \param *prb Pointer to the hash table
* \return S_bucket_success
* \note All items must be deleted from the hash table before calling this.
*/
LIBCOM_API int epicsStdCall bucketFree (BUCKET *prb);
/**
* \brief Display information about a hash table
* \param *prb Pointer to the hash table
* \return S_bucket_success
*/
LIBCOM_API int epicsStdCall bucketShow (BUCKET *prb);
/**
* \brief Add an item identified by an unsigned int to the table
* \param *prb Pointer to the hash table
* \param *pId Pointer to the identifier
* \param *pApp Pointer to the payload
* \return Status value
*/
LIBCOM_API int epicsStdCall bucketAddItemUnsignedId (BUCKET *prb,
const unsigned *pId, const void *pApp);
/**
* \brief Add an item identified by a pointer to the table
* \param *prb Pointer to the hash table
* \param *pId Pointer to the identifier
* \param *pApp Pointer to the payload
* \return Status value
*/
LIBCOM_API int epicsStdCall bucketAddItemPointerId (BUCKET *prb,
void * const *pId, const void *pApp);
/**
* \brief Add an item identified by a string to the table
* \param *prb Pointer to the hash table
* \param *pId Pointer to the identifier
* \param *pApp Pointer to the payload
* \return Status value
*/
LIBCOM_API int epicsStdCall bucketAddItemStringId (BUCKET *prb,
const char *pId, const void *pApp);
/**
* \brief Remove an item identified by a string from the table
* \param *prb Pointer to the hash table
* \param *pId Pointer to the identifier
* \return Status value
*/
LIBCOM_API int epicsStdCall bucketRemoveItemUnsignedId (BUCKET *prb, const unsigned *pId);
/**
* \brief Remove an item identified by a pointer from the table
* \param *prb Pointer to the hash table
* \param *pId Pointer to the identifier
* \return Status value
*/
LIBCOM_API int epicsStdCall bucketRemoveItemPointerId (BUCKET *prb, void * const *pId);
/**
* \brief Remove an item identified by a string from the table
* \param *prb Pointer to the hash table
* \param *pId Pointer to the identifier
* \return Status value
*/
LIBCOM_API int epicsStdCall bucketRemoveItemStringId (BUCKET *prb, const char *pId);
/**
* \brief Find an item identified by an unsigned int in the table
* \param *prb Pointer to the hash table
* \param *pId Pointer to the identifier
* \return Item's payload pointer, or NULL if not found
*/
LIBCOM_API void * epicsStdCall bucketLookupItemUnsignedId (BUCKET *prb, const unsigned *pId);
/**
* \brief Find an item identified by a pointer in the table
* \param *prb Pointer to the hash table
* \param *pId Pointer to the identifier
* \return Item's payload pointer, or NULL if not found
*/
LIBCOM_API void * epicsStdCall bucketLookupItemPointerId (BUCKET *prb, void * const *pId);
/**
* \brief Find an item identified by a string in the table
* \param *prb Pointer to the hash table
* \param *pId Pointer to the identifier
* \return Item's payload pointer, or NULL if not found
*/
LIBCOM_API void * epicsStdCall bucketLookupItemStringId (BUCKET *prb, const char *pId);
/**
* \brief Find and delete an item identified by an unsigned int from the table
* \param *prb Pointer to the hash table
* \param *pId Pointer to the identifier
* \return Item's payload pointer, or NULL if not found
*/
LIBCOM_API void * epicsStdCall bucketLookupAndRemoveItemUnsignedId (BUCKET *prb, const unsigned *pId);
/**
* \brief Find and delete an item identified by a pointer from the table
* \param *prb Pointer to the hash table
* \param *pId Pointer to the identifier
* \return Item's payload pointer, or NULL if not found
*/
LIBCOM_API void * epicsStdCall bucketLookupAndRemoveItemPointerId (BUCKET *prb, void * const *pId);
/**
* \brief Find and delete an item identified by a string from the table
* \param *prb Pointer to the hash table
* \param *pId Pointer to the identifier
* \return Item's payload pointer, or NULL if not found
*/
LIBCOM_API void * epicsStdCall bucketLookupAndRemoveItemStringId (BUCKET *prb, const char *pId);
/**
* \name Status values returned by some bucketLib functions
* @{
*/
/**
* \brief A synonym for S_bucket_success
*/
#define BUCKET_SUCCESS S_bucket_success
/**
* \brief Success, must be 0.
*/
#define S_bucket_success 0
/**
* \brief Memory allocation failed
*/
#define S_bucket_noMemory (M_bucket | 1) /*Memory allocation failed*/
/**
* \brief Identifier already in use
*/
#define S_bucket_idInUse (M_bucket | 2) /*Identifier already in use*/
/**
* \brief Unknown identifier
*/
#define S_bucket_uknId (M_bucket | 3) /*Unknown identifier*/
/** @} */
#ifdef __cplusplus
}
#endif
#endif /*INCbucketLibh*/