bool
SendBuffer::Flush ()
{
uint32_t all = buf_.size();
bool fullTilt = true;
::neolib::segmented_array<unsigned char, chunk_size>::segment& segment =
segmented_iterator<unsigned char, chunk_size>(buf_.begin()).segment();
uint32_t numWritten = Write(sock_, &buf_[0], segment.size());
if (numWritten < segment.size()) fullTilt = false;
while (all - numWritten > chunk_size && fullTilt) {
uint32_t bytes = Write(sock_, &buf_[numWritten], chunk_size);
numWritten += bytes;
if (bytes < chunk_size) fullTilt = false;
}
if (numWritten < all && fullTilt) {
numWritten += Write(sock_, &buf_[numWritten], all - numWritten);
}
buf_.erase(buf_.begin(), buf_.begin() + numWritten);
return numWritten == all;
}
But am tempted to do this:
bool
SendBuffer::Flush ()
{
uint32_t all = buf_.size();
::neolib::segmented_array<unsigned char, chunk_size>::segment& segment =
segmented_iterator<unsigned char, chunk_size>(buf_.begin()).segment();
uint32_t numWritten = Write(sock_, &buf_[0], segment.size());
if (numWritten < segment.size()) goto ending;
while (all - numWritten > chunk_size) {
uint32_t bytes = Write(sock_, &buf_[numWritten], chunk_size);
numWritten += bytes;
if (bytes < chunk_size) goto ending;
}
if (numWritten < all) {
numWritten += Write(sock_, &buf_[numWritten], all - numWritten);
}
ending:
buf_.erase(buf_.begin(), buf_.begin() + numWritten);
return numWritten == all;
}
Is that so bad?
Brian Wood
Ebenezer Enterprises
http://webEbenezer.net






