ListElement *List::erase( ListElement *position )
{
   ListElement *ret = position->next();
   if( position == m_head )
   {
      // could be 0 if m_head == m_tail
      m_head = ret;
      if ( ret != 0 )
      {
         ret->prev(0);
      }
      else
         m_tail = 0;
   }
   else if ( position == m_tail )
   {
      // here, ret is 0 for sure.
      m_tail = position->prev();
      m_tail->next(0);
   }
   else {
      // normal case
      position->prev()->next( ret );
      ret->prev( position->prev() );
   }

   if( m_deletor != 0 )
      m_deletor( (void *) position->data() );

   m_size--;
   memFree( position );
   return ret;
}
void List::pushBack( const void *data )
{
   ListElement *element = (ListElement *) memAlloc( sizeof( ListElement ) );
   element->data( data );

   if ( m_head == 0 )
   {
      m_head = m_tail = element;
      element->prev(0);
   }
   else {
      element->prev( m_tail );
      m_tail->next( element );
      m_tail = element;
   }

   m_size++;
   element->next( 0 );
}
void List::insertBefore( ListElement *position, const void *data )
{
   ListElement *element = (ListElement *) memAlloc( sizeof( ListElement ) );
   element->data( data );

   element->next( position );
   element->prev( position->prev() );
   if( position->prev() != 0 )
   {
      position->prev()->next( element );
   }

   position->prev( element );

   m_size++;
   if ( position == m_head )
      m_head = element;
}
void List::pushFront( uint32 data )
{
   ListElement *element = (ListElement *) memAlloc( sizeof( ListElement ) );
   element->iData( data );

   if ( m_head == 0 )
   {
      m_head = m_tail = element;
      element->next(0);
   }
   else {
      element->next( m_head );
      m_head->prev( element );
      m_head = element;
   }

   m_size++;
   element->prev( 0 );
}