> -----Original Message----- > From: Jan Gaspar [mailto:[EMAIL PROTECTED] > Ok, it would be possible. > > Pavel Vozenilek wrote: > > > Would it be possible to add helper function 'flatten()' into > > circular_buffer? > > > > After invocation, user would be sure of: > > > > &buff[0] < &buff[1] < ... < &buff[n] > > [snip] > > can be handy: > > - when legacy C function requires continuous array (like Win32 API) > > - when buffer is being saved to file or written to socket > > - special purpose adaptor could present result as > (nonresizable) vector<> > > > > Alternatives are simple but much more CPU/memory expensive. > >
What if you don't want to flatten it, you just want it accessible as flat ranges? Perhaps a function taking an iterator range [first,last) and returning last_contiguous, where last_contiguous is < last and &*last_contiguous >= &*first. Alternatively, it could return a pointer, or pair of pointers to provide the (pointer) half closed range [&*first, (&*last_contiguous) + 1). Something like the following would write the content of a circular_buffer of char to a socket: i = buff.begin(); while ( i != buff.end() && n = write(fd, &*i, buff.last_contiguous(i, buff.end()) - i + 1 )) > 0) i += n; I'm not sure how to do something equally efficient for reading data from a socket and appending the data to a buffer - very similar code would work, but only for copying in, not for inserting. Ideally, I would like to be able to obtain a contiguous uninitialised storage range starting from buff.end(), copy data into the buffer then update the buffer size accordingly. It might be cleaner to do this via a callback interface eg: // function to do the read int read_from_fd(T *p, size_type n) { if ((n = read(fd, p, n)) < 0) { throw something; } return n; } // append_from calls read_from_fd passing it &*buffer.end() and the contiguous space available // on return, the buffer state is updated (end advanced by the value returned). buffer.append_from(read_from_fd); Regards Darryl Green. _______________________________________________ Unsubscribe & other changes: http://lists.boost.org/mailman/listinfo.cgi/boost