diff options
author | ngc224 <ngc224@yandex-team.com> | 2025-01-14 11:24:26 +0300 |
---|---|---|
committer | ngc224 <ngc224@yandex-team.com> | 2025-01-14 12:04:33 +0300 |
commit | c84f9bf19d66e2e3d96a52f6f2181676ebca8a52 (patch) | |
tree | 56f350523be0552bebd86c273d9b455ee85d3720 /library/cpp/yt/string/format.h | |
parent | 8e2a62c296736bedbbabeeb8152488d17d6452a1 (diff) | |
download | ydb-c84f9bf19d66e2e3d96a52f6f2181676ebca8a52.tar.gz |
Squeeze contiguous sequences of blocks in logging
commit_hash:5dda6f5ef324f03c99af3dae32ebf4a059f02bd3
Diffstat (limited to 'library/cpp/yt/string/format.h')
-rw-r--r-- | library/cpp/yt/string/format.h | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/library/cpp/yt/string/format.h b/library/cpp/yt/string/format.h index 5e5a76db9d..d15127fae0 100644 --- a/library/cpp/yt/string/format.h +++ b/library/cpp/yt/string/format.h @@ -5,6 +5,8 @@ #include <util/generic/string.h> +#include <iterator> + namespace NYT { //////////////////////////////////////////////////////////////////////////////// @@ -101,6 +103,63 @@ TFormattableView<TRange, TFormatter> MakeShrunkFormattableView( //////////////////////////////////////////////////////////////////////////////// +template <class TRange, class TValueGetter, class TIntervalFormatter> +struct TCompactIntervalView +{ + using TBegin = std::decay_t<decltype(std::declval<const TRange>().begin())>; + using TEnd = std::decay_t<decltype(std::declval<const TRange>().end())>; + + TBegin RangeBegin; + TEnd RangeEnd; + + TValueGetter ValueGetter; + TIntervalFormatter IntervalFormatter; + + TBegin begin() const; + TEnd end() const; +}; + +template <class TRange> +struct TDefaultValueGetter +{ + using TIterator = std::decay_t<decltype(std::declval<const TRange>().begin())>; + + auto operator()(const TIterator& iterator) const + -> typename std::iterator_traits<TIterator>::value_type; +}; + +template <class TRange, class TValueGetter> +struct TDefaultIntervalFormatter +{ + using TIterator = std::decay_t<decltype(std::declval<const TRange>().begin())>; + + void operator()( + TStringBuilderBase* builder, + const TIterator& first, + const TIterator& last, + const TValueGetter& valueGetter, + bool firstInterval) const; +}; + +//////////////////////////////////////////////////////////////////////////////// + +//! Writes a given integral #range as a sequence of intervals. +//! Example: +// MakeCompactIntervalView(std::vector {1, 2, 3, 5, 7, 8}) +// => [1-3,5,7-8] + +template < + class TRange, + class TValueGetter = TDefaultValueGetter<TRange>, + class TIntervalFormatter = TDefaultIntervalFormatter<TRange, TValueGetter> +> +TCompactIntervalView<TRange, TValueGetter, TIntervalFormatter> MakeCompactIntervalView( + const TRange& range, + TValueGetter&& valueGetter = {}, + TIntervalFormatter&& intervalFormatter = {}); + +//////////////////////////////////////////////////////////////////////////////// + template <class TFormatter> struct TFormatterWrapper { |