This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
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();
}