diff --git a/include/boost/asio/buffer.hpp b/include/boost/asio/buffer.hpp index 604e70f9..ff28fa58 100644 --- a/include/boost/asio/buffer.hpp +++ b/include/boost/asio/buffer.hpp @@ -27,7 +27,7 @@ #include #if defined(BOOST_MSVC) -# if defined(_HAS_ITERATOR_DEBUGGING) +# if defined(_HAS_ITERATOR_DEBUGGING) && (_HAS_ITERATOR_DEBUGGING != 0) # if !defined(BOOST_ASIO_DISABLE_BUFFER_DEBUGGING) # define BOOST_ASIO_ENABLE_BUFFER_DEBUGGING # endif // !defined(BOOST_ASIO_DISABLE_BUFFER_DEBUGGING) @@ -391,6 +391,11 @@ public: { } + ~buffer_debug_check() + { + iter_ = Iterator(); + } + void operator()() { *iter_; diff --git a/include/boost/asio/impl/read.ipp b/include/boost/asio/impl/read.ipp index 36375911..6134b9c8 100644 --- a/include/boost/asio/impl/read.ipp +++ b/include/boost/asio/impl/read.ipp @@ -19,7 +19,6 @@ #include #include -#include #include #include @@ -140,25 +139,23 @@ namespace detail std::size_t bytes_transferred) { total_transferred_ += bytes_transferred; - buffers_->consume(bytes_transferred); - if ((*completion_condition_)(ec, total_transferred_) - || buffers_->begin() == buffers_->end()) + buffers_.consume(bytes_transferred); + if (completion_condition_(ec, total_transferred_) + || buffers_.begin() == buffers_.end()) { - buffers_.reset(); - completion_condition_.reset(); handler_(ec, total_transferred_); } else { - stream_.async_read_some(*buffers_, *this); + stream_.async_read_some(buffers_, *this); } } //private: AsyncReadStream& stream_; - boost::optional buffers_; + buffers_type buffers_; std::size_t total_transferred_; - boost::optional completion_condition_; + CompletionCondition completion_condition_; ReadHandler handler_; }; @@ -239,9 +236,8 @@ namespace detail total_transferred_ += bytes_transferred; streambuf_.commit(bytes_transferred); if (streambuf_.size() == streambuf_.max_size() - || (*completion_condition_)(ec, total_transferred_)) + || completion_condition_(ec, total_transferred_)) { - completion_condition_.reset(); handler_(ec, total_transferred_); } else @@ -256,7 +252,7 @@ namespace detail AsyncReadStream& stream_; boost::asio::basic_streambuf& streambuf_; std::size_t total_transferred_; - boost::optional completion_condition_; + CompletionCondition completion_condition_; ReadHandler handler_; }; diff --git a/include/boost/asio/impl/write.ipp b/include/boost/asio/impl/write.ipp index c35ea4aa..8073bfdd 100644 --- a/include/boost/asio/impl/write.ipp +++ b/include/boost/asio/impl/write.ipp @@ -17,10 +17,6 @@ #include -#include -#include -#include - #include #include #include @@ -129,25 +125,23 @@ namespace detail std::size_t bytes_transferred) { total_transferred_ += bytes_transferred; - buffers_->consume(bytes_transferred); - if ((*completion_condition_)(ec, total_transferred_) - || buffers_->begin() == buffers_->end()) + buffers_.consume(bytes_transferred); + if (completion_condition_(ec, total_transferred_) + || buffers_.begin() == buffers_.end()) { - buffers_.reset(); - completion_condition_.reset(); handler_(ec, total_transferred_); } else { - stream_.async_write_some(*buffers_, *this); + stream_.async_write_some(buffers_, *this); } } //private: AsyncWriteStream& stream_; - boost::optional buffers_; + buffers_type buffers_; std::size_t total_transferred_; - boost::optional completion_condition_; + CompletionCondition completion_condition_; WriteHandler handler_; };