diff -r 4ea6f81c838a -r 0e9bb658ef58 widgetmodel/alfwidgetmodel/src/alfsort.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/widgetmodel/alfwidgetmodel/src/alfsort.cpp Wed Sep 01 12:23:18 2010 +0100 @@ -0,0 +1,179 @@ +/* +* Copyright (c) 2006 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: sorting routine. uses Symbian services: User::QuickSort +* +*/ + + +//INCLUDES +#include +#include +#include +#include +//#include "alf/alfperf.h" +#include "alfsort.h" + +using namespace Alf; + +/** +* Defines the characteristics of a key used +* to access the elements of an array. Used for sort. +* @since S60 ?S60_version +*/ +NONSHARABLE_CLASS(AlfSortKey) : public TKey + { +public: + + /** + * constructor + * + * @since S60 ?S60_version + * @param aSortFunction callback interface for sort. + * @param aArr array to sort. + * @param aCount. count of items in the array. + */ + AlfSortKey( const IAlfSortFunction& aSortFunction, + IAlfVariantType** aArr, uint aCount ); + + /** + * returns data from array + * + * @since S60 ?S60_version + * @param anIndex index to element to return + * @return element at index anIndex. + */ + TAny *At(TInt anIndex) const; + + /** + * compares two items. + * + * @since S60 ?S60_version + * @param aLeft index to the array for left parameter. + * @return the value returned from sort function: + * < 0, if aFirst is less than aSecond, + * > 0 if aFirst is more than aSecond, + * 0, if aFirst equals aSecond. + */ + TInt Compare(TInt aLeft, TInt aRight) const; +private: + + //sort function not owned. + const IAlfSortFunction& iSortFunction; + + //array to sort. not owned + IAlfVariantType** iArr; + + //count of items in array. + uint iCount; + }; + +/** +* Defines the basic behaviour for swapping two elements of an array. +* Used for sort +* @since S60 ?S60_version +*/ +NONSHARABLE_CLASS(AlfSortSwap) : public TSwap + { +public: + + /** + * constructor + * + * @since S60 ?S60_version + * @param aArr array, which elements are to be swapped. + * @param aCount. count of items in the array. + */ + AlfSortSwap( IAlfVariantType** aArr, uint aCount ); + + /** + * swaps two items in the array. + * + * @since S60 ?S60_version + * @param aLeft left index + * @param aRight right index. + */ + void Swap(TInt aLeft, TInt aRight) const; +private: + + //array, which elements are to be swapped. Not owned. + IAlfVariantType** iArr; + + //count of items in the array. + uint iCount; + }; + +// --------------------------------------------------------------------------- +// Description : constructor +// --------------------------------------------------------------------------- +// +AlfSortKey::AlfSortKey( const IAlfSortFunction& aSortFunction, + IAlfVariantType** aArr, uint aCount ) : + iSortFunction(aSortFunction), iArr(aArr), iCount(aCount) + { + } + +// --------------------------------------------------------------------------- +// Description : return element from index anIndex. +// --------------------------------------------------------------------------- +// +TAny *AlfSortKey::At(TInt anIndex) const + { + return iArr[anIndex]; + } + +// --------------------------------------------------------------------------- +// Description : compares two items. +// --------------------------------------------------------------------------- +// +TInt AlfSortKey::Compare(TInt aLeft, TInt aRight) const + { + const IAlfMap* leftMap = iArr[aLeft]->map(); + const IAlfMap* rightMap = iArr[aRight]->map(); + return iSortFunction.compareLeafs( leftMap, rightMap ); + } + +// --------------------------------------------------------------------------- +// Description : constructor +// --------------------------------------------------------------------------- +// +AlfSortSwap::AlfSortSwap( IAlfVariantType** aArr, uint aCount ) : + iArr(aArr), iCount(aCount) + { + } + +// --------------------------------------------------------------------------- +// Description : swaps two items +// --------------------------------------------------------------------------- +// +void AlfSortSwap::Swap(TInt aLeft, TInt aRight) const + { + IAlfVariantType* tmp = iArr[aLeft]; + iArr[aLeft] = iArr[aRight]; + iArr[aRight] = tmp; + } + +// --------------------------------------------------------------------------- +// Description : The sorting routine. +// --------------------------------------------------------------------------- +// +void AlfSort::sort(IAlfVariantType** aArr, uint aCount, + const IAlfSortFunction& aSortFunction ) + { + //ALF_PERF_START( perfdata, "AlfSort-Sort-Sorting") + AlfSortKey key(aSortFunction, aArr, aCount); + AlfSortSwap swap(aArr, aCount); + User::QuickSort( aCount, key, swap ); + //ALF_PERF_STOP( perfdata, "AlfSort-Sort-Sorting") + } +