我在boost.1.50源代码中读了asio,这是什么方法?
void operator()(const boost::system::error_code& ec,
std::size_t bytes_transferred, int start = 0)
{
switch (start)
{
case 1:
buffers_.prepare(this->check_for_completion(ec, total_transferred_));
for (;;)
{
stream_.async_read_some(buffers_,
BOOST_ASIO_MOVE_CAST(read_op)(*this));
return; default:
total_transferred_ += bytes_transferred;
buffers_.consume(bytes_transferred);
buffers_.prepare(this->check_for_completion(ec, total_transferred_));
if ((!ec && bytes_transferred == 0)
|| buffers_.begin() == buffers_.end())
break;
}
handler_(ec, static_cast<const std::size_t&>(total_transferred_));
}
}
代码从boost_1_50_0 \ boost \ asio \ impl \ read.hpp中获取。 切换案例样式看起来很奇怪,“返回;默认:”???
答案 0 :(得分:1)
这是一个管理组合读取操作的仿函数。
第一次调用(start == 1
)时,它会准备缓冲区,发出第一个读取,将自身作为完成处理程序传递,然后返回。
现在,每次作为完成处理程序调用时,它会直接跳转到default
标签并更新缓冲区和内部计数器,并在需要时发出另一个读取。
实际上,可以将此运算符拆分为两个独立的运算符:一个用于初始读取,另一个用于后续调用。但也许这样的方法会产生更多的代码,因此被图书馆作者拒绝了。