// MyList
// © Dirk Holtwick, 1997

/// Includes
#include <clib/alib_protos.h>
#include <proto/exec.h>
#include <exec/memory.h>
#include "mylist.h"
///

/// Example
/*

   Simple list routines do works like this:

      struct Data {APTR succ; ... };
      struct MyList *mylist;

      if(mylist = MyCreateList(sizeof(struct Data),100))
      {
         item = MyAddItem(mylist);
         MyDisposeList(mylist);
      }

*/
///
/// MyCreateList
struct MyList *MyCreateList(register ULONG size, register ULONG pudsize)
{
   register struct MyList *mylist;

   if(mylist = AllocVec(sizeof(struct MyList), MEMF_CLEAR))
   {
      mylist->size    = size;
      mylist->pudsize = pudsize;

      if(mylist->pool    = LibCreatePool(MEMF_CLEAR, (size * pudsize), size))
      {
         return(mylist);
      }
      FreeVec(mylist);
   }
   return(0);
}
///
/// MyDisposeList
void MyDisposeList(register struct MyList *mylist)
{
   if(mylist)
   {
      if(mylist->pool) LibDeletePool(mylist->pool);
      FreeVec(mylist);
   }
}
///
/// MyAddItem
APTR MyAddItem(register struct MyList *mylist)
{
   register struct MyItem *item;

   if(mylist)
   {
      if(item = LibAllocPooled(mylist->pool, mylist->size))
      {
         if(mylist->first)
            mylist->last->next = item;
         else
            mylist->first = item;

         mylist->last = item;
         item->next = 0;

         return(item);
      }
   }
   return(0);
}
///
/// MyPushItem
APTR MyPushItem(register struct MyList *mylist)
{
   register struct MyItem *item;

   // Insert an item at the beginning of the list

   if(mylist)
   {
      if(item = LibAllocPooled(mylist->pool, mylist->size))
      {
         if(mylist->last)
            mylist->last = item;

         item->next = mylist->first;

         mylist->first = item;
         mylist->last->next = 0;

         return(item);
      }
   }
   return(0);
}
///
/// MyPullItem
APTR MyPullItem(register struct MyList *mylist)
{
   register struct MyItem *item;

   // Insert an item at the beginning of the list

   if(mylist)
   {
      if(item = LibAllocPooled(mylist->pool, mylist->size))
      {
         if(mylist->last)
            mylist->last = item;

         item->next = mylist->first;

         mylist->first = item;
         mylist->last->next = 0;

         return(item);
      }
   }
   return(0);
}
///

