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..


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


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