1 #include <opensrf/osrf_list.h>
3 #define OSRF_LIST_DEFAULT_SIZE 48 /* most opensrf lists are small... */
4 #define OSRF_LIST_INC_SIZE 256
5 //#define OSRF_LIST_MAX_SIZE 10240
7 osrfList* osrfNewList() {
8 return osrfNewListSize( OSRF_LIST_DEFAULT_SIZE );
11 osrfList* osrfNewListSize( unsigned int size ) {
13 OSRF_MALLOC(list, sizeof(osrfList));
15 list->freeItem = NULL;
16 if( size <= 0 ) size = 16;
18 OSRF_MALLOC( list->arrlist, list->arrsize * sizeof(void*) );
20 // Nullify all pointers in the array
23 for( i = 0; i < list->arrsize; ++i )
24 list->arrlist[ i ] = NULL;
30 int osrfListPush( osrfList* list, void* item ) {
31 if(!(list)) return -1;
32 osrfListSet( list, item, list->size );
36 int osrfListPushFirst( osrfList* list, void* item ) {
37 if(!(list && item)) return -1;
39 for( i = 0; i < list->size; i++ )
40 if(!list->arrlist[i]) break;
41 osrfListSet( list, item, i );
45 void* osrfListSet( osrfList* list, void* item, unsigned int position ) {
46 if(!list || position < 0) return NULL;
48 int newsize = list->arrsize;
50 while( position >= newsize )
51 newsize += OSRF_LIST_INC_SIZE;
53 if( newsize > list->arrsize ) { /* expand the list if necessary */
55 OSRF_MALLOC(newarr, newsize * sizeof(void*));
57 // Copy the old pointers, and nullify the new ones
60 for( i = 0; i < list->arrsize; i++ )
61 newarr[i] = list->arrlist[i];
62 for( ; i < newsize; i++ )
65 list->arrlist = newarr;
66 list->arrsize = newsize;
69 void* olditem = osrfListRemove( list, position );
70 list->arrlist[position] = item;
71 if( list->size <= position ) list->size = position + 1;
76 void* osrfListGetIndex( const osrfList* list, unsigned int position ) {
77 if(!list || position >= list->size || position < 0) return NULL;
78 return list->arrlist[position];
81 void osrfListFree( osrfList* list ) {
84 if( list->freeItem ) {
86 for( i = 0; i < list->size; i++ ) {
87 if( (val = list->arrlist[i]) )
96 void* osrfListRemove( osrfList* list, unsigned int position ) {
97 if(!list || position >= list->size || position < 0) return NULL;
99 void* olditem = list->arrlist[position];
100 list->arrlist[position] = NULL;
101 if( list->freeItem ) {
102 list->freeItem(olditem);
106 if( position == list->size - 1 ) list->size--;
111 int osrfListFind( const osrfList* list, void* addr ) {
112 if(!(list && addr)) return -1;
114 for( index = 0; index < list->size; index++ ) {
115 if( list->arrlist[index] == addr )
122 unsigned int osrfListGetCount( const osrfList* list ) {
128 void* osrfListPop( osrfList* list ) {
129 if(!list) return NULL;
130 return osrfListRemove( list, list->size - 1 );
134 osrfListIterator* osrfNewListIterator( const osrfList* list ) {
135 if(!list) return NULL;
136 osrfListIterator* itr;
137 OSRF_MALLOC(itr, sizeof(osrfListIterator));
143 void* osrfListIteratorNext( osrfListIterator* itr ) {
144 if(!(itr && itr->list)) return NULL;
145 if(itr->current >= itr->list->size) return NULL;
146 return itr->list->arrlist[itr->current++];
149 void osrfListIteratorFree( osrfListIterator* itr ) {
155 void osrfListIteratorReset( osrfListIterator* itr ) {
161 void osrfListVanillaFree( void* item ) {
165 void osrfListSetDefaultFree( osrfList* list ) {
167 list->freeItem = osrfListVanillaFree;