InputByteStreamRef::read: различия между версиями

Материал из CAMaaS preliminary wiki
Перейти к навигации Перейти к поиску
(Новая страница: «{{function_begin |std::size_t read(_Out_bytecap_post_bytecount_(cbBuffer, return) void* pBuffer, std::size_t cbBuffer) const; |{{IInternetConnectionEndPoint::read…»)
 
 
(не показано 9 промежуточных версий этого же участника)
Строка 1: Строка 1:
{{function_begin |std::size_t read(_Out_bytecap_post_bytecount_(cbBuffer, return) void* pBuffer, std::size_t cbBuffer) const; |{{IInternetConnectionEndPoint::read brief}}}}
{{function_begin |std::size_t read(void* pBuffer, std::size_t cbBuffer); /*1*/
template <class ReadingPolicy>
/*см. ниже*/ read(void* pBuffer, std::size_t cbBuffer, ReadingPolicy); /*2*/ |{{InputByteStreamRef::read brief}}}}
{{function template paramlist begin}}
{{function template paramlist add|ReadingPolicy|Вычисляемый дедукцией тип политики чтения, используемой перегрузкой 2. Тип должен определять статическую константу компиляции <tt>value</tt>, содержащую битовую маску идентификаторов компонент политики. Эти идентификаторы заданы перечислением [[reading_policy_flags]] и имеют следующие значения.
{{reading_policy_flags}}
 
Существует также метафункция [[reading_policy]], которая позволяет задать маску политик шаблонными параметрами, как указано в примере ниже.}}
{{function template paramlist end}}
{{function_paramlist begin}}
{{function_paramlist begin}}
{{function_paramlist add|pBuffer|Указатель, который в случае успешного завершения функции принимает считанные данные. Объем считанных данных возвращается методом.|paramdir=[out]}}
{{function_paramlist add|pBuffer|Указатель, который в случае успешного завершения функции принимает считанные данные. Объем считанных данных возвращается, прямо или опосредовано через пару, методами.|paramdir=[out]}}
{{function_paramlist add|cbBuffer|Размер буфера в байтах.}}
{{function_paramlist add|cbBuffer|Размер буфера в байтах.}}
{{function_paramlist end}}
{{function_paramlist end}}
{{function_return_value|Объем прочитанных данных.}}
{{function_return_value|Перегрузка 1 возвращает объем прочитанных данных. Тип значения, возвращаемого перегрузкой 2, зависит от политики <tt>ReadingPolicy</tt>. Если политикой не указан флаг <source lang="cpp" inline>reading_policy_flags::get_error_code</source>, перегрузка 2 возвращает объем считанных данных аналогично перегрузке 1. Если флаг <source lang="cpp" inline>reading_policy_flags::get_error_code</source> установлен, возвращается пара [https://en.cppreference.com/w/cpp/utility/pair std::pair] значений <source lang="cpp" inline>std::pair<return_code_t, std::size_t></source> - код завершения чтения в качестве первого элемента пары, и объем считанных байт - в качестве второго.}}
{{function_sa_begin}}
{{function_sa_begin}}
{{function_sa_add|[[IInputByteStream::ReadArray]]}}
{{function_sa_add|[[IInputByteStream::ReadArray]]}}
{{function_sa_add|[[InputByteStreamRef::read_as]]}}
{{function_sa_add|[[InputByteStreamRef::read_all_as]]}}
{{function_sa_end}}
{{function_sa_end}}
{{function_end}}
Если чтение блокирует вызывающий поток выполнения, и эта блокировка прерывается нормальным образом (например, когда поток осуществляет чтение из интернет канала, и другой поток вызывает метод [[IInternetConnectionEndPoint::CancelOperations]] над этим каналом, или по TCP каналу связи поступает сигнал <tt>[https://tools.ietf.org/html/rfc793#page-15 FIN])</tt>), перегрузка 2, в зависимости от значения флага политики <source lang="cpp" inline> reading_policy_flags::get_error_code</source>, возвращает код успешного завершения [https://www.chusov.org/doxygen/group___error_handling.html#CHSVCODES CHSVERROR_SUCCESS_CANCELLED] (0x2417000f) или генерирует исключение [https://www.chusov.org/doxygen/struct_chusov_1_1_exceptions_1_1_operation_cancelled_exception.html Chusov::Exceptions::OperationCancelledException]. Перегрузка 1 в таких случаях всегда генерирует это исключение.
Пусть <tt>is</tt> - объект класса [[InputByteStreamRef]]. Тогда вызов перегрузки 1
<source lang="cpp">
is.read(pBuf, cbBuf);
</source>
эквивалентен вызову перегрузки 2 следующим образом.
<source lang="cpp">
is.read(pBuf, cbBuf, reading_policy<>());
</source>


Любая блокировка потоков выполнения, осуществляющих коммуникацию, может быть прервана вызовом метода [[InternetConnectionEndPoint::CancelOperations]]. В этом случае блокирующие поток методы возвращают код [https://www.chusov.org/doxygen/group___error_handling.html#CHSVCODES CHSVERROR_SUCCESS_CANCELLED] (0x2417000f).}}
В отличие от метода [[InputByteStreamRef::read|read]] метод [[InputByteStreamRef::read_as|read_as]] по умолчанию использует политику <source lang="cpp" inline>reading_policy_flags::force_fill_buffer</source>.
{{function_end}}
 
{{InputByteStreamRef::read example}}

Текущая версия на 14:44, 25 августа 2019

std::size_t read(void* pBuffer, std::size_t cbBuffer); /*1*/
 template <class ReadingPolicy>
/*см. ниже*/ read(void* pBuffer, std::size_t cbBuffer, ReadingPolicy); /*2*/

Реализует чтение заданного количества байт из потока InputByteStreamRef.

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

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

Например, если в результате неполного чтения достигнут конец данных, и флаг force_fill_buffer сброшен, операции чтения вернут управление вызывающей чтение стороне. Если же флаг установлен, операции чтения будут пытаться читать данные до тех пор, пока выходной буфер не будет заполен полностью, или операция чтения не будет отменена.
get_error_code2Операции чтения возвращают коды ошибок типа return_code_t вместо генерации исключений для типичных ошибок чтения.
Существует также метафункция reading_policy, которая позволяет задать маску политик шаблонными параметрами, как указано в примере ниже.
Параметры
[out]pBufferУказатель, который в случае успешного завершения функции принимает считанные данные. Объем считанных данных возвращается, прямо или опосредовано через пару, методами.
cbBufferРазмер буфера в байтах.
Возвращаемое значение:
Перегрузка 1 возвращает объем прочитанных данных. Тип значения, возвращаемого перегрузкой 2, зависит от политики ReadingPolicy. Если политикой не указан флаг reading_policy_flags::get_error_code, перегрузка 2 возвращает объем считанных данных аналогично перегрузке 1. Если флаг reading_policy_flags::get_error_code установлен, возвращается пара std::pair значений std::pair<return_code_t, std::size_t> - код завершения чтения в качестве первого элемента пары, и объем считанных байт - в качестве второго.
См. также
IInputByteStream::ReadArray
InputByteStreamRef::read_as
InputByteStreamRef::read_all_as

Если чтение блокирует вызывающий поток выполнения, и эта блокировка прерывается нормальным образом (например, когда поток осуществляет чтение из интернет канала, и другой поток вызывает метод IInternetConnectionEndPoint::CancelOperations над этим каналом, или по TCP каналу связи поступает сигнал FIN)), перегрузка 2, в зависимости от значения флага политики reading_policy_flags::get_error_code, возвращает код успешного завершения CHSVERROR_SUCCESS_CANCELLED (0x2417000f) или генерирует исключение Chusov::Exceptions::OperationCancelledException. Перегрузка 1 в таких случаях всегда генерирует это исключение.

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

is.read(pBuf, cbBuf);

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

is.read(pBuf, cbBuf, reading_policy<>());

В отличие от метода read метод read_as по умолчанию использует политику reading_policy_flags::force_fill_buffer.

Пример: Чтение из потока с заполнением буфера полностью и с использованием сигнализации об ошибках чтения с помощью кода завершения.
#include <tuple>
#include <cstdint>
#include <camaas/istream.h>

std::uint32_t read_dword(CAMaaS::InputByteStreamRef is)
{
    std::uint32_t result;
    return_code_t err;
    std::tie(err, std::ignore) = is.read(&result, sizeof(result), reading_policy<
        reading_policy_flags::force_fill_buffer, reading_policy_flags::get_error_code>());
    if (ChsvFailed(err))
        return std::uint32_t(-1);
    return result;
}