InputByteStreamRef::read as: различия между версиями
(не показаны 3 промежуточные версии этого же участника) | |||
Строка 1: | Строка 1: | ||
{{DISPLAYTITLE:InputByteStreamRef::read_as}} | |||
{{function_begin|template <class PODType> | {{function_begin|template <class PODType> | ||
PODType read_as(); //1 | |||
template <class PODType, class ReadingPolicy> | template <class PODType, class ReadingPolicy> | ||
/*см. ниже*/ read_as(ReadingPolicy); //2 | |||
template <class ContainerType> | template <class ContainerType> | ||
ContainerType read_as(std::size_t cbHowMany); //3 | |||
template <class ContainerType, class ReadingPolicy> | 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] типа. | ||
Строка 13: | Строка 14: | ||
# Аналогично, но поведение метода кастомизируется политикой чтения.}} | # Аналогично, но поведение метода кастомизируется политикой чтения.}} | ||
{{function template paramlist begin}} | {{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]] и имеют следующие значения. | {{function template paramlist add|ReadingPolicy|Вычисляемый дедукцией тип политики чтения, используемой перегрузкой 2. Тип должен определять статическую константу компиляции <tt>value</tt>, содержащую битовую маску идентификаторов компонент политики. Эти идентификаторы заданы перечислением [[reading_policy_flags]] и имеют следующие значения. | ||
{{reading_policy_flags}} | {{reading_policy_flags}} | ||
Строка 51: | Строка 54: | ||
</source> | </source> | ||
В отличие от метода [[InputByteStreamRef::read_as|read_as]] метод [[InputByteStreamRef::read|read]] по умолчанию не использует политики <source lang="cpp" inline>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> отключена, возвращаемый объект может находиться в неопределенном состоянии, но оно всегда будет корректным. | Если политика <source lang="cpp" inline>reading_policy_flags::force_fill_buffer</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);
}