InputByteStreamRef::read as: различия между версиями
Строка 1: | Строка 1: | ||
{{function_begin|template <class | {{function_begin|template <class PODType> | ||
PODType read_as() const; //1 | |||
template <class | template <class PODType, class ReadingPolicy> | ||
/*см. ниже*/ read_as(ReadingPolicy) const; //2 | |||
template <class ContainerType> | |||
ContainerType read_as(std::size_t cbHowMany); //3 | |||
template <class ContainerType, class ReadingPolicy> | |||
/*см. ниже*/ read_as(std::size_t cbHowMany, ReadingPolicy); //4 | |||
|{{InputByteStreamRef::read_as brief}} | |{{InputByteStreamRef::read_as brief}} | ||
# Считывает объект [http://en.cppreference.com/w/cpp/concept/PODType POD] типа. | # Считывает объект [http://en.cppreference.com/w/cpp/concept/PODType POD] типа. | ||
# Считывает данные в контейнер байт. Контейнер должен удовлетворять требованиям [http://en.cppreference.com/w/cpp/concept/SequenceContainer SequenceContainer].}} | # Аналогично, но поведение метода кастомизируется политикой чтения. | ||
# Считывает данные в контейнер байт. Контейнер должен удовлетворять требованиям [http://en.cppreference.com/w/cpp/concept/SequenceContainer SequenceContainer]. | |||
# Аналогично, но поведение метода кастомизируется политикой чтения.}} | |||
{{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|cbHowMany|Количество байт, которые необходимо считать из потока.}} | {{function_paramlist_add|cbHowMany|Количество байт, которые необходимо считать из потока в контейнер байт перегрузками 3 и 4.}} | ||
{{function_paramlist_end}} | {{function_paramlist_end}} | ||
{{function return_value| | {{function return_value|Перегрузки 1 и 3 возвращают считанный объект напрямую. Значение, возвращаемое перегрузками 2 и 4, зависит от политики <tt>ReadingPolicy</tt>. Если флаг <source lang="cpp" inline>reading_policy_flags::get_error_code</source> не устанавливается политикой, считанный объект возвращается напрямую аналогично перегрузкам 1 и 3. | ||
В противном случае возвращается пара [https://en.cppreference.com/w/cpp/utility/pair std::pair] значений <source lang="cpp" inline>std::pair<return_code_t, T></source>, где <tt>T</tt> эквивалентен типу <tt>PODType</tt>, если используется перегрузка 2, и типу <tt>ContainerType</tt>, если используется перегрузка 4. То есть возвращаемая пара содержит код завершения чтения в качестве первого элемента пары, считанный объект - в качестве второго.}} | |||
{{function_sa_begin}} | |||
{{function_sa_add|[[IInputByteStream::ReadArray]]}} | |||
{{function_sa_add|[[InputByteStreamRef::read]]}} | |||
{{function_sa_add|[[InputByteStreamRef::read_all_as]]}} | |||
{{function_sa_end}} | |||
{{function_end}} | {{function_end}} | ||
Если чтение блокирует вызывающий поток выполнения, и эта блокировка прерывается нормальным образом (например, когда поток осуществляет чтение из интернет канала, и другой поток вызывает метод [[IInternetConnectionEndPoint::CancelOperations]] над этим каналом, или по TCP каналу связи поступает сигнал <tt>[https://tools.ietf.org/html/rfc793#page-15 FIN])</tt>), перегрузки 2 и 4, в зависимости от значения флага политики <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 и 3 в таких случаях всегда генерируют это исключение. | |||
Пусть <tt>is</tt> - объект класса [[InputByteStreamRef]]. Тогда вызов перегрузки 1 | |||
<source lang="cpp"> | |||
is.read_as<T>(); | |||
</source> | |||
эквивалентен вызову перегрузки 2 следующим образом. | |||
<source lang="cpp"> | |||
is.read_as<T>(reading_policy<reading_policy_flags::force_fill_buffer>()); | |||
</source> | |||
Аналогично вызов перегрузки 3 | |||
<source lang="cpp"> | |||
is.read_as<Container<T>>(N); | |||
</source> | |||
эквивалентен вызову перегрузки 4 следующим образом. | |||
<source lang="cpp"> | |||
is.read_as<Container<T>>(N, reading_policy<reading_policy_flags::force_fill_buffer>()); | |||
</source> | |||
В отличие от метода [[InputByteStreamRef::read_as|read_as]] метод [[InputByteStreamRef::read|read]] по умолчанию не использует политики <source lang="cpp" inline>reading_policy_flags::force_fill_buffer</source> и не блокирует поток выполнения до тех пор пока не будет считанно <source lang="cpp" inline>sizeof(PODType)</source> (перегрузки 1-2) или <tt>cbHowMany</tt> (перегрузки 3-4) байт. | |||
Если политика <source lang="cpp" inline>reading_policy_flags::force_fill_buffer</source> отключена, возвращаемый объект может находиться в неопределенном состоянии, но оно всегда будет корректным. | |||
Пример: чтение из потока с заполнением буфера полностью и с использованием сигнализации об ошибках чтения с помощью кода завершения (C++17). | |||
<source lang="cpp"> | |||
#include <tuple> | |||
#include <cstdint> | |||
#include <camaas/istream.h> | |||
std::uint32_t read_dword(CAMaaS::InputByteStreamRef is) | |||
{ | |||
auto [err, result] = is.read_as<std::uint32_t>(reading_policy<reading_policy_flags::get_error_code>()); | |||
if (ChsvFailed(err)) | |||
return std::uint32_t(-1); | |||
return result; | |||
} | |||
</source> | |||
Пример: чтение из потока с заполнением буфера полностью и с генерацией исключений в случаях ошибок чтения. | |||
<source lang="cpp"> | |||
#include <tuple> | |||
#include <cstdint> | |||
#include <camaas/istream.h> | |||
#include <vector> | |||
auto read_vector(CAMaaS::InputByteStreamRef is, std::size_t size) | |||
{ | |||
return is.read_as<std::vector<std::uint8_t>>(size); | |||
} | |||
</source> |
Версия 14:16, 29 мая 2019
template <class PODType>
PODType read_as() const; //1
template <class PODType, class ReadingPolicy>
/*см. ниже*/ read_as(ReadingPolicy) const; //2
template <class ContainerType>
ContainerType read_as(std::size_t cbHowMany); //3
template <class ContainerType, class ReadingPolicy>
/*см. ниже*/ read_as(std::size_t cbHowMany, ReadingPolicy); //4
Осуществляет чтение данных из потока InputByteStreamRef и создание из этих данных объекта PODType или контейнера байт.
- Считывает объект POD типа.
- Аналогично, но поведение метода кастомизируется политикой чтения.
- Считывает данные в контейнер байт. Контейнер должен удовлетворять требованиям SequenceContainer.
- Аналогично, но поведение метода кастомизируется политикой чтения.
ReadingPolicy | Вычисляемый дедукцией тип политики чтения, используемой перегрузкой 2. Тип должен определять статическую константу компиляции value, содержащую битовую маску идентификаторов компонент политики. Эти идентификаторы заданы перечислением reading_policy_flags и имеют следующие значения.
|
cbHowMany | Количество байт, которые необходимо считать из потока в контейнер байт перегрузками 3 и 4. |
reading_policy_flags::get_error_code
не устанавливается политикой, считанный объект возвращается напрямую аналогично перегрузкам 1 и 3.
В противном случае возвращается пара std::pair значений std::pair<return_code_t, T>
, где T эквивалентен типу PODType, если используется перегрузка 2, и типу ContainerType, если используется перегрузка 4. То есть возвращаемая пара содержит код завершения чтения в качестве первого элемента пары, считанный объект - в качестве второго.IInputByteStream::ReadArray | |
InputByteStreamRef::read | |
InputByteStreamRef::read_all_as |
Если чтение блокирует вызывающий поток выполнения, и эта блокировка прерывается нормальным образом (например, когда поток осуществляет чтение из интернет канала, и другой поток вызывает метод IInternetConnectionEndPoint::CancelOperations над этим каналом, или по TCP каналу связи поступает сигнал FIN)), перегрузки 2 и 4, в зависимости от значения флага политики reading_policy_flags::get_error_code
, возвращают код успешного завершения CHSVERROR_SUCCESS_CANCELLED (0x2417000f) или генерирует исключение Chusov::Exceptions::OperationCancelledException. Перегрузки 1 и 3 в таких случаях всегда генерируют это исключение.
Пусть is - объект класса InputByteStreamRef. Тогда вызов перегрузки 1
is.read_as<T>();
эквивалентен вызову перегрузки 2 следующим образом.
is.read_as<T>(reading_policy<reading_policy_flags::force_fill_buffer>());
Аналогично вызов перегрузки 3
is.read_as<Container<T>>(N);
эквивалентен вызову перегрузки 4 следующим образом.
is.read_as<Container<T>>(N, reading_policy<reading_policy_flags::force_fill_buffer>());
В отличие от метода read_as метод read по умолчанию не использует политики reading_policy_flags::force_fill_buffer
и не блокирует поток выполнения до тех пор пока не будет считанно sizeof(PODType)
(перегрузки 1-2) или cbHowMany (перегрузки 3-4) байт.
Если политика reading_policy_flags::force_fill_buffer
отключена, возвращаемый объект может находиться в неопределенном состоянии, но оно всегда будет корректным.
Пример: чтение из потока с заполнением буфера полностью и с использованием сигнализации об ошибках чтения с помощью кода завершения (C++17).
#include <tuple>
#include <cstdint>
#include <camaas/istream.h>
std::uint32_t read_dword(CAMaaS::InputByteStreamRef is)
{
auto [err, result] = is.read_as<std::uint32_t>(reading_policy<reading_policy_flags::get_error_code>());
if (ChsvFailed(err))
return std::uint32_t(-1);
return result;
}
Пример: чтение из потока с заполнением буфера полностью и с генерацией исключений в случаях ошибок чтения.
#include <tuple>
#include <cstdint>
#include <camaas/istream.h>
#include <vector>
auto read_vector(CAMaaS::InputByteStreamRef is, std::size_t size)
{
return is.read_as<std::vector<std::uint8_t>>(size);
}