widgetmodel/alfwidgetmodel/src/alfsort.cpp
branchRCL_3
changeset 26 0e9bb658ef58
--- /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")
+    }
+