NULL iterators for <list>
Howard Hinnant
hhinnant at apple.com
Fri Aug 2 11:24:26 PDT 2013
On Aug 1, 2013, at 1:05 PM, Marshall Clow <mclow.lists at gmail.com> wrote:
> http://std.org/jtc1/sc22/wg21/docs/papers/2013/n3644.pdf says that value-initialized iterators should compare equal.
>
> Implement that for std::list.
>
> There are interactions with libc++'s debug mode; hence the extra tests.
Looks pretty good. Just a couple of comments.
1.
friend _LIBCPP_INLINE_VISIBILITY
bool operator==(const __list_iterator& __x, const __list_iterator& __y)
{
+ if ( __x.__ptr_ == nullptr )
+ return __y.__ptr_ == nullptr;
This is unnecessary, and hurts performance. The existing:
return __x.__ptr_ == __y.__ptr_;
is all we need.
2.
In both tests you have some iterators default constructed:
+ C::iterator i;
This isn't sufficient to get the desired behavior, unless you take advantage of knowledge of the current implementation. For example this test would sometimes fail if the implementation changed from:
+ __list_iterator() _NOEXCEPT : __ptr_(nullptr)
to:
+ __list_iterator() = default;
In order to leave open the possibility of changing the implementation without having to re-implement the tests, the tests should always do one of:
C::iterator i{};
C::iterator i = C::iterator{};
C::iterator i = C::iterator();
Thanks!
Howard
More information about the cfe-commits
mailing list