4#ifndef _Stroika_Foundation_Characters_ToString_h_
5#define _Stroika_Foundation_Characters_ToString_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
20#if defined(__cpp_lib_format_ranges)
25#include "Stroika/Foundation/Common/Concepts.h"
26#include "Stroika/Foundation/Common/CountedValue.h"
27#include "Stroika/Foundation/Common/KeyValuePair.h"
30#if defined(__cpp_lib_stacktrace)
105 template <
typename T,
typename... ARGS>
106 String
ToString (T&& t, ARGS... args);
109 template <
typename T>
110 struct HasToStringDefault_;
119 template <
typename T>
120 concept IToString = Private_::HasToStringDefault_<T>::value;
125 template <
typename T>
132 template <IToString T>
134 qStroika_Foundation_Characters_FMT_PREFIX_::formatter<String, wchar_t> fDelegate2_;
136 template <
class ParseContext>
137 constexpr typename ParseContext::iterator parse (ParseContext& ctx)
139 return fDelegate2_.parse (ctx);
142 template <
class FmtContext>
143 typename FmtContext::iterator format (T s, FmtContext& ctx)
const
148 template <IToString T>
149 struct ToStringFormatterASCII {
150 qStroika_Foundation_Characters_FMT_PREFIX_::formatter<String, char> fDelegate2_;
152 template <
class ParseContext>
153 constexpr typename ParseContext::iterator parse (ParseContext& ctx)
155 return fDelegate2_.parse (ctx);
158 template <
class FmtContext>
159 typename FmtContext::iterator format (T s, FmtContext& ctx)
const
167namespace Stroika::Foundation::Traversal {
168 template <
typename T>
172namespace Stroika::Foundation::Characters::Private_ {
174 template <
typename ELT>
175 void IsIterable_ (
const Traversal::Iterable<ELT>*);
183 template <
typename T>
194 template <
typename T>
196 { t.ToString () } -> convertible_to<String>;
197 } or Common::IKeyValuePair<remove_cvref_t<T>> or Common::ICountedValue<remove_cvref_t<T>> or
IStroikaIterable_<T>;
205template <Stroika::Foundation::Characters::Private_::IUseToStringFormatterForFormatter_ T>
207template <Stroika::Foundation::Characters::Private_::IUseToStringFormatterForFormatter_ T>
208struct qStroika_Foundation_Characters_FMT_PREFIX_::formatter<T, char> : Stroika::Foundation::Characters::ToStringFormatterASCII<T> {};
210#if defined(__cpp_lib_format_ranges)
216 template <ranges::input_range R>
218 constexpr range_format format_kind<R> = range_format::disabled;
221#if qStroika_HasComponent_fmtlib and FMT_VERSION >= 110000
228template <
typename R,
typename CHAR_T>
229 requires (not std::convertible_to<R, fmt::basic_string_view<CHAR_T>>)
230struct fmt::range_format_kind<R, CHAR_T, void> :
std::integral_constant<fmt::range_format, fmt::range_format::disabled> {};
239#include "ToString.inl"
Check if legal to call Characters::ToString(T)...
one of Stroika's containers, or a class derived from one: anything derived from a Traversal::Iterable
String UnoverloadedToString(const T &t)
same as ToString()/1 - but without the potentially confusing multi-arg overloads (confused some templ...
String ToString(T &&t, ARGS... args)
Return a debug-friendly, display version of the argument: not guaranteed parsable or usable except fo...