1

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 から取得されます。スイッチケーススタイルは非常に奇妙に見えます, "return;default:" ???

4

1 に答える 1

1

これは、構成された読み取り操作を管理するファンクターです。

初めて呼び出されると ( start == 1)、バッファーを準備し、最初の読み取りを発行して、自身を完了ハンドラーとして渡し、戻ります。

これで、完了ハンドラーとして呼び出されるたびに、defaultラベルに直接ジャンプしてバッファーと内部カウンターを更新し、必要に応じて別の読み取りを発行します。

実際には、この演算子を 2 つの別個のものに分割することができました。1 つは最初の読み取り用で、もう 1 つは後続の呼び出し用です。しかし、そのようなアプローチはより多くのコードを生成する可能性があるため、ライブラリの作成者によって拒否されました。

于 2012-09-03T10:56:10.800 に答える