From ef14a415a97a58c8c7dfe3d13da56cad6ae6ecdb Mon Sep 17 00:00:00 2001 From: Andrew Heather <> Date: Wed, 9 Mar 2022 11:32:00 +0000 Subject: [PATCH] ENH: ListOps - added uniqueSort function --- .../containers/Lists/ListOps/ListOps.H | 4 +++ .../Lists/ListOps/ListOpsTemplates.C | 27 +++++++++++++++++++ 2 files changed, 31 insertions(+) diff --git a/src/OpenFOAM/containers/Lists/ListOps/ListOps.H b/src/OpenFOAM/containers/Lists/ListOps/ListOps.H index 1ac082a857..78efbc82ec 100644 --- a/src/OpenFOAM/containers/Lists/ListOps/ListOps.H +++ b/src/OpenFOAM/containers/Lists/ListOps/ListOps.H @@ -217,6 +217,10 @@ void uniqueOrder ); +//- Return sorted list with removal of duplicates +template +List uniqueSort(const UList& input); + //- Inplace sorting and removal of duplicates. // Do not use FixedList for the input list, since it doesn't resize. template diff --git a/src/OpenFOAM/containers/Lists/ListOps/ListOpsTemplates.C b/src/OpenFOAM/containers/Lists/ListOps/ListOpsTemplates.C index 0b4885f957..bcdeb8ea18 100644 --- a/src/OpenFOAM/containers/Lists/ListOps/ListOpsTemplates.C +++ b/src/OpenFOAM/containers/Lists/ListOps/ListOpsTemplates.C @@ -424,6 +424,33 @@ void Foam::uniqueOrder } +template +Foam::List Foam::uniqueSort(const UList& input) +{ + List output(input); + + const label len = output.size(); + + if (len > 1) + { + Foam::stableSort(output); + + label count = 0; + for (label i = 1; i < len; ++i) + { + if (output[count] != output[i]) + { + output[++count] = output[i]; + } + } + + output.resize(count+1); + } + + return output; +} + + template void Foam::inplaceUniqueSort(ListType& input) {