textrendering/textformatting/undo/UniqueInstance.cpp
changeset 0 1fb32624e06b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/textrendering/textformatting/undo/UniqueInstance.cpp	Tue Feb 02 02:02:46 2010 +0200
@@ -0,0 +1,196 @@
+/*
+* Copyright (c) 2000-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 "UniqueInstanceImpl.h"
+#include "AssertFileAndLine.h"
+
+using namespace UniqueInstance;
+
+#ifdef _DEBUG
+#define USE_INTEGRITY_CHECK 1
+#else
+#define USE_INTEGRITY_CHECK 0
+#endif
+
+// CUniqueInstanceRepositoryBase : user version in front of compiler firewall
+void CUniqueInstanceRepositoryBase::ConstructL(TCompareFn* aCompare,
+	TDeleteFn* aDelete, TCopyFnL* aCopyL,
+	TInt aMaxLinks, TInt aObjectSize)
+	{
+	CRepositoryImpl* p = new(ELeave) CRepositoryImpl(aCompare,
+		aDelete, aCopyL, aObjectSize);
+	CleanupStack::PushL(p);
+	p->ConstructL(aMaxLinks);
+	CleanupStack::Pop(p);
+	delete iImpl;
+	iImpl = p;
+	}
+
+CUniqueInstanceRepositoryBase::~CUniqueInstanceRepositoryBase()
+	{
+	delete iImpl;
+	}
+
+void CUniqueInstanceRepositoryBase::Test() const
+	{
+	iImpl->Test();
+	}
+
+// RInstanceImpl : manager for a unique instance
+RInstanceImpl::RInstanceImpl(CUniqueInstanceRepositoryBase& aRepository)
+	: iRepository(aRepository.iImpl)
+	{
+	iPtr = iRepository->NullElement();
+	}
+
+RInstanceImpl::~RInstanceImpl()
+	{
+	ASSERT(iRepository->IsNull(iPtr));
+	}
+
+void RInstanceImpl::TakeL(void* a)
+	{
+	ASSERT(a);
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+#endif
+	UniqueInstance::SElement* r = iRepository->InsertOrIncL(a);
+	iRepository->DeleteOrDec(iPtr);
+	iPtr = r;
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+#endif
+	}
+
+void RInstanceImpl::TakeCopyL(void* a)
+	{
+	ASSERT(a);
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+#endif
+	UniqueInstance::SElement* r = iRepository->IncOrCopyL(a);
+	iRepository->DeleteOrDec(iPtr);
+	iPtr = r;
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+#endif
+	}
+
+void* RInstanceImpl::Peek() const
+	{
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+#endif
+	return iPtr->iObject;
+	}
+
+void* RInstanceImpl::DropL()
+	{
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+#endif
+	void* object = iRepository->DetatchOrCopyL(iPtr);
+	iPtr = iRepository->NullElement();
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+#endif
+	return object;
+	}
+
+void RInstanceImpl::Close()
+	{
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+#endif
+	iRepository->DeleteOrDec(iPtr);
+	iPtr = iRepository->NullElement();
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+#endif
+	}
+
+void RInstanceImpl::CopyTo(RInstanceImpl& aOther) const
+	{
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+	CRepositoryImpl* otherRep = aOther.iRepository;
+	otherRep->Test();
+#endif
+	++(iPtr->iRefCount);
+	SElement* e = iPtr;
+	aOther.Close();
+	aOther.iRepository = iRepository;
+	aOther.iPtr = e;
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+	otherRep->Test();
+#endif
+	}
+
+void RInstanceImpl::MoveTo(RInstanceImpl& aOther)
+	{
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+	CRepositoryImpl* otherRep = aOther.iRepository;
+	otherRep->Test();
+#endif
+	if (&aOther != this)
+		{
+		aOther.Close();
+		aOther.iRepository = iRepository;
+		aOther.iPtr = iPtr;
+		iPtr = iRepository->NullElement();
+		}
+#if USE_INTEGRITY_CHECK
+	iRepository->Test();
+	otherRep->Test();
+#endif
+	}
+
+// standard copy and delete functions
+void* CUniqueInstanceRepositoryBase::DumbCopyL(void* aBuf, TInt aSize)
+	{
+	void* newBuf = User::AllocL(aSize);
+	Mem::Copy(newBuf, aBuf, aSize);
+	return newBuf;
+	}
+
+void CUniqueInstanceRepositoryBase::DumbDelete(void* aBuf)
+	{
+	User::Free(aBuf);
+	}
+
+// CUniqueInstanceRepository<TDes>
+void* CUniqueInstanceRepository<TDes>::DesCopyL(void* a, TInt)
+	{
+	TDesC* des = reinterpret_cast<TDesC*>(a);
+	return des->AllocL();
+	}
+
+TInt CUniqueInstanceRepository<TDes>::DesCompare(void* aL, void* aR)
+	{
+	TDesC* lh = reinterpret_cast<TDesC*>(aL);
+	TDesC* rh = reinterpret_cast<TDesC*>(aR);
+	return lh->Compare(*rh);
+	}
+
+void CUniqueInstanceRepository<TDes>::DesDelete(void* a)
+	{
+	operator delete(a);
+	}
+