Commit 52be85e2 authored by Mark Olesen's avatar Mark Olesen
Browse files

added access to STL stable_sort algorithm

parent 365b6311
......@@ -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
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment