#pragma once #include #include #include namespace NKikimr { namespace NMiniKQL { class TPresortCodec { public: TPresortCodec() = default; struct TTypeInfo { NUdf::EDataSlot Slot; bool IsOptional; bool IsDesc; }; void AddType(NUdf::EDataSlot slot, bool isOptional = false, bool isDesc = false); protected: size_t Current = 0; TVector Types; }; class TPresortEncoder : public TPresortCodec { public: TPresortEncoder() = default; void Start(); void Start(TStringBuf prefix); void Encode(const NUdf::TUnboxedValuePod& value); TStringBuf Finish(); // user must copy private: TVector Output; }; class TPresortDecoder : public TPresortCodec { public: TPresortDecoder() = default; void Start(TStringBuf input); NUdf::TUnboxedValue Decode(); void Finish(); private: TVector Buffer; TStringBuf Input; }; class THolderFactory; class TGenericPresortEncoder { public: TGenericPresortEncoder(TType* type); TStringBuf Encode(const NUdf::TUnboxedValue& value, bool desc); // user must copy NUdf::TUnboxedValue Decode(TStringBuf buf, bool desc, const THolderFactory& factory); private: TType* Type; TVector Output; TVector Buffer; }; } // NMiniKQL } // NKikimr