123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- #ifndef STRING_INL_H_
- #error "Direct inclusion of this file is not allowed, include string.h"
- // For the sake of sane code completion.
- #include "string.h"
- #endif
- #include "string_builder.h"
- namespace NYT {
- ////////////////////////////////////////////////////////////////////////////////
- //! Joins a range of items into a string intermixing them with the delimiter.
- /*!
- * \param builder String builder where the output goes.
- * \param begin Iterator pointing to the first item (inclusive).
- * \param end Iterator pointing to the last item (not inclusive).
- * \param formatter Formatter to apply to the items.
- * \param delimiter A delimiter to be inserted between items: ", " by default.
- * \return The resulting combined string.
- */
- template <std::forward_iterator TIterator, class TFormatter>
- void JoinToString(
- TStringBuilderBase* builder,
- const TIterator& begin,
- const TIterator& end,
- const TFormatter& formatter,
- TStringBuf delimiter)
- {
- for (auto current = begin; current != end; ++current) {
- if (current != begin) {
- builder->AppendString(delimiter);
- }
- formatter(builder, *current);
- }
- }
- template <std::forward_iterator TIterator, class TFormatter>
- TString JoinToString(
- const TIterator& begin,
- const TIterator& end,
- const TFormatter& formatter,
- TStringBuf delimiter)
- {
- TStringBuilder builder;
- JoinToString(&builder, begin, end, formatter, delimiter);
- return builder.Flush();
- }
- //! A handy shortcut with default formatter.
- template <std::forward_iterator TIterator>
- TString JoinToString(
- const TIterator& begin,
- const TIterator& end,
- TStringBuf delimiter)
- {
- return JoinToString(begin, end, TDefaultFormatter(), delimiter);
- }
- //! Joins a collection of given items into a string intermixing them with the delimiter.
- /*!
- * \param collection A collection containing the items to be joined.
- * \param formatter Formatter to apply to the items.
- * \param delimiter A delimiter to be inserted between items; ", " by default.
- */
- template <std::ranges::range TCollection, class TFormatter>
- TString JoinToString(
- TCollection&& collection,
- const TFormatter& formatter,
- TStringBuf delimiter)
- {
- using std::begin;
- using std::end;
- return JoinToString(begin(collection), end(collection), formatter, delimiter);
- }
- //! A handy shortcut with the default formatter.
- template <std::ranges::range TCollection>
- TString JoinToString(
- TCollection&& collection,
- TStringBuf delimiter)
- {
- return JoinToString(std::forward<TCollection>(collection), TDefaultFormatter(), delimiter);
- }
- //! Concatenates a bunch of TStringBuf-like instances into TString.
- template <class... Ts>
- TString ConcatToString(Ts... args)
- {
- size_t length = 0;
- ((length += args.length()), ...);
- TString result;
- result.reserve(length);
- (result.append(args), ...);
- return result;
- }
- //! Converts a range of items into strings.
- template <std::forward_iterator TIter, class TFormatter>
- std::vector<TString> ConvertToStrings(
- const TIter& begin,
- const TIter& end,
- const TFormatter& formatter,
- size_t maxSize)
- {
- std::vector<TString> result;
- for (auto it = begin; it != end; ++it) {
- TStringBuilder builder;
- formatter(&builder, *it);
- result.push_back(builder.Flush());
- if (result.size() == maxSize) {
- break;
- }
- }
- return result;
- }
- //! A handy shortcut with the default formatter.
- template <std::forward_iterator TIter>
- std::vector<TString> ConvertToStrings(
- const TIter& begin,
- const TIter& end,
- size_t maxSize)
- {
- return ConvertToStrings(begin, end, TDefaultFormatter(), maxSize);
- }
- //! Converts a given collection of items into strings.
- /*!
- * \param collection A collection containing the items to be converted.
- * \param formatter Formatter to apply to the items.
- * \param maxSize Size limit for the resulting vector.
- */
- template <std::ranges::range TCollection, class TFormatter>
- std::vector<TString> ConvertToStrings(
- TCollection&& collection,
- const TFormatter& formatter,
- size_t maxSize)
- {
- using std::begin;
- using std::end;
- return ConvertToStrings(begin(collection), end(collection), formatter, maxSize);
- }
- //! A handy shortcut with default formatter.
- template <std::ranges::range TCollection>
- std::vector<TString> ConvertToStrings(
- TCollection&& collection,
- size_t maxSize)
- {
- return ConvertToStrings(std::forward<TCollection>(collection), TDefaultFormatter(), maxSize);
- }
- ////////////////////////////////////////////////////////////////////////////////
- } // namespace NYT
|