/**
 * @file
 * Fast list methods.
 * Feb 2000  --Jcid
 *
 */

#ifndef __LIST_H__
#define __LIST_H__

/**
 * Make sure there's space for 'num_items' items within the list.
 * (First, allocate an 'alloc_step' sized chunk, after that, double the
 *  list size --to make it faster)
 */
#define a_List_resize(list,num_items,alloc_step) \
   if (!list) { \
      list = dMalloc(alloc_step * sizeof(*list)); \
   } \
   if (num_items >= alloc_step){ \
      while ( num_items >= alloc_step ) \
         alloc_step <<= 1; \
      list = dRealloc(list, alloc_step * sizeof(*list)); \
   }


/**
 * Make sure there's space for one more item within the list.
 */
#define a_List_add(list,num_items,alloc_step) \
   a_List_resize(list,num_items,alloc_step)


/**
 * Quickly remove an item from the list
 * ==> We preserve relative position, but not the element index <==
 */
#define a_List_remove(list, item, num_items) \
   if (list && item < num_items) { \
      list[item] = list[--num_items]; \
   }


#endif /* __LIST_H__ */
