diff options
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 5e5a76db9d8..d15127fae05 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 { |
