Skip to content

<deque>: many internal operations could use unchecked iterators #2868

@CaseyCarter

Description

@CaseyCarter

deque is inconsistent about using checked vs. unchecked iterators for internal operations where checking is not needed. emplace, for example:

STL/stl/inc/deque

Lines 819 to 835 in ef62d3f

template <class... _Valty>
iterator emplace(const_iterator _Where, _Valty&&... _Val) {
const auto _Off = static_cast<size_type>(_Where - begin());
#if _ITERATOR_DEBUG_LEVEL == 2
_STL_VERIFY(_Off <= _Mysize(), "deque emplace iterator outside range");
#endif // _ITERATOR_DEBUG_LEVEL == 2
if (_Off <= _Mysize() / 2) { // closer to front, push to front then rotate
emplace_front(_STD forward<_Valty>(_Val)...);
_STD rotate(begin(), _Next_iter(begin()), begin() + static_cast<difference_type>(1 + _Off));
} else { // closer to back, push to back then rotate
emplace_back(_STD forward<_Valty>(_Val)...);
_STD rotate(begin() + static_cast<difference_type>(_Off), _Prev_iter(end()), end());
}
return begin() + static_cast<difference_type>(_Off);
}

passes checked iterators to rotate which could as well be unchecked - we know that the ranges we're forming are valid. We need to audit the file for such occurrences and change them to use unchecked iterators (returned from _Unchecked_begin and _Unchecked_end) where possible.

Metadata

Metadata

Assignees

No one assigned

    Labels

    fixedSomething works now, yay!performanceMust go faster

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions