]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
safe_iterator.h (_BeforeBeginHelper<>:: _S_Is_Beginnest): Add.
authorPaolo Carlini <paolo.carlini@oracle.com>
Fri, 13 Apr 2012 10:43:28 +0000 (10:43 +0000)
committerPaolo Carlini <paolo@gcc.gnu.org>
Fri, 13 Apr 2012 10:43:28 +0000 (10:43 +0000)
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

libstdc++-v3/ChangeLog
libstdc++-v3/include/debug/forward_list
libstdc++-v3/include/debug/safe_iterator.h
libstdc++-v3/include/debug/safe_iterator.tcc
libstdc++-v3/testsuite/23_containers/forward_list/debug/splice_after.cc

index eb9936f423ba637868ba66cde9ebf038e4151629..ab12fae5382a73c799ce6b7354c1a0c47d4e8011 100644 (file)
@@ -1,3 +1,15 @@
+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>
 
        * include/bits/unordered_map.h (__unordered_map): Remove.
index e21eb4a703afa1418485534f78b57484b51c8efa..f4a7ee96df0834893a1467ee3b404897c848a45c 100644 (file)
@@ -760,8 +760,12 @@ namespace __gnu_debug
       typedef typename _It::iterator_type _BaseIt;
 
       static bool
-      _M_Is(_BaseIt __it, const _Sequence* __seq)
+      _S_Is(_BaseIt __it, const _Sequence* __seq)
       { return __it == __seq->_M_base().cbefore_begin(); }
+
+      static bool
+      _S_Is_Beginnest(_BaseIt __it, const _Sequence* __seq)
+      { return _S_Is(__it, __seq); }
     };
 }
 
index b02fa7ab8ff3fb4f6c90fdc922a765c61610e80c..3cab2d7d8a2cc24b5eadfa78aabe493796a1d050 100644 (file)
@@ -50,8 +50,12 @@ namespace __gnu_debug
       typedef typename _It::iterator_type _BaseIt;
 
       static bool
-      _M_Is(_BaseIt __it, const _Sequence* __seq)
+      _S_Is(_BaseIt, const _Sequence*)
       { 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
@@ -465,7 +469,15 @@ namespace __gnu_debug
       /// any?
       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());
       }
     };
 
index 777a707e7f398d48db3b9ddd019d061ae0888af4..f01252bf6c2dfbe63996d54cb15c79aba57a49d0 100644 (file)
@@ -1,6 +1,6 @@
 // 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.
 //
 // This file is part of the GNU ISO C++ Library.  This library is free
@@ -91,10 +91,11 @@ namespace __gnu_debug
        /* We can only test for equality, but check if one of the
           iterators is at an extreme. */
        /* Optim for classic [begin, it) or [it, end) ranges, limit checks
-        * when code is valid. */
-       if (_M_is_begin() || __rhs._M_is_end())
+        * when code is valid.  Note, for the special case of forward_list,
+        * before_begin replaces the role of begin.  */ 
+       if (_M_is_beginnest() || __rhs._M_is_end())
          return true;
-       if (_M_is_end() || __rhs._M_is_begin())
+       if (_M_is_end() || __rhs._M_is_beginnest())
          return false;
 
        // Assume that this is a valid range; we can't check anything else
index 60297551dcd0472d5a23258ab3cf4d7aacee7a6e..4cc1cfcf78dcf74a0364a9980ec8ce301ecb0717 100644 (file)
@@ -1,6 +1,6 @@
 // { 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
 // software; you can redistribute it and/or modify it under the
@@ -34,6 +34,10 @@ test01()
 
   VERIFY( before == fl1.before_begin() );
   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