aboutsummaryrefslogtreecommitdiffstats
path: root/library/cpp/yt/string/format.h
diff options
context:
space:
mode:
authorngc224 <ngc224@yandex-team.com>2025-01-14 11:24:26 +0300
committerngc224 <ngc224@yandex-team.com>2025-01-14 12:04:33 +0300
commitc84f9bf19d66e2e3d96a52f6f2181676ebca8a52 (patch)
tree56f350523be0552bebd86c273d9b455ee85d3720 /library/cpp/yt/string/format.h
parent8e2a62c296736bedbbabeeb8152488d17d6452a1 (diff)
downloadydb-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.h59
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
{