mmplugins/lib3gp/impl/src/list.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 11 Jun 2010 15:13:33 +0300
changeset 24 2672ba96448e
parent 0 40261b775718
permissions -rw-r--r--
Revision: 201023 Kit: 2010123

// Copyright (c) 2006-2009 Nokia Corporation and/or its subsidiary(-ies).
// All rights reserved.
// This component and the accompanying materials are made available
// under the terms of "Eclipse Public License v1.0"
// which accompanies this distribution, and is available
// at the URL "http://www.eclipse.org/legal/epl-v10.html".
//
// Initial Contributors:
// Nokia Corporation - initial contribution.
//
// Contributors:
//
// Description:
//

#include "mp4list.h"
#include "mp4memwrap.h"



/*
 * Function:
 *
 *   list_s *listCreate()
 *
 * Description:
 *
 *   Create a list.
 *
 * Parameters:
 *
 *   None
 *
 * Return value:
 *
 *   Pointer to the allocated list.
 *
 */
list_s *listCreate()
{
  list_s *tmpList;

  if ((tmpList = (list_s *)mp4malloc(sizeof(list_s))) == NULL)
    return NULL;

  tmpList->elementsInList = 0;
  tmpList->bytesInList = 0;
  tmpList->cumulativeBytesInList = 0;
  tmpList->first = NULL;
  tmpList->last = NULL;

  return tmpList;
}


/*
 * Function:
 *
 *   void *listAppend(list_s *list,
 *                    void *data,
 *                    mp4_u32 dataSize)
 *
 * Description:
 *
 *   Append an element (void *) to the end of the list.
 *
 * Parameters:
 *
 *   list      Pointer to a list
 *   data      Pointer to add to the list
 *   dataSize  Size of data pointed to by data
 *
 * Return value:
 *
 *   NULL      Error
 *   Non-NULL  Success
 *
 */
void *listAppend(list_s *list, void *data, mp4_u32 dataSize)
{
  node_s *tmpNode;

  if ((tmpNode = (node_s *)mp4malloc(sizeof(node_s))) == NULL)
    return NULL;

  if (list->elementsInList == 0) /* List is empty */
    list->first = tmpNode;
  else
    list->last->next = tmpNode;

  list->last = tmpNode;
  list->elementsInList++;
  list->bytesInList += dataSize;
  list->cumulativeBytesInList += dataSize;

  tmpNode->next = NULL;
  tmpNode->data = data;
  tmpNode->dataSize = dataSize;

  return (void *)tmpNode;
}


/*
 * Function:
 *
 *   void listDeleteFirst(list_s *list)
 *
 * Description:
 *
 *   Delete the first element in the list.
 *
 * Parameters:
 *
 *   list   Pointer to a list
 *
 * Return value:
 *
 *   None
 *
 */
void listDeleteFirst(list_s *list)
{
  if (list->elementsInList == 1)
  {
	mp4free(list->first->data);
    mp4free(list->first);
    list->first = NULL;
    list->last = NULL;
    list->elementsInList = 0;
    list->bytesInList = 0;
  }

  if (list->elementsInList > 1)
  {
    node_s *tmpNode;

    tmpNode = list->first;
    list->bytesInList -= tmpNode->dataSize;
    list->first = tmpNode->next;
	mp4free(tmpNode->data);
    mp4free(tmpNode);
    list->elementsInList--;
  }
}


/*
 * Function:
 *
 *   void listDestroyList(list_s *list)
 *
 * Description:
 *
 *   Free list and all its elements from memory.
 *
 * Parameters:
 *
 *   list   Pointer to a list
 *
 * Return value:
 *
 *   None
 *
 */
void listDestroyList(list_s *list)
{
  while (list->elementsInList)
    listDeleteFirst(list);

  mp4free(list);
}


/*
 * Function:
 *
 *   mp4_u32 listElementsInList(list_s *list)
 *
 * Description:
 *
 *   Return the number of elements in the list.
 *
 * Parameters:
 *
 *   list   Pointer to a list
 *
 * Return value:
 *
 *   Number of elements in the list
 *
 */
mp4_u32 listElementsInList(list_s *list)
{
  return list->elementsInList;
}


/*
 * Function:
 *
 *   mp4_u32 listBytesInList(list_s *list)
 *
 * Description:
 *
 *   Return the number of bytes currently in list.
 *
 * Parameters:
 *
 *   list   Pointer to a list
 *
 * Return value:
 *
 *   Number of bytes in the list
 *
 */
mp4_u32 listBytesInList(list_s *list)
{
  return list->bytesInList;
}


/*
 * Function:
 *
 *   mp4_u32 listCumulativeBytesInList(list_s *list)
 *
 * Description:
 *
 *   Return the number of bytes that have been in the list since the list
 *   was created.
 *
 * Parameters:
 *
 *   list   Pointer to a list
 *
 * Return value:
 *
 *   Number of bytes in the list from the creation
 *
 */
mp4_u32 listCumulativeBytesInList(list_s *list)
{
  return list->cumulativeBytesInList;
}
// End of File