123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288 |
- #pragma once
- #include "public.h"
- #include "zerocopy_output_writer.h"
- #include <util/generic/buffer.h>
- #include <util/generic/yexception.h>
- #include <util/stream/input.h>
- #include <util/stream/output.h>
- namespace NSkiff {
- ////////////////////////////////////////////////////////////////////////////////
- class TSkiffException
- : public yexception
- { };
- ////////////////////////////////////////////////////////////////////////////////
- template <typename T>
- constexpr T EndOfSequenceTag()
- {
- static_assert(std::is_integral<T>::value && std::is_unsigned<T>::value, "T must be unsigned integer");
- return T(-1);
- }
- ////////////////////////////////////////////////////////////////////////////////
- struct TInt128
- {
- ui64 Low = 0;
- i64 High = 0;
- };
- struct TUint128
- {
- ui64 Low = 0;
- ui64 High = 0;
- };
- bool operator==(TInt128 lhs, TInt128 rhs);
- bool operator!=(TInt128 lhs, TInt128 rhs);
- bool operator==(TUint128 lhs, TUint128 rhs);
- bool operator!=(TUint128 lhs, TUint128 rhs);
- ////////////////////////////////////////////////////////////////////////////////
- struct TInt256
- {
- std::array<ui64, 4> Parts;
- };
- struct TUint256
- {
- std::array<ui64, 4> Parts;
- };
- // Operator != is synthesized since C++ 20.
- bool operator==(const TInt256& lhs, const TInt256& rhs);
- bool operator==(const TUint256& lhs, const TUint256& rhs);
- ////////////////////////////////////////////////////////////////////////////////
- class TUncheckedSkiffParser
- {
- public:
- explicit TUncheckedSkiffParser(IZeroCopyInput* stream);
- TUncheckedSkiffParser(const std::shared_ptr<TSkiffSchema>& schema, IZeroCopyInput* stream);
- i8 ParseInt8();
- i16 ParseInt16();
- i32 ParseInt32();
- i64 ParseInt64();
- ui8 ParseUint8();
- ui16 ParseUint16();
- ui32 ParseUint32();
- ui64 ParseUint64();
- TInt128 ParseInt128();
- TUint128 ParseUint128();
- TInt256 ParseInt256();
- TUint256 ParseUint256();
- double ParseDouble();
- bool ParseBoolean();
- TStringBuf ParseString32();
- TStringBuf ParseYson32();
- ui8 ParseVariant8Tag();
- ui16 ParseVariant16Tag();
- bool HasMoreData();
- void ValidateFinished();
- ui64 GetReadBytesCount() const;
- private:
- const void* GetData(size_t size);
- const void* GetDataViaBuffer(size_t size);
- size_t RemainingBytes() const;
- void Advance(size_t size);
- void RefillBuffer();
- template <typename T>
- T ParseSimple();
- private:
- IZeroCopyInput* const Underlying_;
- TBuffer Buffer_;
- ui64 ReadBytesCount_ = 0;
- char* Position_ = nullptr;
- char* End_ = nullptr;
- bool Exhausted_ = false;
- };
- ////////////////////////////////////////////////////////////////////////////////
- class TCheckedSkiffParser
- {
- public:
- TCheckedSkiffParser(const std::shared_ptr<TSkiffSchema>& schema, IZeroCopyInput* stream);
- ~TCheckedSkiffParser();
- i8 ParseInt8();
- i16 ParseInt16();
- i32 ParseInt32();
- i64 ParseInt64();
- ui8 ParseUint8();
- ui16 ParseUint16();
- ui32 ParseUint32();
- ui64 ParseUint64();
- TInt128 ParseInt128();
- TUint128 ParseUint128();
- TInt256 ParseInt256();
- TUint256 ParseUint256();
- double ParseDouble();
- bool ParseBoolean();
- TStringBuf ParseString32();
- TStringBuf ParseYson32();
- ui8 ParseVariant8Tag();
- ui16 ParseVariant16Tag();
- bool HasMoreData();
- void ValidateFinished();
- ui64 GetReadBytesCount() const;
- private:
- TUncheckedSkiffParser Parser_;
- std::unique_ptr<TSkiffValidator> Validator_;
- };
- ////////////////////////////////////////////////////////////////////
- class TUncheckedSkiffWriter
- {
- public:
- explicit TUncheckedSkiffWriter(IZeroCopyOutput* underlying);
- explicit TUncheckedSkiffWriter(IOutputStream* underlying);
- TUncheckedSkiffWriter(const std::shared_ptr<TSkiffSchema>& schema, IZeroCopyOutput* underlying);
- TUncheckedSkiffWriter(const std::shared_ptr<TSkiffSchema>& schema, IOutputStream* underlying);
- ~TUncheckedSkiffWriter();
- void WriteDouble(double value);
- void WriteBoolean(bool value);
- void WriteInt8(i8 value);
- void WriteInt16(i16 value);
- void WriteInt32(i32 value);
- void WriteInt64(i64 value);
- void WriteUint8(ui8 value);
- void WriteUint16(ui16 value);
- void WriteUint32(ui32 value);
- void WriteUint64(ui64 value);
- void WriteInt128(TInt128 value);
- void WriteUint128(TUint128 value);
- void WriteInt256(const TInt256& value);
- void WriteUint256(const TUint256& value);
- void WriteString32(TStringBuf value);
- void WriteYson32(TStringBuf value);
- void WriteVariant8Tag(ui8 tag);
- void WriteVariant16Tag(ui16 tag);
- void Flush();
- void Finish();
- private:
- template <typename T>
- void WriteSimple(T data);
- private:
- THolder<TBufferedOutput> BufferedOutput_;
- TZeroCopyOutputStreamWriter Underlying_;
- };
- ////////////////////////////////////////////////////////////////////////////////
- class TCheckedSkiffWriter
- {
- public:
- TCheckedSkiffWriter(const std::shared_ptr<TSkiffSchema>& schema, IZeroCopyOutput* underlying);
- TCheckedSkiffWriter(const std::shared_ptr<TSkiffSchema>& schema, IOutputStream* underlying);
- ~TCheckedSkiffWriter();
- void WriteInt8(i8 value);
- void WriteInt16(i16 value);
- void WriteInt32(i32 value);
- void WriteInt64(i64 value);
- void WriteUint8(ui8 value);
- void WriteUint16(ui16 value);
- void WriteUint32(ui32 value);
- void WriteUint64(ui64 value);
- void WriteDouble(double value);
- void WriteBoolean(bool value);
- void WriteInt128(TInt128 value);
- void WriteUint128(TUint128 value);
- void WriteInt256(TInt256 value);
- void WriteUint256(TUint256 value);
- void WriteString32(TStringBuf value);
- void WriteYson32(TStringBuf value);
- void WriteVariant8Tag(ui8 tag);
- void WriteVariant16Tag(ui16 tag);
- void Flush();
- void Finish();
- private:
- TUncheckedSkiffWriter Writer_;
- std::unique_ptr<TSkiffValidator> Validator_;
- };
- ////////////////////////////////////////////////////////////////////////////////
- template <EWireType wireType>
- class TUnderlyingIntegerType {
- private:
- TUnderlyingIntegerType() = default;
- static constexpr auto F();
- public:
- using TValue = decltype(TUnderlyingIntegerType::F());
- };
- ////////////////////////////////////////////////////////////////////////////////
- } // namespace NSkiff
- #define SKIFF_H
- #include "skiff-inl.h"
- #undef SKIFF_H
|