cmAlgorithms: Cache the end iterators in algorithms.
This commit is contained in:
parent
a5b10ae68a
commit
47c2da6aa8
|
@ -236,6 +236,7 @@ template<typename Range, typename InputRange>
|
||||||
typename Range::const_iterator cmRemoveIndices(Range& r, InputRange const& rem)
|
typename Range::const_iterator cmRemoveIndices(Range& r, InputRange const& rem)
|
||||||
{
|
{
|
||||||
typename InputRange::const_iterator remIt = rem.begin();
|
typename InputRange::const_iterator remIt = rem.begin();
|
||||||
|
typename InputRange::const_iterator remEnd = rem.end();
|
||||||
|
|
||||||
typename Range::iterator writer = r.begin();
|
typename Range::iterator writer = r.begin();
|
||||||
std::advance(writer, *remIt);
|
std::advance(writer, *remIt);
|
||||||
|
@ -243,13 +244,14 @@ typename Range::const_iterator cmRemoveIndices(Range& r, InputRange const& rem)
|
||||||
typename InputRange::value_type prevRem = *remIt;
|
typename InputRange::value_type prevRem = *remIt;
|
||||||
++remIt;
|
++remIt;
|
||||||
size_t count = 1;
|
size_t count = 1;
|
||||||
for ( ; writer != r.end() && remIt != rem.end(); ++count, ++remIt)
|
const typename Range::iterator rangeEnd = r.end();
|
||||||
|
for ( ; writer != rangeEnd && remIt != remEnd; ++count, ++remIt)
|
||||||
{
|
{
|
||||||
std::advance(pivot, *remIt - prevRem);
|
std::advance(pivot, *remIt - prevRem);
|
||||||
prevRem = *remIt;
|
prevRem = *remIt;
|
||||||
writer = ContainerAlgorithms::RemoveN(writer, pivot, count);
|
writer = ContainerAlgorithms::RemoveN(writer, pivot, count);
|
||||||
}
|
}
|
||||||
return ContainerAlgorithms::RemoveN(writer, r.end(), count);
|
return ContainerAlgorithms::RemoveN(writer, rangeEnd, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename Range, typename MatchRange>
|
template<typename Range, typename MatchRange>
|
||||||
|
@ -267,8 +269,9 @@ typename Range::const_iterator cmRemoveDuplicates(Range& r)
|
||||||
unique.reserve(r.size());
|
unique.reserve(r.size());
|
||||||
std::vector<size_t> indices;
|
std::vector<size_t> indices;
|
||||||
size_t count = 0;
|
size_t count = 0;
|
||||||
|
const typename Range::iterator end = r.end();
|
||||||
for(typename Range::const_iterator it = r.begin();
|
for(typename Range::const_iterator it = r.begin();
|
||||||
it != r.end(); ++it, ++count)
|
it != end; ++it, ++count)
|
||||||
{
|
{
|
||||||
const typename UniqueVector::iterator low =
|
const typename UniqueVector::iterator low =
|
||||||
std::lower_bound(unique.begin(), unique.end(), *it);
|
std::lower_bound(unique.begin(), unique.end(), *it);
|
||||||
|
@ -283,7 +286,7 @@ typename Range::const_iterator cmRemoveDuplicates(Range& r)
|
||||||
}
|
}
|
||||||
if (indices.empty())
|
if (indices.empty())
|
||||||
{
|
{
|
||||||
return r.end();
|
return end;
|
||||||
}
|
}
|
||||||
return cmRemoveIndices(r, indices);
|
return cmRemoveIndices(r, indices);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue