X-Git-Url: https://git.sur5r.net/?a=blobdiff_plain;f=libraries%2Flibmdb%2Fmidl.h;h=beafb097c0b2355f197e8cb0707475d4da512043;hb=c7fe1f466e8bfcac0c9169c741710c76807a11ba;hp=aeb0af6203199b0cdf5f1f131b6060c89b2219d1;hpb=985f765dc53621f8db910737f677261de4562433;p=openldap diff --git a/libraries/libmdb/midl.h b/libraries/libmdb/midl.h index aeb0af6203..beafb097c0 100644 --- a/libraries/libmdb/midl.h +++ b/libraries/libmdb/midl.h @@ -1,8 +1,17 @@ -/* idl.h - ldap bdb back-end ID list header file */ +/** @file midl.h + * @brief ldap bdb back-end ID List header file. + * + * This file was originally part of back-bdb but has been + * modified for use in libmdb. Most of the macros defined + * in this file are unused, just left over from the original. + * + * This file is only used internally in libmdb and its definitions + * are not exposed publicly. + */ /* $OpenLDAP$ */ /* This work is part of OpenLDAP Software . * - * Copyright 2000-2011 The OpenLDAP Foundation. + * Copyright 2000-2012 The OpenLDAP Foundation. * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -17,10 +26,29 @@ #ifndef _MDB_MIDL_H_ #define _MDB_MIDL_H_ -#define AC_MEMCPY(dst,src,size) memcpy(dst,src,size) +#include + +/** @defgroup internal MDB Internals + * @{ + */ + +/** @defgroup idls ID List Management + * @{ + */ + /** A generic ID number. These were entryIDs in back-bdb. + * Preferably it should have the same size as a pointer. + */ +typedef size_t ID; + + /** An IDL is an ID List, a sorted array of IDs. The first + * element of the array is a counter for how many actual + * IDs are in the list. In the original back-bdb code, IDLs are + * sorted in ascending order. For libmdb IDLs are sorted in + * descending order. + */ +typedef ID *IDL; -#define ID unsigned long -#define NOID ((ID)~0) +#define NOID (~(ID)0) /* IDL sizes - likely should be even bigger * limiting factors: sizeof(ID), thread stack size @@ -61,18 +89,93 @@ #define MDB_IDL_IS_ALL( range, ids ) ( (ids)[0] == NOID \ && (ids)[1] <= (range)[1] && (range)[2] <= (ids)[2] ) -#define MDB_IDL_CPY( dst, src ) (AC_MEMCPY( dst, src, MDB_IDL_SIZEOF( src ) )) +#define MDB_IDL_CPY( dst, src ) (memcpy( dst, src, MDB_IDL_SIZEOF( src ) )) #define MDB_IDL_ID( bdb, ids, id ) MDB_IDL_RANGE( ids, id, ((bdb)->bi_lastid) ) #define MDB_IDL_ALL( bdb, ids ) MDB_IDL_RANGE( ids, 1, ((bdb)->bi_lastid) ) -#define MDB_IDL_FIRST( ids ) ( ids[1] ) +#define MDB_IDL_FIRST( ids ) ( (ids)[1] ) #define MDB_IDL_LAST( ids ) ( MDB_IDL_IS_RANGE(ids) \ - ? ids[2] : ids[ids[0]] ) + ? (ids)[2] : (ids)[(ids)[0]] ) #define MDB_IDL_N( ids ) ( MDB_IDL_IS_RANGE(ids) \ - ? (ids[2]-ids[1])+1 : ids[0] ) - -int mdb_midl_insert( ID *ids, ID id ); - + ? ((ids)[2]-(ids)[1])+1 : (ids)[0] ) + +#if 0 /* superseded by append/sort */ + /** Insert an ID into an IDL. + * @param[in,out] ids The IDL to insert into. + * @param[in] id The ID to insert. + * @return 0 on success, -1 if the ID was already present in the IDL. + */ +int mdb_midl_insert( IDL ids, ID id ); +#endif + + /** Allocate an IDL. + * Allocates memory for an IDL of a default size. + * @return IDL on success, NULL on failure. + */ +IDL mdb_midl_alloc(); + + /** Free an IDL. + * @param[in] ids The IDL to free. + */ +void mdb_midl_free(IDL ids); + + /** Shrink an IDL. + * Return the IDL to the default size if it has grown larger. + * @param[in,out] idp Address of the IDL to shrink. + * @return 0 on no change, non-zero if shrunk. + */ +int mdb_midl_shrink(IDL *idp); + + /** Append an ID onto an IDL. + * @param[in,out] idp Address of the IDL to append to. + * @param[in] id The ID to append. + * @return 0 on success, -1 if the IDL is too large. + */ +int mdb_midl_append( IDL *idp, ID id ); + + /** Append an IDL onto an IDL. + * @param[in,out] idp Address of the IDL to append to. + * @param[in] app The IDL to append. + * @return 0 on success, -1 if the IDL is too large. + */ +int mdb_midl_append_list( IDL *idp, IDL app ); + + /** Sort an IDL. + * @param[in,out] ids The IDL to sort. + */ +void mdb_midl_sort( IDL ids ); + + /** An ID2 is an ID/pointer pair. + */ +typedef struct ID2 { + ID mid; /**< The ID */ + void *mptr; /**< The pointer */ +} ID2; + + /** An ID2L is an ID2 List, a sorted array of ID2s. + * The first element's \b mid member is a count of how many actual + * elements are in the array. The \b mptr member of the first element is unused. + * The array is sorted in ascending order by \b mid. + */ +typedef ID2 *ID2L; + + /** Search for an ID in an ID2L. + * @param[in] ids The ID2L to search. + * @param[in] id The ID to search for. + * @return The index of the first ID2 whose \b mid member is greater than or equal to \b id. + */ +unsigned mdb_mid2l_search( ID2L ids, ID id ); + + + /** Insert an ID2 into a ID2L. + * @param[in,out] ids The ID2L to insert into. + * @param[in] id The ID2 to insert. + * @return 0 on success, -1 if the ID was already present in the ID2L. + */ +int mdb_mid2l_insert( ID2L ids, ID2 *id ); + +/** @} */ +/** @} */ #endif /* _MDB_MIDL_H_ */