diff -r 000000000000 -r 1fb32624e06b textrendering/textformatting/undo/UniqueInstance.cpp --- /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 +void* CUniqueInstanceRepository::DesCopyL(void* a, TInt) + { + TDesC* des = reinterpret_cast(a); + return des->AllocL(); + } + +TInt CUniqueInstanceRepository::DesCompare(void* aL, void* aR) + { + TDesC* lh = reinterpret_cast(aL); + TDesC* rh = reinterpret_cast(aR); + return lh->Compare(*rh); + } + +void CUniqueInstanceRepository::DesDelete(void* a) + { + operator delete(a); + } +