mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
added access to STL stable_sort algorithm
This commit is contained in:
@ -435,6 +435,20 @@ void sort(List<T>& a, const Cmp& cmp)
|
||||
}
|
||||
|
||||
|
||||
template<class T>
|
||||
void stableSort(List<T>& a)
|
||||
{
|
||||
std::stable_sort(a.begin(), a.end());
|
||||
}
|
||||
|
||||
|
||||
template<class T, class Cmp>
|
||||
void stableSort(List<T>& a, const Cmp& cmp)
|
||||
{
|
||||
std::stable_sort(a.begin(), a.end(), cmp);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Operators * * * * * * * * * * * * * //
|
||||
|
||||
// Assignment to UList operator. Takes linear time.
|
||||
|
||||
@ -28,7 +28,7 @@ Class
|
||||
Description
|
||||
A 1D array of objects of type \<T\>, where the size of the vector
|
||||
is known and used for subscript bounds checking, etc.
|
||||
|
||||
|
||||
Storage is allocated on free-store during construction.
|
||||
|
||||
SourceFiles
|
||||
@ -195,6 +195,12 @@ void sort(List<T>& a);
|
||||
template<class T, class Cmp>
|
||||
void sort(List<T>& a, const Cmp&);
|
||||
|
||||
template<class T>
|
||||
void stableSort(List<T>& a);
|
||||
|
||||
template<class T, class Cmp>
|
||||
void stableSort(List<T>& a, const Cmp&);
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
|
||||
@ -28,14 +28,11 @@ License
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
// Construct from List
|
||||
template <class Type>
|
||||
SortableList<Type>::SortableList(const List<Type>& values)
|
||||
Foam::SortableList<Type>::SortableList(const List<Type>& values)
|
||||
:
|
||||
List<Type>(values),
|
||||
indices_(values.size())
|
||||
@ -46,7 +43,7 @@ SortableList<Type>::SortableList(const List<Type>& values)
|
||||
|
||||
// Construct given size. Sort later on.
|
||||
template <class Type>
|
||||
SortableList<Type>::SortableList(const label size)
|
||||
Foam::SortableList<Type>::SortableList(const label size)
|
||||
:
|
||||
List<Type>(size),
|
||||
indices_(size)
|
||||
@ -55,7 +52,7 @@ SortableList<Type>::SortableList(const label size)
|
||||
|
||||
// Construct given size and initial value. Sort later on.
|
||||
template <class Type>
|
||||
SortableList<Type>::SortableList(const label size, const Type& val)
|
||||
Foam::SortableList<Type>::SortableList(const label size, const Type& val)
|
||||
:
|
||||
List<Type>(size, val),
|
||||
indices_(size)
|
||||
@ -64,7 +61,7 @@ SortableList<Type>::SortableList(const label size, const Type& val)
|
||||
|
||||
// Construct as copy.
|
||||
template <class Type>
|
||||
SortableList<Type>::SortableList(const SortableList<Type>& lst)
|
||||
Foam::SortableList<Type>::SortableList(const SortableList<Type>& lst)
|
||||
:
|
||||
List<Type>(lst),
|
||||
indices_(lst.indices())
|
||||
@ -74,7 +71,7 @@ SortableList<Type>::SortableList(const SortableList<Type>& lst)
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
template <class Type>
|
||||
void SortableList<Type>::setSize(const label newSize)
|
||||
void Foam::SortableList<Type>::setSize(const label newSize)
|
||||
{
|
||||
List<Type>::setSize(newSize);
|
||||
indices_.setSize(newSize);
|
||||
@ -82,7 +79,7 @@ void SortableList<Type>::setSize(const label newSize)
|
||||
|
||||
|
||||
template <class Type>
|
||||
void SortableList<Type>::sort()
|
||||
void Foam::SortableList<Type>::sort()
|
||||
{
|
||||
forAll(indices_, i)
|
||||
{
|
||||
@ -98,7 +95,29 @@ void SortableList<Type>::sort()
|
||||
tmpValues[i] = this->operator[](indices_[i]);
|
||||
}
|
||||
|
||||
List<Type>::operator=(tmpValues);
|
||||
List<Type>::transfer(tmpValues);
|
||||
}
|
||||
|
||||
|
||||
|
||||
template <class Type>
|
||||
void Foam::SortableList<Type>::stableSort()
|
||||
{
|
||||
forAll(indices_, i)
|
||||
{
|
||||
indices_[i] = i;
|
||||
}
|
||||
|
||||
Foam::stableSort(indices_, less(*this));
|
||||
|
||||
List<Type> tmpValues(this->size());
|
||||
|
||||
forAll(indices_, i)
|
||||
{
|
||||
tmpValues[i] = this->operator[](indices_[i]);
|
||||
}
|
||||
|
||||
List<Type>::transfer(tmpValues);
|
||||
}
|
||||
|
||||
|
||||
@ -114,6 +133,4 @@ void Foam::SortableList<Type>::operator=(const SortableList<Type>& rhs)
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
|
||||
@ -100,7 +100,7 @@ public:
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Return the list of sorted point indices. Updated every sort.
|
||||
//- Return the list of sorted indices. Updated every sort.
|
||||
const labelList& indices() const
|
||||
{
|
||||
return indices_;
|
||||
@ -112,6 +112,9 @@ public:
|
||||
//- Sort the list (if changed after construction time)
|
||||
void sort();
|
||||
|
||||
//- Sort the list (if changed after construction time)
|
||||
void stableSort();
|
||||
|
||||
|
||||
// Member Operators
|
||||
|
||||
|
||||
Reference in New Issue
Block a user