This is the mail archive of the libstdc++@gcc.gnu.org mailing list for the libstdc++ project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: iter_swapping vector<bool>::iterator..


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

Paolo Carlini wrote:
| Paolo Carlini wrote:
|
|> Ok, then let's ask Chris to provide a solution fo this issue, as already
|> outlined in various messages.
|
|
| To be clear, I mean adding an overload: among the various proposals seems
| the one which people like most (myself included ;)
|

Actually, I might have come up with a better way of dealing with it :)
This patch makes sure that we only use swap to implement iter_swap when
value_type& = reference_type (which should be true for all forward
iterators, which is in theory all we should accept!)

I've attached iter_swap_patch (a very small patch to iter_swap in
stl_algobase.h), a test case (20577.cc) and a Changelog. Sorry that this
isn't slightly neater.. If you have some code with some vector<bool>s
(and things derived from them), it would be really nice if you could
test it :)

Chris
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.0 (MingW32)

iD8DBQFCPt6r3FpDzErifpIRAqSTAJ9kWCTbHSBHi1GRwPvkReHo2XIT+wCdHro3
CHzXN96dI34jWEcyN1ua6CU=
=zrty
-----END PGP SIGNATURE-----
Index: stl_algobase.h
===================================================================
RCS file: /cvsroot/gcc/gcc/libstdc++-v3/include/bits/stl_algobase.h,v
retrieving revision 1.42
diff -u -3 -r1.42 stl_algobase.h
--- stl_algobase.h	1 Feb 2005 13:30:29 -0000	1.42
+++ stl_algobase.h	21 Mar 2005 14:35:48 -0000
@@ -155,7 +155,14 @@
 				  _ValueType2>)
       __glibcxx_function_requires(_ConvertibleConcept<_ValueType2,
 				  _ValueType1>)
-      std::__iter_swap<__are_same<_ValueType1, _ValueType2>::__value>::
+
+      typedef typename iterator_traits<_ForwardIterator1>::reference
+	_ReferenceType1;
+      typedef typename iterator_traits<_ForwardIterator2>::reference
+	_ReferenceType2;
+      std::__iter_swap<__are_same<_ValueType1, _ValueType2>::__value &&
+	__are_same<_ValueType1 &, _ReferenceType1>::__value &&
+	__are_same<_ValueType2 &, _ReferenceType2>::__value>::
 	iter_swap(__a, __b);
     }
 
2005-03-21  Chris Jefferson <chris@bubblescope.net>

	PR libstdc++/20577
	* include/std/stl_algobase.h (iter_swap) : Only delegate iter_swap
	to swap when the iterator's reference_type is a reference to it's
	value_type.
	* testsuite/25_algorithms/iter_swap/20577.cc : New.
// Copyright (C) 2005 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
// terms of the GNU General Public License as published by the
// Free Software Foundation; either version 2, or (at your option)
// any later version.

// This library is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.

// You should have received a copy of the GNU General Public License along
// with this library; see the file COPYING.  If not, write to the Free
// Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307,
// USA.

#include <algorithm>
#include <vector>
#include <testsuite_hooks.h>

void
test1()
{
  std::vector<bool> v;
  v.push_back(true);
  v.push_back(false);
  std::iter_swap(v.begin(), v.begin() + 1);
  VERIFY(v[0] == false && v[1] == true);
}

void
test2()
{
  std::vector<int> v;
  v.push_back(1);
  v.push_back(2);
  std::iter_swap(v.begin(), v.begin() + 1);
  VERIFY(v[0] == 2 && v[1] == 1);
}

int int_swap_count;

struct X {};
void swap(X& i, X& j)
{ ++int_swap_count; }

void
test3()
{
  int_swap_count=0;
  X i,j;
  std::iter_swap(&i, &j);
  VERIFY(int_swap_count == 1);
}

int
main()
{
  test1();
  test2();
  test3();
}

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]