InputByteStreamRef::read_all_as

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
template <class ContainerType>
ContainerType read_all_as(); /*1*/
template <class ContainerType, class ReadingPolicy>
/*см. ниже*/ read_all_as(ReadingPolicy); /*2*/

Считывает из потока InputByteStreamRef в контейнер SequenceContainer все доступные в потоке на текущий момент времени данные.

Параметры шаблона
ContainerTypeТип возвращаемого контейнера байт с содержимым, считанным из потока. Контейнер должен удовлетворять требованиям SequenceContainer, а тип его элемента должен соответствовать байту.
ReadingPolicyВычисляемый дедукцией тип политики чтения, используемой перегрузкой 2. Тип должен определять статическую константу компиляции value, содержащую битовую маску идентификаторов компонент политики. Эти идентификаторы заданы перечислением reading_policy_flags и имеют следующие значения.
Символическое имяЦелочисленное значениеОписание
force_fill_buffer1

Операции чтения из потоков InputByteStreamRef блокируют осуществляющий чтение поток выполнения до тех пор, пока поданный на вход операции буфер не будет заполнен полностью, или операция чтения не будет явно отменена. Если данная политика не задана, операции чтения завершаются, как только из потока удается считать хоть какое-то количество данных, или происходит явная отмена операции.

Например, если в результате неполного чтения достигнут конец данных, и флаг force_fill_buffer сброшен, операции чтения вернут управление вызывающей чтение стороне. Если же флаг установлен, операции чтения будут пытаться читать данные до тех пор, пока выходной буфер не будет заполен полностью, или операция чтения не будет отменена.
get_error_code2Операции чтения возвращают коды ошибок типа return_code_t вместо генерации исключений для типичных ошибок чтения.

Политика заполнения буфера reading_policy_flags::force_fill_buffer не применима для данного метода, и установка этого флага приведет к ошибке компиляции.

Существует также метафункция reading_policy, которая позволяет задать маску политик шаблонными параметрами, как указано в примере ниже.
Возвращаемое значение:
Перегрузка 1 возвращает контейнер со всеми данными, которые удалось считать из потока. Тип значения, возвращаемого перегрузкой 2, зависит от политики ReadingPolicy. Если политикой не указан флаг reading_policy_flags::get_error_code, перегрузка 2 возвращает контейнер аналогично перегрузке 1. Если флаг reading_policy_flags::get_error_code установлен, возвращается пара std::pair значений std::pair<return_code_t, ContainerType> с кодом завершения чтения в качестве первого элемента пары, и контейнер считанных байт - в качестве второго.
См. также
IInputByteStream::ReadArray
InputByteStreamRef::read
InputByteStreamRef::read_as

Пусть is - объект класса InputByteStreamRef. Тогда вызов перегрузки 1

is.read_all_as<Container<T>>();

эквивалентен вызову перегрузки 2 следующим образом.

is.read_all_as<Container<T>>(reading_policy<>());

Пример: чтение данных из файла в строку (C++17).

#include <cstdint>
#include <camaas/istream.h>
#include <string>

std::string read_from_file(const char* file_name)
{
    using namespace CAMaaS;
    auto file = make_file_based_data_storage<FileRead, FileOpenExisting>(file_name);
    auto is = represent_as<InputByteStreamOwn>(file.read());
    return is.read_all_as<std::string>();
}

std::string read_from_file_nothrow(const char* file_name)
{
    using namespace CAMaaS;
    auto file = make_file_based_data_storage<FileRead, FileOpenExisting>(file_name);
    auto is = represent_as<InputByteStreamOwn>(file.read());
    auto [err, data] = is.read_all_as<std::string>(reading_policy<reading_policy_flags::get_error_code>());
    if (ChsvFailed(err))
        return std::string("error ") + std::to_string(err);
    return data;
}