diff options
author | orivej <orivej@yandex-team.ru> | 2022-02-10 16:44:49 +0300 |
---|---|---|
committer | Daniil Cherednik <dcherednik@yandex-team.ru> | 2022-02-10 16:44:49 +0300 |
commit | 718c552901d703c502ccbefdfc3c9028d608b947 (patch) | |
tree | 46534a98bbefcd7b1f3faa5b52c138ab27db75b7 /contrib/libs/poco/Foundation/include/Poco/BinaryReader.h | |
parent | e9656aae26e0358d5378e5b63dcac5c8dbe0e4d0 (diff) | |
download | ydb-718c552901d703c502ccbefdfc3c9028d608b947.tar.gz |
Restoring authorship annotation for <orivej@yandex-team.ru>. Commit 1 of 2.
Diffstat (limited to 'contrib/libs/poco/Foundation/include/Poco/BinaryReader.h')
-rw-r--r-- | contrib/libs/poco/Foundation/include/Poco/BinaryReader.h | 530 |
1 files changed, 265 insertions, 265 deletions
diff --git a/contrib/libs/poco/Foundation/include/Poco/BinaryReader.h b/contrib/libs/poco/Foundation/include/Poco/BinaryReader.h index b4d0fb1d82..3897d84b29 100644 --- a/contrib/libs/poco/Foundation/include/Poco/BinaryReader.h +++ b/contrib/libs/poco/Foundation/include/Poco/BinaryReader.h @@ -1,265 +1,265 @@ -// -// BinaryReader.h -// -// Library: Foundation -// Package: Streams -// Module: BinaryReaderWriter -// -// Definition of the BinaryReader class. -// -// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. -// and Contributors. -// -// SPDX-License-Identifier: BSL-1.0 -// - - -#ifndef Foundation_BinaryReader_INCLUDED -#define Foundation_BinaryReader_INCLUDED - - -#include "Poco/Foundation.h" -#include "Poco/Buffer.h" -#include "Poco/MemoryStream.h" -#include <vector> -#include <istream> - - -namespace Poco { - - -class TextEncoding; -class TextConverter; - - -class Foundation_API BinaryReader - /// This class reads basic types (and std::vectors thereof) - /// in binary form into an input stream. - /// It provides an extractor-based interface similar to istream. - /// The reader also supports automatic conversion from big-endian - /// (network byte order) to little-endian and vice-versa. - /// Use a BinaryWriter to create a stream suitable for a BinaryReader. -{ -public: - enum StreamByteOrder - { - NATIVE_BYTE_ORDER = 1, /// the host's native byte-order - BIG_ENDIAN_BYTE_ORDER = 2, /// big-endian (network) byte-order - NETWORK_BYTE_ORDER = 2, /// big-endian (network) byte-order - LITTLE_ENDIAN_BYTE_ORDER = 3, /// little-endian byte-order - UNSPECIFIED_BYTE_ORDER = 4 /// unknown, byte-order will be determined by reading the byte-order mark - }; - - BinaryReader(std::istream& istr, StreamByteOrder byteOrder = NATIVE_BYTE_ORDER); - /// Creates the BinaryReader. - - BinaryReader(std::istream& istr, TextEncoding& encoding, StreamByteOrder byteOrder = NATIVE_BYTE_ORDER); - /// Creates the BinaryReader using the given TextEncoding. - /// - /// Strings will be converted from the specified encoding - /// to the currently set global encoding (see Poco::TextEncoding::global()). - - ~BinaryReader(); - /// Destroys the BinaryReader. - - BinaryReader& operator >> (bool& value); - BinaryReader& operator >> (char& value); - BinaryReader& operator >> (unsigned char& value); - BinaryReader& operator >> (signed char& value); - BinaryReader& operator >> (short& value); - BinaryReader& operator >> (unsigned short& value); - BinaryReader& operator >> (int& value); - BinaryReader& operator >> (unsigned int& value); - BinaryReader& operator >> (long& value); - BinaryReader& operator >> (unsigned long& value); - BinaryReader& operator >> (float& value); - BinaryReader& operator >> (double& value); - -#if defined(POCO_HAVE_INT64) && !defined(POCO_LONG_IS_64_BIT) - BinaryReader& operator >> (Int64& value); - BinaryReader& operator >> (UInt64& value); -#endif - - BinaryReader& operator >> (std::string& value); - - template <typename T> - BinaryReader& operator >> (std::vector<T>& value) - { - Poco::UInt32 size(0); - T elem; - - *this >> size; - if (!good()) return *this; - value.reserve(size); - while (this->good() && size-- > 0) - { - *this >> elem; - value.push_back(elem); - } - return *this; - } - - void read7BitEncoded(UInt32& value); - /// Reads a 32-bit unsigned integer in compressed format. - /// See BinaryWriter::write7BitEncoded() for a description - /// of the compression algorithm. - -#if defined(POCO_HAVE_INT64) - void read7BitEncoded(UInt64& value); - /// Reads a 64-bit unsigned integer in compressed format. - /// See BinaryWriter::write7BitEncoded() for a description - /// of the compression algorithm. -#endif - - void readRaw(std::streamsize length, std::string& value); - /// Reads length bytes of raw data into value. - - void readRaw(char* buffer, std::streamsize length); - /// Reads length bytes of raw data into buffer. - - void readBOM(); - /// Reads a byte-order mark from the stream and configures - /// the reader for the encountered byte order. - /// A byte-order mark is a 16-bit integer with a value of 0xFEFF, - /// written in host byte order. - - bool good(); - /// Returns _istr.good(); - - bool fail(); - /// Returns _istr.fail(); - - bool bad(); - /// Returns _istr.bad(); - - bool eof(); - /// Returns _istr.eof(); - - std::istream& stream() const; - /// Returns the underlying stream. - - StreamByteOrder byteOrder() const; - /// Returns the byte-order used by the reader, which is - /// either BIG_ENDIAN_BYTE_ORDER or LITTLE_ENDIAN_BYTE_ORDER. - - void setExceptions(std::ios_base::iostate st = (std::istream::failbit | std::istream::badbit)); - /// Sets the stream to throw exception on specified state (default failbit and badbit); - - std::streamsize available() const; - /// Returns the number of available bytes in the stream. - -private: - std::istream& _istr; - bool _flipBytes; - TextConverter* _pTextConverter; -}; - - -template <typename T> -class BasicMemoryBinaryReader : public BinaryReader - /// A convenient wrapper for using Buffer and MemoryStream with BinaryReader. -{ -public: - BasicMemoryBinaryReader(const Buffer<T>& dataBuffer, StreamByteOrder order = NATIVE_BYTE_ORDER): - BinaryReader(_istr, order), - _data(dataBuffer), - _istr(dataBuffer.begin(), dataBuffer.capacity()) - { - } - - BasicMemoryBinaryReader(const Buffer<T>& dataBuffer, TextEncoding& encoding, StreamByteOrder order = NATIVE_BYTE_ORDER): - BinaryReader(_istr, encoding, order), - _data(dataBuffer), - _istr(dataBuffer.begin(), dataBuffer.capacity()) - { - } - - ~BasicMemoryBinaryReader() - { - } - - const Buffer<T>& data() const - { - return _data; - } - - const MemoryInputStream& stream() const - { - return _istr; - } - - MemoryInputStream& stream() - { - return _istr; - } - -private: - const Buffer<T>& _data; - MemoryInputStream _istr; -}; - - -typedef BasicMemoryBinaryReader<char> MemoryBinaryReader; - - -// -// inlines -// - - -inline bool BinaryReader::good() -{ - return _istr.good(); -} - - -inline bool BinaryReader::fail() -{ - return _istr.fail(); -} - - -inline bool BinaryReader::bad() -{ - return _istr.bad(); -} - - -inline bool BinaryReader::eof() -{ - return _istr.eof(); -} - - -inline std::istream& BinaryReader::stream() const -{ - return _istr; -} - - -inline BinaryReader::StreamByteOrder BinaryReader::byteOrder() const -{ -#if defined(POCO_ARCH_BIG_ENDIAN) - return _flipBytes ? LITTLE_ENDIAN_BYTE_ORDER : BIG_ENDIAN_BYTE_ORDER; -#else - return _flipBytes ? BIG_ENDIAN_BYTE_ORDER : LITTLE_ENDIAN_BYTE_ORDER; -#endif -} - - -inline void BinaryReader::setExceptions(std::ios_base::iostate st) -{ - _istr.exceptions(st); -} - - -inline std::streamsize BinaryReader::available() const -{ - return _istr.rdbuf()->in_avail(); -} - - -} // namespace Poco - - -#endif // Foundation_BinaryReader_INCLUDED +// +// BinaryReader.h +// +// Library: Foundation +// Package: Streams +// Module: BinaryReaderWriter +// +// Definition of the BinaryReader class. +// +// Copyright (c) 2004-2006, Applied Informatics Software Engineering GmbH. +// and Contributors. +// +// SPDX-License-Identifier: BSL-1.0 +// + + +#ifndef Foundation_BinaryReader_INCLUDED +#define Foundation_BinaryReader_INCLUDED + + +#include "Poco/Foundation.h" +#include "Poco/Buffer.h" +#include "Poco/MemoryStream.h" +#include <vector> +#include <istream> + + +namespace Poco { + + +class TextEncoding; +class TextConverter; + + +class Foundation_API BinaryReader + /// This class reads basic types (and std::vectors thereof) + /// in binary form into an input stream. + /// It provides an extractor-based interface similar to istream. + /// The reader also supports automatic conversion from big-endian + /// (network byte order) to little-endian and vice-versa. + /// Use a BinaryWriter to create a stream suitable for a BinaryReader. +{ +public: + enum StreamByteOrder + { + NATIVE_BYTE_ORDER = 1, /// the host's native byte-order + BIG_ENDIAN_BYTE_ORDER = 2, /// big-endian (network) byte-order + NETWORK_BYTE_ORDER = 2, /// big-endian (network) byte-order + LITTLE_ENDIAN_BYTE_ORDER = 3, /// little-endian byte-order + UNSPECIFIED_BYTE_ORDER = 4 /// unknown, byte-order will be determined by reading the byte-order mark + }; + + BinaryReader(std::istream& istr, StreamByteOrder byteOrder = NATIVE_BYTE_ORDER); + /// Creates the BinaryReader. + + BinaryReader(std::istream& istr, TextEncoding& encoding, StreamByteOrder byteOrder = NATIVE_BYTE_ORDER); + /// Creates the BinaryReader using the given TextEncoding. + /// + /// Strings will be converted from the specified encoding + /// to the currently set global encoding (see Poco::TextEncoding::global()). + + ~BinaryReader(); + /// Destroys the BinaryReader. + + BinaryReader& operator >> (bool& value); + BinaryReader& operator >> (char& value); + BinaryReader& operator >> (unsigned char& value); + BinaryReader& operator >> (signed char& value); + BinaryReader& operator >> (short& value); + BinaryReader& operator >> (unsigned short& value); + BinaryReader& operator >> (int& value); + BinaryReader& operator >> (unsigned int& value); + BinaryReader& operator >> (long& value); + BinaryReader& operator >> (unsigned long& value); + BinaryReader& operator >> (float& value); + BinaryReader& operator >> (double& value); + +#if defined(POCO_HAVE_INT64) && !defined(POCO_LONG_IS_64_BIT) + BinaryReader& operator >> (Int64& value); + BinaryReader& operator >> (UInt64& value); +#endif + + BinaryReader& operator >> (std::string& value); + + template <typename T> + BinaryReader& operator >> (std::vector<T>& value) + { + Poco::UInt32 size(0); + T elem; + + *this >> size; + if (!good()) return *this; + value.reserve(size); + while (this->good() && size-- > 0) + { + *this >> elem; + value.push_back(elem); + } + return *this; + } + + void read7BitEncoded(UInt32& value); + /// Reads a 32-bit unsigned integer in compressed format. + /// See BinaryWriter::write7BitEncoded() for a description + /// of the compression algorithm. + +#if defined(POCO_HAVE_INT64) + void read7BitEncoded(UInt64& value); + /// Reads a 64-bit unsigned integer in compressed format. + /// See BinaryWriter::write7BitEncoded() for a description + /// of the compression algorithm. +#endif + + void readRaw(std::streamsize length, std::string& value); + /// Reads length bytes of raw data into value. + + void readRaw(char* buffer, std::streamsize length); + /// Reads length bytes of raw data into buffer. + + void readBOM(); + /// Reads a byte-order mark from the stream and configures + /// the reader for the encountered byte order. + /// A byte-order mark is a 16-bit integer with a value of 0xFEFF, + /// written in host byte order. + + bool good(); + /// Returns _istr.good(); + + bool fail(); + /// Returns _istr.fail(); + + bool bad(); + /// Returns _istr.bad(); + + bool eof(); + /// Returns _istr.eof(); + + std::istream& stream() const; + /// Returns the underlying stream. + + StreamByteOrder byteOrder() const; + /// Returns the byte-order used by the reader, which is + /// either BIG_ENDIAN_BYTE_ORDER or LITTLE_ENDIAN_BYTE_ORDER. + + void setExceptions(std::ios_base::iostate st = (std::istream::failbit | std::istream::badbit)); + /// Sets the stream to throw exception on specified state (default failbit and badbit); + + std::streamsize available() const; + /// Returns the number of available bytes in the stream. + +private: + std::istream& _istr; + bool _flipBytes; + TextConverter* _pTextConverter; +}; + + +template <typename T> +class BasicMemoryBinaryReader : public BinaryReader + /// A convenient wrapper for using Buffer and MemoryStream with BinaryReader. +{ +public: + BasicMemoryBinaryReader(const Buffer<T>& dataBuffer, StreamByteOrder order = NATIVE_BYTE_ORDER): + BinaryReader(_istr, order), + _data(dataBuffer), + _istr(dataBuffer.begin(), dataBuffer.capacity()) + { + } + + BasicMemoryBinaryReader(const Buffer<T>& dataBuffer, TextEncoding& encoding, StreamByteOrder order = NATIVE_BYTE_ORDER): + BinaryReader(_istr, encoding, order), + _data(dataBuffer), + _istr(dataBuffer.begin(), dataBuffer.capacity()) + { + } + + ~BasicMemoryBinaryReader() + { + } + + const Buffer<T>& data() const + { + return _data; + } + + const MemoryInputStream& stream() const + { + return _istr; + } + + MemoryInputStream& stream() + { + return _istr; + } + +private: + const Buffer<T>& _data; + MemoryInputStream _istr; +}; + + +typedef BasicMemoryBinaryReader<char> MemoryBinaryReader; + + +// +// inlines +// + + +inline bool BinaryReader::good() +{ + return _istr.good(); +} + + +inline bool BinaryReader::fail() +{ + return _istr.fail(); +} + + +inline bool BinaryReader::bad() +{ + return _istr.bad(); +} + + +inline bool BinaryReader::eof() +{ + return _istr.eof(); +} + + +inline std::istream& BinaryReader::stream() const +{ + return _istr; +} + + +inline BinaryReader::StreamByteOrder BinaryReader::byteOrder() const +{ +#if defined(POCO_ARCH_BIG_ENDIAN) + return _flipBytes ? LITTLE_ENDIAN_BYTE_ORDER : BIG_ENDIAN_BYTE_ORDER; +#else + return _flipBytes ? BIG_ENDIAN_BYTE_ORDER : LITTLE_ENDIAN_BYTE_ORDER; +#endif +} + + +inline void BinaryReader::setExceptions(std::ios_base::iostate st) +{ + _istr.exceptions(st); +} + + +inline std::streamsize BinaryReader::available() const +{ + return _istr.rdbuf()->in_avail(); +} + + +} // namespace Poco + + +#endif // Foundation_BinaryReader_INCLUDED |