#pragma once #include #include #include namespace NUnifiedAgent::NPW { class TLengthDelimited; class TFieldLink { public: TFieldLink(TLengthDelimited* container, bool repeated = false, size_t keySize = 1); void SetValueSize(bool empty, size_t size); private: TLengthDelimited* Container; int OuterSize; bool Repeated; size_t KeySize; }; class TLengthDelimited { public: explicit TLengthDelimited(const TFMaybe& link = Nothing()); void IncSize(int sizeDelta); size_t ByteSizeLong() const { return static_cast(ByteSize); } private: TFMaybe Link; int ByteSize; }; using TMessage = TLengthDelimited; template class TRepeatedField: public TLengthDelimited { public: static_assert(std::is_same_v || std::is_same_v || std::is_same_v, "type is not supported"); using TLengthDelimited::TLengthDelimited; void Add(T value); }; template class TRepeatedPtrField { public: explicit TRepeatedPtrField(TMessage* message, size_t keySize = 1) : Message(message) , Children() , KeySize(keySize) { } size_t GetSize() const { return Children.size(); } T& Get(size_t index) { return Children[index]; } T& Add() { if constexpr (std::is_constructible::value) { Children.emplace_back(TFieldLink(Message, true, KeySize)); } else { Children.emplace_back(Message); } return Children.back(); } private: TMessage* Message; TDeque Children; size_t KeySize; }; template class TNumberField { public: static_assert(std::is_same_v || std::is_same_v || std::is_same_v, "type is not supported"); explicit TNumberField(const TFieldLink& link); void SetValue(T value); private: TFieldLink Link; }; template class TFixedNumberField { public: static_assert(std::is_same_v || std::is_same_v || std::is_same_v, "type is not supported"); explicit TFixedNumberField(const TFieldLink& link); void SetValue(); private: TFieldLink Link; }; class TStringField { public: explicit TStringField(const TFieldLink& link); void SetValue(const TString& value); private: TFieldLink Link; }; extern template class TNumberField; extern template class TNumberField; extern template class TNumberField; extern template class TFixedNumberField; extern template class TFixedNumberField; extern template class TFixedNumberField; extern template class TRepeatedField; extern template class TRepeatedField; extern template class TRepeatedField; }