00001
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #ifndef _MDB_MIDL_H_
00028 #define _MDB_MIDL_H_
00029
00030 #include <stddef.h>
00031
00032 #ifdef __cplusplus
00033 extern "C" {
00034 #endif
00035
00046 typedef size_t MDB_ID;
00047
00054 typedef MDB_ID *MDB_IDL;
00055
00056
00057
00058
00059 #define MDB_IDL_LOGN 16
00060 #define MDB_IDL_DB_SIZE (1<<MDB_IDL_LOGN)
00061 #define MDB_IDL_UM_SIZE (1<<(MDB_IDL_LOGN+1))
00062
00063 #define MDB_IDL_DB_MAX (MDB_IDL_DB_SIZE-1)
00064 #define MDB_IDL_UM_MAX (MDB_IDL_UM_SIZE-1)
00065
00066 #define MDB_IDL_SIZEOF(ids) (((ids)[0]+1) * sizeof(MDB_ID))
00067 #define MDB_IDL_IS_ZERO(ids) ( (ids)[0] == 0 )
00068 #define MDB_IDL_CPY( dst, src ) (memcpy( dst, src, MDB_IDL_SIZEOF( src ) ))
00069 #define MDB_IDL_FIRST( ids ) ( (ids)[1] )
00070 #define MDB_IDL_LAST( ids ) ( (ids)[(ids)[0]] )
00071
00073 #define MDB_IDL_ALLOCLEN( ids ) ( (ids)[-1] )
00074
00076 #define mdb_midl_xappend(idl, id) do { \
00077 MDB_ID *xidl = (idl), xlen = ++(xidl[0]); \
00078 xidl[xlen] = (id); \
00079 } while (0)
00080
00086 unsigned mdb_midl_search( MDB_IDL ids, MDB_ID id );
00087
00092 MDB_IDL mdb_midl_alloc(int num);
00093
00097 void mdb_midl_free(MDB_IDL ids);
00098
00103 void mdb_midl_shrink(MDB_IDL *idp);
00104
00110 int mdb_midl_need(MDB_IDL *idp, unsigned num);
00111
00117 int mdb_midl_append( MDB_IDL *idp, MDB_ID id );
00118
00124 int mdb_midl_append_list( MDB_IDL *idp, MDB_IDL app );
00125
00132 int mdb_midl_append_range( MDB_IDL *idp, MDB_ID id, unsigned n );
00133
00138 void mdb_midl_xmerge( MDB_IDL idl, MDB_IDL merge );
00139
00143 void mdb_midl_sort( MDB_IDL ids );
00144
00147 typedef struct MDB_ID2 {
00148 MDB_ID mid;
00149 void *mptr;
00150 } MDB_ID2;
00151
00157 typedef MDB_ID2 *MDB_ID2L;
00158
00164 unsigned mdb_mid2l_search( MDB_ID2L ids, MDB_ID id );
00165
00166
00172 int mdb_mid2l_insert( MDB_ID2L ids, MDB_ID2 *id );
00173
00179 int mdb_mid2l_append( MDB_ID2L ids, MDB_ID2 *id );
00180
00183 #ifdef __cplusplus
00184 }
00185 #endif
00186 #endif