Прочитайте данные в streambuf, пока объект функции не покажет соответствие.
template<
typename SyncReadStream,
typename Allocator,
typename MatchCondition>
std::size_t read_until(
SyncReadStream & s,
boost::asio::basic_streambuf< Allocator > & b,
MatchCondition match_condition,
typename enable_if< is_match_condition< MatchCondition >::value >::type * = 0);
Эта функция используется для считывания данных в заданный Streambuf до тех пор, пока определяемый пользователем объект функции состояния соответствия, при применении к данным, содержащимся в Streambuf, не указывает на успешное соответствие. Звонок будет блокироваться до тех пор, пока не будет выполнено одно из следующих условий:
- Объект функции соответствия возвращает std::pair, где второй элемент оценивает истинность.
- Произошла ошибка.
Эта операция реализована с точки зрения нуля или более вызовов функции read_some потока. Если объект функции состояния соответствия уже указывает на соответствие, функция немедленно возвращается.
- s
Поток, из которого следует читать данные. Этот тип должен поддерживать концепцию SyncReadStream.
- 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
>элемент обратной стоимости является истинным, если совпадение было найдено, ложным в противном случае.
Количество байтов в зоне получения стримбуфа, которые были полностью поглощены функцией матча.
- boost::system::system_error
Выброшен на провал.
После успешной операции read_until, streambuf может содержать дополнительные данные, которые не соответствуют объекту функции. Приложение обычно оставляет эти данные в Streambuf для последующего использования.
Реализация по умолчанию признака<is_match_condition
>типа оценивает истинность для указателей функций и объектов функций с помощью<result_type
>typedef. Он должен быть специализирован для других определяемых пользователем функциональных объектов.
Чтобы считывать данные в 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);
}
...
boost::asio::streambuf b;
boost::asio::read_until(s, b, match_whitespace);
Для чтения данных в 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 {};
}
...
boost::asio::streambuf b;
boost::asio::read_until(s, b, match_char('a'));