Commit 079c74f3 by Paolo Carlini Committed by Paolo Carlini

safe_iterator.h (_BeforeBeginHelper<>:: _S_Is_Beginnest): Add.

2012-04-13  Paolo Carlini  <paolo.carlini@oracle.com>

	* include/debug/safe_iterator.h (_BeforeBeginHelper<>::
	_S_Is_Beginnest): Add.
	* include/debug/forward_list (_BeforeBeginHelper<>::
	_S_Is_Beginnest): Likewise.
	(_Safe_iterator<>::_M_is_beginnest): Add.
	* include/debug/safe_iterator.tcc (_Safe_iterator<>::_M_valid_range):
	Use the latter.
	* testsuite/23_containers/forward_list/debug/splice_after.cc:
	Add test.

From-SVN: r186411
parent d66b8f4b
2012-04-13 Paolo Carlini <paolo.carlini@oracle.com>
* include/debug/safe_iterator.h (_BeforeBeginHelper<>::
_S_Is_Beginnest): Add.
* include/debug/forward_list (_BeforeBeginHelper<>::
_S_Is_Beginnest): Likewise.
(_Safe_iterator<>::_M_is_beginnest): Add.
* include/debug/safe_iterator.tcc (_Safe_iterator<>::_M_valid_range):
Use the latter.
* testsuite/23_containers/forward_list/debug/splice_after.cc:
Add test.
2012-04-12 Benjamin Kosnik <bkoz@redhat.com> 2012-04-12 Benjamin Kosnik <bkoz@redhat.com>
* include/bits/unordered_map.h (__unordered_map): Remove. * include/bits/unordered_map.h (__unordered_map): Remove.
......
...@@ -760,8 +760,12 @@ namespace __gnu_debug ...@@ -760,8 +760,12 @@ namespace __gnu_debug
typedef typename _It::iterator_type _BaseIt; typedef typename _It::iterator_type _BaseIt;
static bool static bool
_M_Is(_BaseIt __it, const _Sequence* __seq) _S_Is(_BaseIt __it, const _Sequence* __seq)
{ return __it == __seq->_M_base().cbefore_begin(); } { return __it == __seq->_M_base().cbefore_begin(); }
static bool
_S_Is_Beginnest(_BaseIt __it, const _Sequence* __seq)
{ return _S_Is(__it, __seq); }
}; };
} }
......
...@@ -50,8 +50,12 @@ namespace __gnu_debug ...@@ -50,8 +50,12 @@ namespace __gnu_debug
typedef typename _It::iterator_type _BaseIt; typedef typename _It::iterator_type _BaseIt;
static bool static bool
_M_Is(_BaseIt __it, const _Sequence* __seq) _S_Is(_BaseIt, const _Sequence*)
{ return false; } { return false; }
static bool
_S_Is_Beginnest(_BaseIt __it, const _Sequence* __seq)
{ return __it == __seq->_M_base().begin(); }
}; };
/** Iterators that derive from _Safe_iterator_base but that aren't /** Iterators that derive from _Safe_iterator_base but that aren't
...@@ -465,7 +469,15 @@ namespace __gnu_debug ...@@ -465,7 +469,15 @@ namespace __gnu_debug
/// any? /// any?
bool _M_is_before_begin() const bool _M_is_before_begin() const
{ {
return _BeforeBeginHelper<_Sequence>::_M_Is(base(), _M_get_sequence()); return _BeforeBeginHelper<_Sequence>::_S_Is(base(), _M_get_sequence());
}
/// Is this iterator equal to the sequence's before_begin() iterator if
/// any or begin() otherwise?
bool _M_is_beginnest() const
{
return _BeforeBeginHelper<_Sequence>::_S_Is_Beginnest(base(),
_M_get_sequence());
} }
}; };
......
// Debugging iterator implementation (out of line) -*- C++ -*- // Debugging iterator implementation (out of line) -*- C++ -*-
// Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011 // Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2010, 2011, 2012
// Free Software Foundation, Inc. // Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // This file is part of the GNU ISO C++ Library. This library is free
...@@ -91,10 +91,11 @@ namespace __gnu_debug ...@@ -91,10 +91,11 @@ namespace __gnu_debug
/* We can only test for equality, but check if one of the /* We can only test for equality, but check if one of the
iterators is at an extreme. */ iterators is at an extreme. */
/* Optim for classic [begin, it) or [it, end) ranges, limit checks /* Optim for classic [begin, it) or [it, end) ranges, limit checks
* when code is valid. */ * when code is valid. Note, for the special case of forward_list,
if (_M_is_begin() || __rhs._M_is_end()) * before_begin replaces the role of begin. */
if (_M_is_beginnest() || __rhs._M_is_end())
return true; return true;
if (_M_is_end() || __rhs._M_is_begin()) if (_M_is_end() || __rhs._M_is_beginnest())
return false; return false;
// Assume that this is a valid range; we can't check anything else // Assume that this is a valid range; we can't check anything else
......
// { dg-options "-std=gnu++0x" } // { dg-options "-std=gnu++0x" }
// Copyright (C) 2010 Free Software Foundation, Inc. // Copyright (C) 2010, 2012 Free Software Foundation, Inc.
// //
// This file is part of the GNU ISO C++ Library. This library is free // This file is part of the GNU ISO C++ Library. This library is free
// software; you can redistribute it and/or modify it under the // software; you can redistribute it and/or modify it under the
...@@ -34,6 +34,10 @@ test01() ...@@ -34,6 +34,10 @@ test01()
VERIFY( before == fl1.before_begin() ); VERIFY( before == fl1.before_begin() );
VERIFY( end == fl1.end() ); VERIFY( end == fl1.end() );
// no-op just to check that debug mode does not see any problem with it.
fl1.splice_after(fl1.before_begin(), std::move(fl2),
fl2.before_begin(), fl2.begin());
} }
int int
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment