diff options
author | Daniil Cherednik <dan.cherednik@gmail.com> | 2023-03-31 10:54:08 +0300 |
---|---|---|
committer | Daniil Cherednik <dan.cherednik@gmail.com> | 2023-03-31 12:28:07 +0300 |
commit | fc1cffcfa7f0497a1f97b384a24bcbf23362f3be (patch) | |
tree | c15f7ab5b9e9b20fd0ef8fc07d598d28e8b32004 /library/cpp/unified_agent_client/proto_weighing.cpp | |
parent | 8a749596d40e91c896a1907afcd108d9221fbde1 (diff) | |
download | ydb-fc1cffcfa7f0497a1f97b384a24bcbf23362f3be.tar.gz |
Ydb stable 23-1-1923.1.19
x-stable-origin-commit: c5d5a396e89d0a72e0267a55e93d8404d4fb54fe
Diffstat (limited to 'library/cpp/unified_agent_client/proto_weighing.cpp')
-rw-r--r-- | library/cpp/unified_agent_client/proto_weighing.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/library/cpp/unified_agent_client/proto_weighing.cpp b/library/cpp/unified_agent_client/proto_weighing.cpp new file mode 100644 index 0000000000..7a532213ea --- /dev/null +++ b/library/cpp/unified_agent_client/proto_weighing.cpp @@ -0,0 +1,99 @@ +#include "proto_weighing.h" + +#include <google/protobuf/io/coded_stream.h> + +namespace NUnifiedAgent::NPW { + template <typename T> + inline size_t SizeOf(T value); + + using CodedOutputStream = google::protobuf::io::CodedOutputStream; + + template <> + inline size_t SizeOf(ui64 value) { + return CodedOutputStream::VarintSize64(value); + } + + template <> + inline size_t SizeOf(ui32 value) { + return CodedOutputStream::VarintSize32(value); + } + + template <> + inline size_t SizeOf(i64 value) { + return CodedOutputStream::VarintSize64(static_cast<google::protobuf::uint64>(value)); + } + + TFieldLink::TFieldLink(TLengthDelimited* container, bool repeated, size_t keySize) + : Container(container) + , OuterSize(0) + , Repeated(repeated) + , KeySize(keySize) + { + } + + void TFieldLink::SetValueSize(bool empty, size_t size) { + const auto newOuterSize = empty && !Repeated ? 0 : KeySize + static_cast<int>(size); + Container->IncSize(newOuterSize - OuterSize); + OuterSize = newOuterSize; + } + + TLengthDelimited::TLengthDelimited(const TFMaybe<TFieldLink>& link) + : Link(link) + , ByteSize(0) + { + } + + void TLengthDelimited::IncSize(int sizeDelta) { + ByteSize += sizeDelta; + if (Link) { + const auto byteSize = static_cast<ui32>(ByteSize); + Link->SetValueSize(false, byteSize + SizeOf(byteSize)); + } + } + + template <typename T> + void TRepeatedField<T>::Add(T value) { + IncSize(static_cast<int>(SizeOf(value))); + } + + template <typename T> + TNumberField<T>::TNumberField(const TFieldLink& link) + : Link(link) + { + } + + template <typename T> + void TNumberField<T>::SetValue(T value) { + Link.SetValueSize(value == 0, SizeOf(value)); + } + + template <typename T> + TFixedNumberField<T>::TFixedNumberField(const TFieldLink& link) + : Link(link) + { + } + + template <typename T> + void TFixedNumberField<T>::SetValue() { + Link.SetValueSize(false, sizeof(T)); + } + + TStringField::TStringField(const TFieldLink& link) + : Link(link) + { + } + + void TStringField::SetValue(const TString& value) { + Link.SetValueSize(value.Empty(), value.Size() + SizeOf(static_cast<ui32>(value.Size()))); + } + + template class TNumberField<ui64>; + template class TNumberField<ui32>; + template class TNumberField<i64>; + template class TFixedNumberField<ui64>; + template class TFixedNumberField<ui32>; + template class TFixedNumberField<i64>; + template class TRepeatedField<ui64>; + template class TRepeatedField<ui32>; + template class TRepeatedField<i64>; +} |