// 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 "CacheBase.h"

/**
Constructor
Initialized the iCachedItems array with granularity 8 and an offset to iHandle in TCacheEntry,
which will be used to find specific entries later.
*/
CCacheBase::CCacheBase() : iCachedItems(8, _FOFF(TCacheEntry, iHandle))
	{
	
	}
	
CCacheBase::~CCacheBase()
	{
	for(TInt i = 0; i < iCachedItems.Count(); i++)
		{
		delete iCachedItems[i].iCachedItem;
		iCachedItems[i].iCachedItem = NULL;
		}
		
	iCachedItems.Reset();	
	}

/**
Begins an update of the cache.
*/
void CCacheBase::BeginUpdate()
	{
	// Sets all cached items to not used
	for(TInt i = 0; i < iCachedItems.Count(); i++)
		{
		iCachedItems[i].iIsUsed = EFalse;
		}		
	}

/**
End an update of the cache.
*/
void CCacheBase::EndUpdate()
	{
	// Removes all cached items that are not used
	for(TInt i = 0; i < iCachedItems.Count(); i++)
		{
		if(!iCachedItems[i].iIsUsed)
			{
			delete iCachedItems[i].iCachedItem;
			iCachedItems.Remove(i--);
			}			
		}
	}
	
/**
Returns an item from the cache corresponding to a specific handle.

@param aHandle A handle to match against an item in the cache.
@return The item that matches the handle provided as a parameter.
*/
const CBase* CCacheBase::Resolve(TInt aHandle)
	{
	TCacheEntry entry(aHandle);
	TInt index = iCachedItems.FindInUnsignedKeyOrder(entry);
	
	if(index != KErrNotFound)
		return iCachedItems[index].iCachedItem;		
	else
		return NULL;
	}


