pimappservices/calendar/shared/inc/agmallocator.h
changeset 0 f979ecb2b13e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pimappservices/calendar/shared/inc/agmallocator.h	Tue Feb 02 10:12:19 2010 +0200
@@ -0,0 +1,176 @@
+// Copyright (c) 1997-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:
+//
+
+#ifndef __AGMALLOCATOR_H__
+#define __AGMALLOCATOR_H__
+
+#include "calentry.h"
+
+// -------------------------------------- Local classes ------------------------
+
+class CAgnMemPage;
+class CAgnSimpleEntry;
+
+// ----------------------------------- CAgnSimpleEntryAllocator ------------------
+
+NONSHARABLE_CLASS(CAgnSimpleEntryAllocator) : public CBase
+/**
+Class for controlling the allocation and deletion of simple entries.
+These are created in a paged area of memory to prevent too much RAM defragmentation when there
+are 1000s of entries in the indexes on the server. 
+CAgnSimpleEntrys are pre-allocated in blocks of KMemPageSize entries
+
+@internalComponent
+@released
+*/
+	{
+public:
+
+	IMPORT_C CAgnSimpleEntryAllocator();
+	IMPORT_C ~CAgnSimpleEntryAllocator();
+	IMPORT_C CAgnSimpleEntry* CreateSimpleEntryL(CCalEntry::TType aType, const CAgnSimpleEntry* aEntry = NULL);
+	IMPORT_C void Delete(CAgnSimpleEntry* aEntry);
+
+private:
+	friend class CAgnSimpleEntry;
+
+	void DeleteMemPage(CAgnMemPage* aPage);
+	CAgnSimpleEntry* NewSimpleEntryL(TUint aSize);	
+	
+private:	
+	CAgnMemPage*	iHeadPage;
+	TInt			iCount;
+	};
+
+
+NONSHARABLE_CLASS(CAgnMemPage) : public CBase
+/**
+@internalComponent
+@released
+*/
+	{
+public:
+
+	static CAgnMemPage* NewL(TUint aCellSize);
+	~CAgnMemPage();
+
+	TAny* Alloc();
+	void Free();
+	
+	inline TBool Contains(const TAny* aPtr) const;
+	inline TUint CellSize() const;
+	inline TBool IsFull() const;
+	inline TBool IsEmpty() const;
+	inline void SetNext(CAgnMemPage* aNext);
+	inline CAgnMemPage* Next() const;	
+
+
+private:
+
+	inline CAgnMemPage(TUint aCellSize);
+	void ConstructL();
+
+
+private:
+
+	CAgnMemPage*	iNext;
+	TInt8*			iEntries;
+	TInt8*			iNextAvail;
+	TInt			iCount;
+	TUint			iCellSize;
+	
+	};
+
+
+//
+// inline
+//
+
+
+const TInt KMemPageSize = 64;
+
+
+inline CAgnMemPage::CAgnMemPage(TUint aCellSize)
+	: iCellSize(aCellSize)
+/** Constructor
+
+@internalComponent
+*/
+	{
+	}
+
+
+inline TUint CAgnMemPage::CellSize() const
+/** Return size of each cell(element)
+
+@internalComponent
+*/
+	{
+	return ( iCellSize );
+	}
+
+
+inline TBool CAgnMemPage::IsFull() const
+/** Are there any memory cell not allocated?
+
+@internalComponent
+*/
+	{
+	return ( ( iNextAvail - iEntries ) / iCellSize == KMemPageSize );
+	}
+
+
+inline TBool CAgnMemPage::IsEmpty() const
+/** Are any entries allocated?
+
+@internalComponent
+*/
+	{
+	return ( iCount == 0 );
+	}
+
+
+inline void CAgnMemPage::SetNext(CAgnMemPage* aNext)
+/** Set pointer to the next page of memory cell
+
+@internalComponent
+*/
+	{	
+	iNext = aNext;
+	}
+
+
+inline CAgnMemPage* CAgnMemPage::Next() const
+/** Return pointer ot next page of memory cell
+
+@internalComponent
+*/
+	{
+	return ( iNext );
+	}
+
+
+inline TBool CAgnMemPage::Contains(const TAny* aPtr) const
+/** Is aPtr allocated from this page
+
+@internalComponent
+*/
+	{
+	return ( aPtr >= iEntries && aPtr <= iNextAvail );
+	}
+
+
+#endif
+