diff -r 000000000000 -r 1fb32624e06b textrendering/textformatting/undo/UniqueInstanceImpl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/textrendering/textformatting/undo/UniqueInstanceImpl.h Tue Feb 02 02:02:46 2010 +0200 @@ -0,0 +1,156 @@ +/* +* 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: +* +*/ + + +#ifndef UNIQUEINSTANCEIMPL_H_ +#define UNIQUEINSTANCEIMPL_H_ + +#include "UniqueInstance.h" + +namespace UniqueInstance +{ + +/** +@internalComponent +*/ +void DestroyRUniqueInstance(void* runique); +/** + * Reference-counted object. + * + * @internalComponent + * @since App-frameworks6.1 + */ +struct SElement + { + TInt iRefCount; + void* iObject; + }; + +/** + * Skip list holding sorted, reference counted objects + * + * @internalComponent + * @since App-frameworks6.1 + */ +class RSkipList + { +public: + struct TSection + { + TSection* iLinks[1]; + SElement iElement; + }; + + RSkipList& operator=(const RSkipList&); + RSkipList(const RSkipList&); + + void TestLinks(TSection* aStart, TSection* aEnd, TInt aLink) const; + + RSkipList() : iSentinel(0), iCompare(0) {} + ~RSkipList(); + void Open(TCompareFn* aCompare, TInt aMaxLinks); + void Close(); + + /** + * Adds an element only if it already exists, otherwise returns 0 + */ + SElement* AddExisting(void* aElt); + /** + * Adds a new element. aNewElt must not already have an equivalent in this + * skip list. + */ + SElement* AddNewL(void* aNewElt); + /** + * Removes the element, no matter what its reference count is. Return a pointer + * to the object, which is now no longer owned. + */ + void* Remove(void* aNoLongerNeeded); + /** + * Returns true iff skip list has no elements. + */ + TBool IsEmpty() const; + /** + * Runs tests on the integrity of the skip list. + * Returns the number of elements in the list. + */ + TInt Test() const; + +private: + TSection* iSentinel; + TInt iLinkCount; + TCompareFn* iCompare; + + TSection** FirstLink() const; + + TInt GenerateNumLinks() const; + }; +} + +/** + * Implements the unique instance repository behaviour + * + * @internalComponent + * @since App-frameworks6.1 + */ +NONSHARABLE_CLASS(UniqueInstance::CRepositoryImpl) : public CBase + { +public: + CRepositoryImpl(TCompareFn* aCompare, TDeleteFn* aDelete, TCopyFnL* aCopyL, + TInt aObjectSize); + ~CRepositoryImpl(); + void ConstructL(TInt aMaxLinks); + + /** + * Adds aElt to the list, passing ownership. + */ + SElement* InsertOrIncL(void* aElt); + /** + * Adds aElt to the list with the caller retaining ownership. + */ + SElement* IncOrCopyL(void* aElt); + /** + * Deletes from the list. aNoLongerNeeded points to an element of the list. + */ + void DeleteOrDec(UniqueInstance::SElement* aNoLongerNeeded); + /** + * Removes from the list, passing ownership back to the caller. + */ + void* DetatchOrCopyL(UniqueInstance::SElement* aWritableCopyNeeded); + /** + * Returns a prototype null element. Ownership is retained. + */ + SElement* NullElement(); + /** + * Compares the element pointer passed against the prototype null element. + */ + TBool IsNull(SElement* a) const; + /** + * Runs an integrity check. Panics on failure. + */ + void Test() const; + +private: + TCompareFn* iCompare; + TDeleteFn* iDelete; + TCopyFnL* iCopyL; + TInt iObjectSize; + + SElement iNullElement; + RSkipList iSkipList; + }; + +#endif // UNIQUEINSTANCEIMPL_H_