From 093e6705aaf8b3b4afe321bd26cf7b33dd945840 Mon Sep 17 00:00:00 2001 From: laurence Date: Wed, 1 May 2013 17:32:40 +0100 Subject: [PATCH] ENH: Update SortableList to use ListOps. Add "greater" functor to UList. --- .../containers/Lists/ListOps/ListOps.H | 9 ++++ .../Lists/ListOps/ListOpsTemplates.C | 42 +++++++++++++++++-- .../Lists/SortableList/SortableList.C | 30 +++---------- .../Lists/SortableList/SortableList.H | 4 +- src/OpenFOAM/containers/Lists/UList/UList.H | 20 ++++++++- 5 files changed, 73 insertions(+), 32 deletions(-) diff --git a/src/OpenFOAM/containers/Lists/ListOps/ListOps.H b/src/OpenFOAM/containers/Lists/ListOps/ListOps.H index f878a6f969..c322c7856f 100644 --- a/src/OpenFOAM/containers/Lists/ListOps/ListOps.H +++ b/src/OpenFOAM/containers/Lists/ListOps/ListOps.H @@ -92,14 +92,23 @@ void inplaceMapKey(const labelUList& oldToNew, Container&); template void sortedOrder(const UList&, labelList& order); +template +void sortedOrder(const UList&, labelList& order, const Cmp& cmp); + //- Generate (sorted) indices corresponding to duplicate list values template void duplicateOrder(const UList&, labelList& order); +template +void duplicateOrder(const UList&, labelList& order, const Cmp& cmp); + //- Generate (sorted) indices corresponding to unique list values template void uniqueOrder(const UList&, labelList& order); +template +void uniqueOrder(const UList&, labelList& order, const Cmp& cmp); + //- Extract elements of List when select is a certain value. // eg, to extract all selected elements: // subset(selectedElems, true, lst); diff --git a/src/OpenFOAM/containers/Lists/ListOps/ListOpsTemplates.C b/src/OpenFOAM/containers/Lists/ListOps/ListOpsTemplates.C index ab6f9bf511..29ea650551 100644 --- a/src/OpenFOAM/containers/Lists/ListOps/ListOpsTemplates.C +++ b/src/OpenFOAM/containers/Lists/ListOps/ListOpsTemplates.C @@ -180,6 +180,18 @@ void Foam::sortedOrder const UList& lst, labelList& order ) +{ + sortedOrder(lst, order, typename UList::less(lst)); +} + + +template +void Foam::sortedOrder +( + const UList& lst, + labelList& order, + const Cmp& cmp +) { // list lengths must be identical if (order.size() != lst.size()) @@ -193,7 +205,7 @@ void Foam::sortedOrder { order[elemI] = elemI; } - Foam::stableSort(order, typename UList::less(lst)); + Foam::stableSort(order, cmp); } @@ -203,6 +215,18 @@ void Foam::duplicateOrder const UList& lst, labelList& order ) +{ + duplicateOrder(lst, order, typename UList::less(lst)); +} + + +template +void Foam::duplicateOrder +( + const UList& lst, + labelList& order, + const Cmp& cmp +) { if (lst.size() < 2) { @@ -210,7 +234,7 @@ void Foam::duplicateOrder return; } - sortedOrder(lst, order); + sortedOrder(lst, order, cmp); label n = 0; for (label i = 0; i < order.size() - 1; ++i) @@ -231,7 +255,19 @@ void Foam::uniqueOrder labelList& order ) { - sortedOrder(lst, order); + uniqueOrder(lst, order, typename UList::less(lst)); +} + + +template +void Foam::uniqueOrder +( + const UList& lst, + labelList& order, + const Cmp& cmp +) +{ + sortedOrder(lst, order, cmp); if (order.size() > 1) { diff --git a/src/OpenFOAM/containers/Lists/SortableList/SortableList.C b/src/OpenFOAM/containers/Lists/SortableList/SortableList.C index e7613ab1ab..d610a56a04 100644 --- a/src/OpenFOAM/containers/Lists/SortableList/SortableList.C +++ b/src/OpenFOAM/containers/Lists/SortableList/SortableList.C @@ -2,7 +2,7 @@ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | - \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation + \\ / A nd | Copyright (C) 2011-2013 OpenFOAM Foundation \\/ M anipulation | ------------------------------------------------------------------------------- License @@ -23,26 +23,7 @@ License \*---------------------------------------------------------------------------*/ -// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * // - -template -void Foam::SortableList::sortIndices(List