[v3] Add missing forward_list<>::splice_after and merge overloads fix splice_after taking a range

Paolo Carlini paolo.carlini@oracle.com
Fri Apr 13 10:48:00 GMT 2012


On 04/13/2012 09:18 AM, François Dumont wrote:
> Yes this patch is just fine too. I knew the usage of a static bool 
> constant won't be appreciated and indeed I find your version cleaner. 
> And yes, other kind of empty ranges are fine.
>
> Do you apply it ? If so you should perhaps add my modification of the 
> splice_after.cc test case unless you have plan to add this kind of use 
> case in some code to come.
Thanks Francois. Thus I'm committing mainline and branch the below.

Paolo.

//////////////////////
-------------- next part --------------
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.
-------------- next part --------------
Index: include/debug/safe_iterator.tcc
===================================================================
--- include/debug/safe_iterator.tcc	(revision 186410)
+++ include/debug/safe_iterator.tcc	(working copy)
@@ -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 @@
 	/* 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: include/debug/forward_list
===================================================================
--- include/debug/forward_list	(revision 186410)
+++ include/debug/forward_list	(working copy)
@@ -760,8 +760,12 @@
       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: include/debug/safe_iterator.h
===================================================================
--- include/debug/safe_iterator.h	(revision 186410)
+++ include/debug/safe_iterator.h	(working copy)
@@ -50,8 +50,12 @@
       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,8 +469,16 @@
       /// 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());
+      }
     };
 
   template<typename _IteratorL, typename _IteratorR, typename _Sequence>
Index: testsuite/23_containers/forward_list/debug/splice_after.cc
===================================================================
--- testsuite/23_containers/forward_list/debug/splice_after.cc	(revision 186410)
+++ testsuite/23_containers/forward_list/debug/splice_after.cc	(working copy)
@@ -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 @@
 
   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


More information about the Libstdc++ mailing list