InputByteStreamRef::read as: различия между версиями
Ninok2801 (обсуждение | вклад) (Новая страница: «{{function_begin|template <class T> auto read_as() const -> typename std::enable_if<std::is_pod<T>::value, T>::type; |{{read_as::read_as brief}} }} {{function re…») |
|||
(не показано 6 промежуточных версий этого же участника) | |||
Строка 1: | Строка 1: | ||
{{function_begin|template <class | {{DISPLAYTITLE:InputByteStreamRef::read_as}} | ||
{{function_begin|template <class PODType> | |||
|{{ | PODType read_as(); //1 | ||
{{function return_value|.}} | template <class PODType, class ReadingPolicy> | ||
/*см. ниже*/ read_as(ReadingPolicy); //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}} | |||
# Считывает объект [http://en.cppreference.com/w/cpp/concept/PODType POD] типа. | |||
# Аналогично, но поведение метода кастомизируется политикой чтения. | |||
# Считывает данные в контейнер байт. Контейнер должен удовлетворять требованиям [http://en.cppreference.com/w/cpp/concept/SequenceContainer SequenceContainer]. | |||
# Аналогично, но поведение метода кастомизируется политикой чтения.}} | |||
{{function template paramlist begin}} | |||
{{function template paramlist add|PODType|Тип возвращаемого перегрузками 1 и 2 объекта, данные которого считываются из потока [[InputByteStreamRef]]. Тип должен удовлетворять требованиям {{cpp_concept|PODType}}.}} | |||
{{function template paramlist add|ContainerType|Тип возвращаемого перегрузками 3 и 4 контейнера байт с содержимым, считанным из потока. Контейнер должен удовлетворять требованиям {{cpp_concept|SequenceContainer}}, а тип его элемента должен соответствовать байту.}} | |||
{{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_add|cbHowMany|Количество байт, которые необходимо считать из потока в контейнер байт перегрузками 3 и 4.}} | |||
{{function_paramlist_end}} | |||
{{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>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> |
Текущая версия на 13:43, 30 мая 2019
template <class PODType>
PODType read_as(); //1
template <class PODType, class ReadingPolicy>
/*см. ниже*/ read_as(ReadingPolicy); //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.
- Аналогично, но поведение метода кастомизируется политикой чтения.
PODType | Тип возвращаемого перегрузками 1 и 2 объекта, данные которого считываются из потока InputByteStreamRef. Тип должен удовлетворять требованиям PODType. | |||||||||
ContainerType | Тип возвращаемого перегрузками 3 и 4 контейнера байт с содержимым, считанным из потока. Контейнер должен удовлетворять требованиям 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
и не блокирует поток выполнения.
Если политика 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);
}