diff options
Diffstat (limited to 'library/cpp/yt/string/string.cpp')
| -rw-r--r-- | library/cpp/yt/string/string.cpp | 25 |
1 files changed, 25 insertions, 0 deletions
diff --git a/library/cpp/yt/string/string.cpp b/library/cpp/yt/string/string.cpp index d155da578e4..de9f41a5084 100644 --- a/library/cpp/yt/string/string.cpp +++ b/library/cpp/yt/string/string.cpp @@ -362,6 +362,31 @@ std::string TruncateString(std::string string, int lengthLimit, TStringBuf trunc return string; } +TTruncatedStringView::TTruncatedStringView(const std::string& value, int limit) + : Value_(value) + , Limit_(limit) +{ } + +void TTruncatedStringView::WriteToBuilder(TStringBuilderBase* builder, TStringBuf /* spec */) const +{ + int valueSize = std::ssize(Value_); + int maxSize = Limit_ + std::ssize(DefaultTruncatedMessage); + if (valueSize <= maxSize) { + builder->AppendString(Value_); + return; + } + + char* begin = builder->Preallocate(maxSize); + memcpy(begin, Value_.data(), Limit_); + memcpy(begin + Limit_, DefaultTruncatedMessage.data(), DefaultTruncatedMessage.size()); + builder->Advance(maxSize); +} + +void FormatValue(TStringBuilderBase* builder, TTruncatedStringView value, TStringBuf spec) +{ + value.WriteToBuilder(builder, spec); +} + //////////////////////////////////////////////////////////////////////////////// } // namespace NYT |
