Запустите асинхронную операцию для считывания данных в streambuf, пока объект функции не покажет соответствие.
template<
typename AsyncReadStream,
typename Allocator,
typename MatchCondition,
typename ReadHandler>
void-or-deduced async_read_until(
AsyncReadStream & s,
boost::asio::basic_streambuf< Allocator > & b,
MatchCondition match_condition,
ReadHandler handler,
typename enable_if< is_match_condition< MatchCondition >::value >::type * = 0);
Эта функция используется для асинхронного считывания данных в заданный Streambuf до тех пор, пока определяемый пользователем объект функции состояния соответствия, при применении к данным, содержащимся в Streambuf, не указывает на успешное соответствие. Звонок функции всегда возвращается немедленно. Асинхронная операция будет продолжаться до тех пор, пока не будет выполнено одно из следующих условий:
- Объект функции соответствия возвращает std::pair, где второй элемент оценивает истинность.
- Произошла ошибка.
Эта операция реализована в терминах нуля или более вызовов функции async_read_some потока и известна каксоставленная операция. Если объект функции соответствия уже указывает на соответствие, эта асинхронная операция завершается немедленно. Программа должна гарантировать, что поток не выполняет никаких других операций чтения (таких как async_read, async_read_until, функция async_read_some потока или любые другие составные операции, которые выполняют чтения) до завершения этой операции.
- s
Поток, из которого следует читать данные. Этот тип должен поддерживать концепцию AsyncReadStream.
- b
Объект streambuf, в который будут считываться данные.
- match_condition
-
Объект функции должен быть вызван, чтобы определить, существует ли совпадение. Подпись объекта функции должна быть:
pair<iterator, bool> match_condition(iterator begin, iterator end);
где<iterator
>обозначает тип:
buffers_iterator<basic_streambuf<Allocator>::const_buffers_type>
Параметры итератора<begin
>и<end
>определяют диапазон байтов для сканирования, чтобы определить, есть ли совпадение.<first
>членом возвратного значения является итератор, обозначающий один конец байтов, которые были потреблены функцией соответствия. Этот итератор используется для расчета параметра<begin
>для любого последующего вызова состояния соответствия.<second
>элемент обратной стоимости является истинным, если совпадение было найдено, ложным в противном случае.
- handler
-
Обработчик должен быть вызван, когда операция чтения завершится. Копии будут сделаны из обработчика по мере необходимости. Функциональная подпись обработчика должна быть:
void handler(
const boost::system::error_code& error,
std::size_t bytes_transferred
);
Независимо от того, выполняется ли асинхронная операция немедленно или нет, обработчик не будет вызываться из этой функции. Привлечение обработчика будет выполнено способом, эквивалентным использованию<boost::asio::io_service::post()
>.
После успешной работы async_read_until, streambuf может содержать дополнительные данные, которые не соответствуют объекту функции. Приложение обычно оставляет эти данные в streambuf для последующей работы async_read_until.
Реализация по умолчанию признака<is_match_condition
>типа оценивает истинность для указателей функций и объектов функций с<result_type
>типизированным значением. Он должен быть специализирован для других определяемых пользователем функциональных объектов.
Чтобы асинхронно считывать данные в streambuf, пока не встретится белое пространство:
typedef boost::asio::buffers_iterator<
boost::asio::streambuf::const_buffers_type> iterator;
std::pair<iterator, bool>
match_whitespace(iterator begin, iterator end)
{
iterator i = begin;
while (i != end)
if (std::isspace(*i++))
return std::make_pair(i, true);
return std::make_pair(i, false);
}
...
void handler(const boost::system::error_code& e, std::size_t size);
...
boost::asio::streambuf b;
boost::asio::async_read_until(s, b, match_whitespace, handler);
Для асинхронного чтения данных в streambuf до тех пор, пока не будет найден соответствующий символ:
class match_char
{
public:
explicit match_char(char c) : c_(c) {}
template <typename Iterator>
std::pair<Iterator, bool> operator()(
Iterator begin, Iterator end) const
{
Iterator i = begin;
while (i != end)
if (c_ == *i++)
return std::make_pair(i, true);
return std::make_pair(i, false);
}
private:
char c_;
};
namespace asio {
template <> struct is_match_condition<match_char>
: public boost::true_type {};
}
...
void handler(const boost::system::error_code& e, std::size_t size);
...
boost::asio::streambuf b;
boost::asio::async_read_until(s, b, match_char('a'), handler);