Chris@16: // Chris@16: // completion_condition.hpp Chris@16: // ~~~~~~~~~~~~~~~~~~~~~~~~ Chris@16: // Chris@101: // Copyright (c) 2003-2015 Christopher M. Kohlhoff (chris at kohlhoff dot com) Chris@16: // Chris@16: // Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: // Chris@16: Chris@16: #ifndef BOOST_ASIO_COMPLETION_CONDITION_HPP Chris@16: #define BOOST_ASIO_COMPLETION_CONDITION_HPP Chris@16: Chris@16: #if defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: # pragma once Chris@16: #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) Chris@16: Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: namespace boost { Chris@16: namespace asio { Chris@16: Chris@16: namespace detail { Chris@16: Chris@16: // The default maximum number of bytes to transfer in a single operation. Chris@101: enum default_max_transfer_size_t { default_max_transfer_size = 65536 }; Chris@16: Chris@16: // Adapt result of old-style completion conditions (which had a bool result Chris@16: // where true indicated that the operation was complete). Chris@16: inline std::size_t adapt_completion_condition_result(bool result) Chris@16: { Chris@16: return result ? 0 : default_max_transfer_size; Chris@16: } Chris@16: Chris@16: // Adapt result of current completion conditions (which have a size_t result Chris@16: // where 0 means the operation is complete, and otherwise the result is the Chris@16: // maximum number of bytes to transfer on the next underlying operation). Chris@16: inline std::size_t adapt_completion_condition_result(std::size_t result) Chris@16: { Chris@16: return result; Chris@16: } Chris@16: Chris@16: class transfer_all_t Chris@16: { Chris@16: public: Chris@16: typedef std::size_t result_type; Chris@16: Chris@16: template Chris@16: std::size_t operator()(const Error& err, std::size_t) Chris@16: { Chris@16: return !!err ? 0 : default_max_transfer_size; Chris@16: } Chris@16: }; Chris@16: Chris@16: class transfer_at_least_t Chris@16: { Chris@16: public: Chris@16: typedef std::size_t result_type; Chris@16: Chris@16: explicit transfer_at_least_t(std::size_t minimum) Chris@16: : minimum_(minimum) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: std::size_t operator()(const Error& err, std::size_t bytes_transferred) Chris@16: { Chris@16: return (!!err || bytes_transferred >= minimum_) Chris@16: ? 0 : default_max_transfer_size; Chris@16: } Chris@16: Chris@16: private: Chris@16: std::size_t minimum_; Chris@16: }; Chris@16: Chris@16: class transfer_exactly_t Chris@16: { Chris@16: public: Chris@16: typedef std::size_t result_type; Chris@16: Chris@16: explicit transfer_exactly_t(std::size_t size) Chris@16: : size_(size) Chris@16: { Chris@16: } Chris@16: Chris@16: template Chris@16: std::size_t operator()(const Error& err, std::size_t bytes_transferred) Chris@16: { Chris@16: return (!!err || bytes_transferred >= size_) ? 0 : Chris@16: (size_ - bytes_transferred < default_max_transfer_size Chris@16: ? size_ - bytes_transferred : std::size_t(default_max_transfer_size)); Chris@16: } Chris@16: Chris@16: private: Chris@16: std::size_t size_; Chris@16: }; Chris@16: Chris@16: } // namespace detail Chris@16: Chris@16: /** Chris@16: * @defgroup completion_condition Completion Condition Function Objects Chris@16: * Chris@16: * Function objects used for determining when a read or write operation should Chris@16: * complete. Chris@16: */ Chris@16: /*@{*/ Chris@16: Chris@16: /// Return a completion condition function object that indicates that a read or Chris@16: /// write operation should continue until all of the data has been transferred, Chris@16: /// or until an error occurs. Chris@16: /** Chris@16: * This function is used to create an object, of unspecified type, that meets Chris@16: * CompletionCondition requirements. Chris@16: * Chris@16: * @par Example Chris@16: * Reading until a buffer is full: Chris@16: * @code Chris@16: * boost::array buf; Chris@16: * boost::system::error_code ec; Chris@16: * std::size_t n = boost::asio::read( Chris@16: * sock, boost::asio::buffer(buf), Chris@16: * boost::asio::transfer_all(), ec); Chris@16: * if (ec) Chris@16: * { Chris@16: * // An error occurred. Chris@16: * } Chris@16: * else Chris@16: * { Chris@16: * // n == 128 Chris@16: * } Chris@16: * @endcode Chris@16: */ Chris@16: #if defined(GENERATING_DOCUMENTATION) Chris@16: unspecified transfer_all(); Chris@16: #else Chris@16: inline detail::transfer_all_t transfer_all() Chris@16: { Chris@16: return detail::transfer_all_t(); Chris@16: } Chris@16: #endif Chris@16: Chris@16: /// Return a completion condition function object that indicates that a read or Chris@16: /// write operation should continue until a minimum number of bytes has been Chris@16: /// transferred, or until an error occurs. Chris@16: /** Chris@16: * This function is used to create an object, of unspecified type, that meets Chris@16: * CompletionCondition requirements. Chris@16: * Chris@16: * @par Example Chris@16: * Reading until a buffer is full or contains at least 64 bytes: Chris@16: * @code Chris@16: * boost::array buf; Chris@16: * boost::system::error_code ec; Chris@16: * std::size_t n = boost::asio::read( Chris@16: * sock, boost::asio::buffer(buf), Chris@16: * boost::asio::transfer_at_least(64), ec); Chris@16: * if (ec) Chris@16: * { Chris@16: * // An error occurred. Chris@16: * } Chris@16: * else Chris@16: * { Chris@16: * // n >= 64 && n <= 128 Chris@16: * } Chris@16: * @endcode Chris@16: */ Chris@16: #if defined(GENERATING_DOCUMENTATION) Chris@16: unspecified transfer_at_least(std::size_t minimum); Chris@16: #else Chris@16: inline detail::transfer_at_least_t transfer_at_least(std::size_t minimum) Chris@16: { Chris@16: return detail::transfer_at_least_t(minimum); Chris@16: } Chris@16: #endif Chris@16: Chris@16: /// Return a completion condition function object that indicates that a read or Chris@16: /// write operation should continue until an exact number of bytes has been Chris@16: /// transferred, or until an error occurs. Chris@16: /** Chris@16: * This function is used to create an object, of unspecified type, that meets Chris@16: * CompletionCondition requirements. Chris@16: * Chris@16: * @par Example Chris@16: * Reading until a buffer is full or contains exactly 64 bytes: Chris@16: * @code Chris@16: * boost::array buf; Chris@16: * boost::system::error_code ec; Chris@16: * std::size_t n = boost::asio::read( Chris@16: * sock, boost::asio::buffer(buf), Chris@16: * boost::asio::transfer_exactly(64), ec); Chris@16: * if (ec) Chris@16: * { Chris@16: * // An error occurred. Chris@16: * } Chris@16: * else Chris@16: * { Chris@16: * // n == 64 Chris@16: * } Chris@16: * @endcode Chris@16: */ Chris@16: #if defined(GENERATING_DOCUMENTATION) Chris@16: unspecified transfer_exactly(std::size_t size); Chris@16: #else Chris@16: inline detail::transfer_exactly_t transfer_exactly(std::size_t size) Chris@16: { Chris@16: return detail::transfer_exactly_t(size); Chris@16: } Chris@16: #endif Chris@16: Chris@16: /*@}*/ Chris@16: Chris@16: } // namespace asio Chris@16: } // namespace boost Chris@16: Chris@16: #include Chris@16: Chris@16: #endif // BOOST_ASIO_COMPLETION_CONDITION_HPP