persistentstorage/store/USTOR/UT_MAP.CPP
changeset 0 08ec8eefde2f
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/persistentstorage/store/USTOR/UT_MAP.CPP	Fri Jan 22 11:06:30 2010 +0200
@@ -0,0 +1,249 @@
+// Copyright (c) 1998-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 "UT_STD.H"
+
+//#pragma message( __FILE__ " : Find helper function may be less code." )
+
+const TInt KStoreMapGranularity=4;
+
+EXPORT_C CStoreMap* CStoreMap::NewL(CStreamStore& aStore)
+/** Allocates and constructs a store map associated with the specified store and 
+returns a pointer to that store map.
+
+The function leaves if it cannot complete successfully.
+
+@param aStore A reference to the store associated with this store map.
+@return A pointer to the new store map object. */
+	{
+	return new(ELeave) CStoreMap(aStore);
+	}
+
+EXPORT_C CStoreMap* CStoreMap::NewLC(CStreamStore& aStore)
+/** Allocates and constructs a store map associated with the specified store, returns 
+a pointer to that store map and puts the pointer onto the cleanup stack.
+
+The function leaves if it cannot complete successfully.
+
+Placing a pointer to this object onto the cleanup stack allows the object 
+and allocated resources to be cleaned up if a subsequent leave occurs.
+
+@param aStore A reference to the store associated with this store map.
+@return A pointer to the new store map object. */
+	{
+	CStoreMap* map=NewL(aStore);
+	CleanupStack::PushL(map);
+	return map;
+	}
+
+EXPORT_C CStoreMap::CStoreMap(CStreamStore& aStore)
+	: iArray(KStoreMapGranularity),iFree(KNullStreamId),iStore(&aStore)
+	{}
+
+EXPORT_C CStoreMap::~CStoreMap()
+/** Frees resources owned by the object, prior to its destruction.
+
+In particular, the destructor deletes all streams whose stream ids are currently 
+held within the store map and then empties the store map. */
+	{
+	ResetAndDestroy();
+	}
+
+EXPORT_C void CStoreMap::BindL(TSwizzleC<TAny> aSwizzle,TStreamId anId)
+/** Creates an entry in the store map to contain the specified stream id and an 
+associated swizzle. On return from this function, the stream id is said to 
+be bound to the swizzle.
+
+If the store map already contains an entry with the same swizzle, then the 
+new entry replaces the existing entry; in effect, knowledge of the original 
+stream id associated with aSwizzle, is lost.
+
+Callers of this function can pass any type of swizzle as the first parameter, 
+i.e. any swizzle derived from TSwizzleCBase. The required TSwizzleC<TAny> 
+object is constructed from the swizzle passed by the caller.
+
+Note that in most applications, callers pass a general swizzle, i.e. an object 
+of type TSwizzle<class T>, where T is the type of object represented by that 
+swizzle.
+
+@param aSwizzle Any swizzle derived from TSwizzleCBase.
+@param anId The stream id to be bound to the swizzle. */
+	{
+	__ASSERT_DEBUG(aSwizzle!=NULL||anId==KNullStreamId,Panic(EStoreMapSwizzleMissing));
+	if (aSwizzle==NULL)
+		return;
+//
+	__ASSERT_DEBUG(anId!=KNullStreamId,Panic(EStoreMapIdMissing));
+	__DEBUG(TSwizzleC<TAny> label=Label(anId));
+	__ASSERT_DEBUG(label==NULL||label==aSwizzle,Panic(EStoreMapIntroducingAlias));
+	TEntry entry;
+	entry.swizzle=aSwizzle;
+	TKeyArrayFix key(_FOFF(TEntry,swizzle),ECmpTUint32);
+	TInt i;
+	if (iArray.FindIsq(entry,key,i)==0)
+		{
+		iArray[i].id=anId;
+		return;
+		}
+//
+	__ASSERT_DEBUG(iFree==KNullStreamId,Panic(EStoreMapFreeIdPresent));
+	iFree=entry.id=anId;
+	iArray.InsertL(i,entry);
+	iFree=KNullStreamId;
+	}
+
+EXPORT_C void CStoreMap::Unbind(TSwizzleC<TAny> aSwizzle)
+/** Deletes the first entry from the store map corresponding to the specified swizzle.
+
+On return from this function, the swizzle is said to be unbound and knowledge 
+of the associated stream id is lost.
+
+Callers of this function can pass any type of swizzle as the parameter, i.e. 
+any swizzle derived from TSwizzleCBase. The required TSwizzleC<TAny> object 
+is constructed from the swizzle passed by the caller.
+
+Notes:
+
+In most applications, callers pass a general swizzle, i.e. an object of type 
+TSwizzle<class T>, where T is the type of object represented by that swizzle.
+
+If no matching entry can be found in the store map, then the store map remains 
+unaltered.
+
+@param aSwizzle Any swizzle derived from TSwizzleCBase. */
+	{
+	TEntry entry;
+	entry.swizzle=aSwizzle;
+	TKeyArrayFix key(_FOFF(TEntry,swizzle),ECmpTUint32);
+	TInt i;
+	if (iArray.FindIsq(entry,key,i)==0)
+		iArray.Delete(i);
+	}
+
+EXPORT_C void CStoreMap::Forget(TStreamId anId)
+/** Deletes an entry from the store map. The entry selected is the first one whose 
+stream id matches the specified stream id.
+
+On return from this function, the stream id is said to be forgotten and knowledge 
+of that stream id is lost.
+
+@param anId The stream id used to identify the entry in the store map to be 
+deleted. */
+	{
+	if (anId==iFree)
+		{
+		iFree=KNullStreamId;
+		return;
+		}
+//
+	TEntry entry;
+	entry.id=anId;
+	TKeyArrayFix key(_FOFF(TEntry,id),ECmpTUint32);
+	TInt i;
+	if (iArray.Find(entry,key,i)==0)
+		iArray.Delete(i);
+	}
+
+EXPORT_C void CStoreMap::Reset()
+/** Deletes all entries from the store map.
+
+It is important that this function is called before deleting the store map, 
+as the destructor attempts to delete all streams whose stream ids are held 
+within the map. */
+	{
+	iFree=KNullStreamId;
+	iArray.Reset();
+	}
+
+EXPORT_C void CStoreMap::ResetAndDestroy()
+/** Deletes all streams whose ids are held within the store map, and then empties 
+the store map. */
+	{
+	iStore->Delete(iFree);
+	for (TIterator iter=Begin(),end=End();iter!=end;++iter)
+		{
+		const TEntry& entry=*iter;
+		iStore->Delete(entry.id);
+		}
+	Reset();
+	}
+
+EXPORT_C TStreamId CStoreMap::At(TSwizzleC<TAny> aSwizzle) const
+/** Returns the stream id of the first entry the store map matching the specified 
+swizzle.
+
+Callers of this function can pass any type of swizzle as the first parameter, 
+i.e. any swizzle derived from TSwizzleCBase. The required TSwizzleC<TAny> 
+object is constructed from the swizzle passed by the caller.
+
+@param aSwizzle Any type of swizzle derived from TSwizzleCBase.
+@return The required streamid.KNullStreamId, if no matching entry can be found. */
+	{
+	TEntry entry;
+	entry.swizzle=aSwizzle;
+	TKeyArrayFix key(_FOFF(TEntry,swizzle),ECmpTUint32);
+	TInt i;
+	if (iArray.FindIsq(entry,key,i)!=0)
+		return KNullStreamId;
+//
+	return iArray[i].id;
+	}
+
+EXPORT_C TSwizzleC<TAny> CStoreMap::Label(TStreamId anId) const
+/** Returns the swizzle in the store map assocated with the specified stream id.
+
+@param anId The id of the stream
+@return The associated swizzle. If there is no matching swizzle, then this 
+is an uninitialized swizzle. */
+	{
+	TEntry entry;
+	entry.id=anId;
+	TKeyArrayFix key(_FOFF(TEntry,id),ECmpTUint32);
+	TInt i;
+	if (iArray.Find(entry,key,i)!=0)
+		return NULL;
+//
+	return iArray[i].swizzle;
+	}
+
+EXPORT_C CStoreMap::TIterator CStoreMap::Begin() const
+//
+// Return the starting iterator for map iteration.
+//
+	{
+	return (iArray.Count()==0)?NULL:&iArray[0];
+	}
+
+EXPORT_C CStoreMap::TIterator CStoreMap::End() const
+//
+// Return the end iterator for map iteration.
+//
+	{
+	return Begin()+iArray.Count();
+	}
+
+void CStoreMap::ExternalizeL(const TStreamRef& aRef,RWriteStream& aStream) const
+//
+// Write the stream id bound to aRef to aStream.
+//
+	{
+	TSwizzleC<TAny> swizzle=aRef;
+	TStreamId id=At(swizzle);
+	if (id==KNullStreamId&&swizzle!=NULL)
+		__LEAVE(KErrNotFound);
+//
+	aStream<<id;
+	}
+