#pragma once #include "string_builder.h" #include #include #include #include #include #include #include namespace NYT { //////////////////////////////////////////////////////////////////////////////// //! Formatters enable customizable way to turn an object into a string. //! This default implementation uses |FormatValue|. struct TDefaultFormatter { template void operator()(TStringBuilderBase* builder, const T& obj) const { FormatValue(builder, obj, TStringBuf("v")); } }; static constexpr TStringBuf DefaultJoinToStringDelimiter = ", "; static constexpr TStringBuf DefaultKeyValueDelimiter = ": "; static constexpr TStringBuf DefaultRangeEllipsisFormat = "..."; // ASCII characters from 0x20 = ' ' to 0x7e = '~' are printable. static constexpr char PrintableASCIILow = 0x20; static constexpr char PrintableASCIIHigh = 0x7e; static constexpr TStringBuf IntToHexLowercase = "0123456789abcdef"; static constexpr TStringBuf IntToHexUppercase = "0123456789ABCDEF"; //! 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 void JoinToString( TStringBuilderBase* builder, const TIterator& begin, const TIterator& end, const TFormatter& formatter, TStringBuf delimiter = DefaultJoinToStringDelimiter) { for (auto current = begin; current != end; ++current) { if (current != begin) { builder->AppendString(delimiter); } formatter(builder, *current); } } template TString JoinToString( const TIterator& begin, const TIterator& end, const TFormatter& formatter, TStringBuf delimiter = DefaultJoinToStringDelimiter) { TStringBuilder builder; JoinToString(&builder, begin, end, formatter, delimiter); return builder.Flush(); } //! A handy shortcut with default formatter. template TString JoinToString( const TIterator& begin, const TIterator& end, TStringBuf delimiter = DefaultJoinToStringDelimiter) { 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 TString JoinToString( const TCollection& collection, const TFormatter& formatter, TStringBuf delimiter = DefaultJoinToStringDelimiter) { using std::begin; using std::end; return JoinToString(begin(collection), end(collection), formatter, delimiter); } //! A handy shortcut with the default formatter. template TString JoinToString( const TCollection& collection, TStringBuf delimiter = DefaultJoinToStringDelimiter) { return JoinToString(collection, TDefaultFormatter(), delimiter); } //! Concatenates a bunch of TStringBuf-like instances into TString. template 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::vector ConvertToStrings( const TIter& begin, const TIter& end, const TFormatter& formatter, size_t maxSize = std::numeric_limits::max()) { std::vector 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::vector ConvertToStrings( const TIter& begin, const TIter& end, size_t maxSize = std::numeric_limits::max()) { 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::vector ConvertToStrings( const TCollection& collection, const TFormatter& formatter, size_t maxSize = std::numeric_limits::max()) { using std::begin; using std::end; return ConvertToStrings(begin(collection), end(collection), formatter, maxSize); } //! A handy shortcut with default formatter. template std::vector ConvertToStrings( const TCollection& collection, size_t maxSize = std::numeric_limits::max()) { return ConvertToStrings(collection, TDefaultFormatter(), maxSize); } //////////////////////////////////////////////////////////////////////////////// void UnderscoreCaseToCamelCase(TStringBuilderBase* builder, TStringBuf str); TString UnderscoreCaseToCamelCase(TStringBuf str); void CamelCaseToUnderscoreCase(TStringBuilderBase* builder, TStringBuf str); TString CamelCaseToUnderscoreCase(TStringBuf str); TString TrimLeadingWhitespaces(const TString& str); TString Trim(const TString& str, const TString& whitespaces); //////////////////////////////////////////////////////////////////////////////// //! Implemented for |[u]i(32|64)|. template char* WriteDecIntToBufferBackwards(char* ptr, T value); //! Implemented for |[u]i(32|64)|. template char* WriteHexIntToBufferBackwards(char* ptr, T value, bool uppercase); //////////////////////////////////////////////////////////////////////////////// struct TCaseInsensitiveStringHasher { size_t operator()(TStringBuf arg) const; }; struct TCaseInsensitiveStringEqualityComparer { bool operator()(TStringBuf lhs, TStringBuf rhs) const; }; //////////////////////////////////////////////////////////////////////////////// bool TryParseBool(TStringBuf value, bool* result); bool ParseBool(TStringBuf value); TStringBuf FormatBool(bool value); //////////////////////////////////////////////////////////////////////////////// } // namespace NYT