This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: iter_swapping vector<bool>::iterator..
Paolo Carlini wrote:
Anyone knows whether other implementors are able to provide a
vector<bool>::iterator
which meets the forward iterator requirements? Everything really boils
down to this,
in my opinion.
(Just thought I'd answer this bit.. but please answer if you have any
knowledge in this area, the whole iterator / vector<bool> / swap
business just confuses me..)
I don't think we can fix this with the implementation, looking at
23.2.5, the "reference" type has to be a class rather than a reference,
defined like:
// bit reference:
class reference {
friend class vector;
reference();
public:
~reference();
operator bool() const;
reference& operator=(const bool x);
reference& operator=(const reference& x);
void flip(); // flips the bit
};
So it doesn't look like we can get around this... This would have been
fixed in TR1 with the extended iterator attributes, but they didn't seem
to get in in the end ¬_¬
While it won't fix anything if people are using their own proxy
iterators (although they shouldn't be, as the standard doesn't allow
them to), I don't imagine it would cause much pain to add:
void iter_swap(std::vector<bool>::iterator i,
std::vector<bool>::iterator j)
{
bool tmp = *i;
*j = *i;
*i = tmp;
}
(and perhaps even iter_swaps that take a std::vector<bool>::iterator and
a bool&?)
to namespace std if we want to preserve the old symantics (although of
course, you could then argue that we are adding a libstdc++-v3
extension, although we have been for quite a long time).
If this seems reasonable, I'll neaten it up / add a whole bunch of
testcases to make sure nothing is broken, etc :)
Chris