--- /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 <e32std.h>
+#include <alf/ialfmap.h>
+#include <alf/alfvarianttype.h>
+#include <alf/ialfsortfunction.h>
+//#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")
+ }
+