/*****************************************************************************/
// Copyright 2006-2007 Adobe Systems Incorporated
// All Rights Reserved.
//
// NOTICE:  Adobe permits you to use, modify, and distribute this file in
// accordance with the terms of the Adobe license agreement accompanying it.
/*****************************************************************************/

/* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_string_list.cpp#1 $ */ 
/* $DateTime: 2012/05/30 13:28:51 $ */
/* $Change: 832332 $ */
/* $Author: tknoll $ */

/*****************************************************************************/

#include "dng_string_list.h"

#include "dng_bottlenecks.h"
#include "dng_exceptions.h"
#include "dng_string.h"
#include "dng_utils.h"

/*****************************************************************************/

dng_string_list::dng_string_list ()

	:	fCount     (0)
	,	fAllocated (0)
	,	fList      (NULL)
	
	{
	
	}

/*****************************************************************************/

dng_string_list::~dng_string_list ()
	{
	
	Clear ();
	
	}

/*****************************************************************************/

void dng_string_list::Allocate (uint32 minSize)
	{
	
	if (fAllocated < minSize)
		{
		
		uint32 newSize = Max_uint32 (minSize, fAllocated * 2);
		
		dng_string **list = (dng_string **)
							malloc (newSize * sizeof (dng_string *));
		
		if (!list)
			{
			
			ThrowMemoryFull ();
			
			}
		
		if (fCount)
			{
			
			DoCopyBytes (fList, list, fCount * (uint32) sizeof (dng_string *));
			
			}
			
		if (fList)
			{
			
			free (fList);
			
			}
			
		fList = list;
		
		fAllocated = newSize;
		
		}
	
	}
					 
/*****************************************************************************/

void dng_string_list::Insert (uint32 index, 
							  const dng_string &s)
	{
	
	Allocate (fCount + 1);
	
	dng_string *ss = new dng_string (s);
	
	if (!ss)
		{
		
		ThrowMemoryFull ();
		
		}
		
	fCount++;
	
	for (uint32 j = fCount - 1; j > index; j--)
		{
		
		fList [j] = fList [j - 1];
		
		}
		
	fList [index] = ss;
	
	}
					 
/*****************************************************************************/

bool dng_string_list::Contains (const dng_string &s) const
	{
	
	for (uint32 j = 0; j < fCount; j++)
		{
		
		if ((*this) [j] == s)
			{
			
			return true;
			
			}
			
		}
		
	return false;
	
	}
					 
/*****************************************************************************/

void dng_string_list::Clear ()
	{
	
	if (fList)
		{
		
		for (uint32 index = 0; index < fCount; index++)
			{
			
			delete fList [index];
			
			}
			
		free (fList);
		
		fList = NULL;
		
		}
		
	fCount     = 0;
	fAllocated = 0;
	
	}

/*****************************************************************************/
