#include <Eina.h>
#include "eina_blist.h"

//#define LIST 1
//#define ARRAY 1
#define BLIST 1

#ifdef ARRAY
static Eina_Bool
_remove_ok(void *d, void *a)
{
   if (d == a) return EINA_FALSE;
   return EINA_TRUE;
}
#endif

#define P(x) ((void *)(long)(x))

int main(int argc, char const **argv)
{
   eina_init();
#ifdef LIST
   Eina_List *list[300];
#endif
#ifdef ARRAY
   Eina_Array *array[300];
#endif
#ifdef BLIST
   Eina_Blist *blist[300];
#endif

   for (int i = 0; i < 10000; i++)
     {
        for (int j = 0; j < 300; j++)
          {
#ifdef ARRAY
             array[j] = eina_array_new(16);
#endif
#ifdef LIST
             list[j] = NULL;
#endif
#ifdef BLIST
             blist[j] = NULL;
#endif
             for (int k = 0; k < 30; k++)
               {
#ifdef ARRAY
                  eina_array_push(array[j], P(k + 1));
#endif
#ifdef LIST
                  list[j] = eina_list_append(list[j], P(k + 1));
#endif
#ifdef BLIST
                  eina_blist_append(&blist[j], P(k + 1));
#endif
               }
          }
        for (int j = 0; j < 300; j++)
          {
             for (int k = 0; k < 30; k++)
               {
#ifdef ARRAY
                  eina_array_remove(array[j], _remove_ok, P((29 - k) + 1));
#endif
#ifdef LIST
                  list[j] = eina_list_remove(list[j], P((29 - k) + 1));
#endif
#ifdef BLIST
                  eina_blist_remove(&blist[j], P((29 - k) + 1));
#endif
               }
#ifdef ARRAY
             eina_array_free(array[j]);
             array[j] = NULL;
#endif
#ifdef LIST
#endif
#ifdef BLIST
             eina_blist_free(&(blist[j]));
#endif
          }
     }

   eina_shutdown();
   return 0;
}
