15 template < prototype_range RANGE,
typename COMPARE_INTERFACE >
18 COMPARE_INTERFACE * pinterface,
19 ::std::strong_ordering(COMPARE_INTERFACE:: * fCompare)(
typename RANGE::ARG_ITEM a,
typename RANGE::ARG_ITEM b))
22 comparable_array < typename RANGE::const_iterator > stackLowerBound;
24 comparable_array < typename RANGE::const_iterator > stackUpperBound;
26 typename RANGE::const_iterator pLowerBound;
28 typename RANGE::const_iterator pUpperBound;
30 typename RANGE::const_iterator pLPos, pUPos, pMPos;
32 if (range.size() >= 2)
35 stackLowerBound.add(range.begin());
37 stackUpperBound.add(range.end() - 1);
42 pLowerBound = stackLowerBound.pop();
44 pUpperBound = stackUpperBound.pop();
65 if ((pinterface->*fCompare)(*pMPos, *pUPos) <= 0)
74 range.__swap(pMPos, pUPos);
101 if ((pinterface->*fCompare)(*pLPos, *pMPos) <= 0)
110 range.__swap(pLPos, pMPos);
129 if (pLowerBound < pMPos - 1)
132 stackLowerBound.push(pLowerBound);
134 stackUpperBound.push(pMPos - 1);
138 if (pMPos + 1 < pUpperBound)
141 stackLowerBound.push(pMPos + 1);
143 stackUpperBound.push(pUpperBound);
147 if (stackLowerBound.get_size() == 0)