24 template<
typename RandomAccessIterator>
38 bool operator()(
const std::pair< RandomAccessIterator, size_t > & lhs,
39 const std::pair< RandomAccessIterator, size_t > & rhs)
41 return *lhs.first < *rhs.first;
58 bool operator()(
const std::pair< C_FLOAT64 *, size_t > & lhs,
59 const std::pair< C_FLOAT64 *, size_t > & rhs)
63 (isnan(*rhs.first) ? lhs.first < rhs.first :
false) :
64 (isnan(*rhs.first) ?
true : *lhs.first < *rhs.first);
76 template <
typename RandomAccessIterator>
78 RandomAccessIterator last,
97 template <
typename RandomAccessIterator,
typename LessThanCompare>
99 RandomAccessIterator last,
100 LessThanCompare compare,
103 assert(first < last);
107 ToBeSorted.
resize(last - first);
109 RandomAccessIterator it;
112 typename std::pair<RandomAccessIterator, size_t> * itToBeSorted;
114 for (it = first, i = 0, itToBeSorted = ToBeSorted.
array();
116 ++it, ++i, ++itToBeSorted)
118 itToBeSorted->first = it;
119 itToBeSorted->second = i;
122 itToBeSorted = ToBeSorted.
array();
124 std::sort(itToBeSorted,
125 itToBeSorted + (last - first),
129 pivot.
resize(last - first);
133 for (; itPivot != endPivot; ++itToBeSorted, ++itPivot)
134 *itPivot = itToBeSorted->second;
148 template <
typename RandomAccessIterator>
150 RandomAccessIterator middle,
151 RandomAccessIterator last,
171 template <
typename RandomAccessIterator,
typename LessThanCompare>
173 RandomAccessIterator middle,
174 RandomAccessIterator last,
175 LessThanCompare compare,
178 assert(first < middle && middle <= last);
182 ToBeSorted.
resize(last - first);
184 RandomAccessIterator it;
187 typename std::pair<RandomAccessIterator, size_t> * itToBeSorted;
189 for (it = first, i = 0, itToBeSorted = ToBeSorted.
array();
191 ++it, ++i, ++itToBeSorted)
193 itToBeSorted->first = it;
194 itToBeSorted->second = i;
197 itToBeSorted = ToBeSorted.
array();
199 std::partial_sort(itToBeSorted,
200 itToBeSorted + (middle - first),
201 itToBeSorted + (last - first),
205 pivot.
resize(last - first);
209 for (; itPivot != endPivot; ++itToBeSorted, ++itPivot)
210 *itPivot = itToBeSorted->second;
218 template <
typename IndexType,
typename ReturnType>
259 ReturnType(*
mpSwap)(IndexType, IndexType);
266 template <
typename ClassType,
typename IndexType,
typename ReturnType>
285 FSwapClass(ClassType * pType, ReturnType(ClassType::*swap)(IndexType, IndexType)):
317 ReturnType(ClassType::*
mpSwap)(IndexType, IndexType);
330 template <
typename SwapMethod>
337 size_t i, imax = pivot.
size();
341 for (i = 0; i < imax; i++)
374 template <
typename SwapMethod>
376 const size_t & ordered,
386 for (i = 0; i < ordered; i++)
394 if (to < ordered || from < ordered)
411 #endif // COPASI_CSort
void sortWithPivot(RandomAccessIterator first, RandomAccessIterator last, CVector< size_t > &pivot)
bool operator()(const std::pair< RandomAccessIterator, size_t > &lhs, const std::pair< RandomAccessIterator, size_t > &rhs)
bool operator()(const std::pair< C_FLOAT64 *, size_t > &lhs, const std::pair< C_FLOAT64 *, size_t > &rhs)
virtual void operator()(IndexType to, IndexType from)
FSwapClass(ClassType *pType, ReturnType(ClassType::*swap)(IndexType, IndexType))
void resize(size_t size, const bool ©=false)
bool applyPartialPivot(const CVector< size_t > &pivot, const size_t &ordered, SwapMethod swap)
ReturnType(* mpSwap)(IndexType, IndexType)
virtual void operator()(IndexType to, IndexType from)
ReturnType(ClassType::* mpSwap)(IndexType, IndexType)
void partialSortWithPivot(RandomAccessIterator first, RandomAccessIterator middle, RandomAccessIterator last, CVector< size_t > &pivot)
FSwapBase(ReturnType(*swap)(IndexType, IndexType))
bool applyPivot(const CVector< size_t > &pivot, SwapMethod swap)
virtual ~CompareDoubleWithNaN()
virtual ~CompareDefault()