8#ifndef H_ALIB_STRINGS_STDSTRINGS
9#define H_ALIB_STRINGS_STDSTRINGS
18#if __has_include(<format>)
21# include <fmt/format.h>
58template<
typename TChar>
65 static constexpr const TChar* Buffer (std::basic_string_view<TChar>
const & src) {
return src.data () ; }
66 static constexpr integer Length (std::basic_string_view<TChar>
const & src) {
return integer( src.length() ); }
67 constexpr static std::basic_string_view<TChar> Construct(
const TChar* array,
integer length ) {
return std::basic_string_view<TChar>( array,
size_t(length) ); }
81 static const nchar* Buffer (std::basic_string_view<char8_t>
const & src) {
return reinterpret_cast<const nchar*
>(src.data ()) ; }
82 static constexpr integer Length (std::basic_string_view<char8_t>
const & src) {
return integer( src.length() ); }
83 static std::basic_string_view<char8_t> Construct(
const nchar* array,
integer length )
84 {
return std::basic_string_view<char8_t>(
reinterpret_cast<const char8_t*
>(array),
size_t(length) ); }
96template<
typename TChar>
103 static constexpr const TChar* Buffer (std::basic_string_view<TChar>
const & src ) {
return src.data () ; }
104 static constexpr integer Length (std::basic_string_view<TChar>
const & src ) {
return integer( src.length() ); }
105 static constexpr std::basic_string_view<TChar> Construct(
const TChar* array,
integer length ) {
return std::basic_string_view<TChar>( array,
size_t(length) ); }
120 static const nchar* Buffer (std::basic_string_view<char8_t>
const & src ) {
return reinterpret_cast<const nchar*
>(src.data ()) ; }
121 static constexpr integer Length (std::basic_string_view<char8_t>
const & src ) {
return integer( src.length() ); }
122 static std::basic_string_view<char8_t> Construct(
const nchar* array,
integer length )
123 {
return std::basic_string_view<char8_t>(
reinterpret_cast<const char8_t*
>(array),
size_t(length) ); }
138template<
typename TChar>
145 static constexpr const TChar* Buffer ( std::basic_string<TChar>
const & src ) {
return src.data () ; }
146 static constexpr integer Length ( std::basic_string<TChar>
const & src ) {
return integer( src.length() ); }
147 static constexpr std::basic_string<TChar> Construct(
const TChar* array,
integer length ) {
return std::basic_string<TChar>( array,
size_t(length) ); }
163 static const nchar* Buffer ( std::basic_string<char8_t>
const & src ) {
return reinterpret_cast<const nchar*
>(src.data()); }
164 static constexpr integer Length ( std::basic_string<char8_t>
const & src ) {
return integer( src.length() ); }
165 static std::basic_string<char8_t> Construct(
const nchar* array,
integer length )
166 {
return std::basic_string<char8_t>(
reinterpret_cast<const char8_t*
>(array),
size_t(length) ); }
198template<
typename TChar>
205 static constexpr const TChar* Buffer ( std::basic_string<TChar>
const & src ) {
return src.data () ; }
206 static constexpr integer Length ( std::basic_string<TChar>
const & src ) {
return integer( src.length() ); }
207 static constexpr std::basic_string<TChar> Construct(
const TChar* array,
integer length ) {
return std::basic_string<TChar>( array,
size_t(length) ); }
221template<
typename TChar>
228 static constexpr const TChar* Buffer (std::vector<TChar>
const & src) {
return src.data() ; }
229 static constexpr integer Length (std::vector<TChar>
const & src) {
return integer( src.size() ); }
230 static std::vector<TChar> Construct(
const TChar* array,
integer length ) {
231 std::vector<TChar> result;
232 result.reserve(
size_t(length) );
233 const TChar* end= array + length;
235 result.push_back( *array++ );
253template<
typename TChar>
260 static constexpr const TChar* Buffer (std::vector<TChar>
const & src) {
return src.data() ; }
261 static constexpr integer Length (std::vector<TChar>
const & src) {
return integer( src.size() ); }
262 static constexpr std::vector<TChar> Construct(
const TChar* array,
integer length ) {
263 std::vector<TChar> result;
264 result.reserve(
size_t(length) );
265 const TChar* end= array + length;
267 result.push_back( *array++ );
281template<
typename TChar,
size_t TLength>
288 static constexpr const TChar* Buffer (std::array<TChar, TLength>
const & src) {
return src.data () ; }
289 static constexpr integer Length (std::array<TChar, TLength>
const & src) {
return integer( src.size() ); }
302template<
typename TChar,
size_t TLength>
309 static constexpr const TChar* Buffer (std::array<TChar, TLength>
const & src ) {
return src.data () ; }
310 static constexpr integer Length (std::array<TChar, TLength>
const & src ) {
return integer( src.size() ); }
322template<
typename TChar>
329 static constexpr const TChar* Buffer (std::span<const TChar>
const & src) {
return src.data () ; }
330 static constexpr integer Length (std::span<const TChar>
const & src) {
return integer( src.size() ); }
331 static std::span<const TChar> Construct(
const TChar* array,
integer length ) {
return std::span<const TChar>( array,
size_t(length) ); }
344template<
typename TChar>
351 static constexpr const TChar* Buffer (std::span<const TChar>
const & src ) {
return src.data () ; }
352 static constexpr integer Length (std::span<const TChar>
const & src ) {
return integer( src.size() ); }
353 static std::span<const TChar> Construct(
const TChar* array,
integer length ) {
return std::span<const TChar>( array,
size_t(length) ); }
369template<
typename TChar>
struct NoAutoCastTraits<TCString<TChar> ,
characters::Policy::ExplicitOnly, std::basic_string<TChar> > : std::true_type {};
370template<
typename TChar,
typename TAlloc>
struct NoAutoCastTraits<TAString<TChar,TAlloc>, characters::Policy::ExplicitOnly, std::basic_string<TChar> > : std::true_type {};
383# if __has_include(<format>)
399template<
typename TChar>
401 : formatter<std::basic_string_view<TChar>, TChar> {
410 template<
typename TContext>
413 return formatter<std::basic_string_view<TChar>, TChar>
::format(
414 static_cast<std::basic_string_view<TChar>
>(str), ctx);
426template<
typename TChar>
428 : formatter<std::basic_string_view<TChar>, TChar> {
437 template<
typename TContext>
440 return formatter<std::basic_string_view<TChar>, TChar>
::format(
441 static_cast<std::basic_string_view<TChar>
>(str), ctx);
453template<
typename TChar,
typename TAllocator>
455 : formatter<std::basic_string_view<TChar>, TChar> {
463 template<
typename TContext>
465 return formatter<std::basic_string_view<TChar>, TChar>
::format(
466 static_cast<std::basic_string_view<TChar>
>(str), ctx);
478template<
typename TChar>
480 : formatter<std::basic_string_view<TChar>, TChar> {
489 template<
typename TContext>
492 return formatter<std::basic_string_view<TChar>, TChar>
::format(
493 static_cast<std::basic_string_view<TChar>
>(str), ctx);
505template<
typename TChar, alib::
integer TCapacity,
typename TAllocator>
507 : formatter<std::basic_string_view<TChar>, TChar> {
516 template<
typename TContext>
518 TContext& ctx )
const {
520 return formatter<std::basic_string_view<TChar>, TChar>
::format(
521 static_cast<std::basic_string_view<TChar>
>(str), ctx);
554template<
typename TAppendable>
565template<
typename TAppendable>
574# if __has_include(<format>)
596template <
typename TAppendable,
typename TChar>
598struct formatter<
alib::strings::Appendable<TAppendable>, TChar>
599 : formatter<std::basic_string_view<TChar>, TChar> {
606 template <
typename FormatContext>
607 auto format(
const alib::strings::Appendable<TAppendable>& wrapper,
608 FormatContext& ctx)
const {
610 buf.
Append(wrapper.appendable);
612 return formatter<std::basic_string_view<TChar>, TChar>
::format(
613 static_cast<std::basic_string_view<TChar>
>(buf), ctx);
660template<
typename TChar,
typename... TArgs>
673 ,
arguments(std::make_tuple(std::forward<TArgs>(args)...)) {}
680template<
typename TChar,
typename... TArgs>
685template<
typename TAllocator,
typename... Args>
693 std::back_insert_iterator<TAString<char, TAllocator>> it(target);
695 #if __has_include(<format>)
696 namespace f_temp=std;
698 namespace f_temp=fmt;
702 std::apply( [&](
auto&&... a) {
703 f_temp::vformat_to(it, fmtpackage.
format,
704 f_temp::make_format_args(
static_cast<const decltype(a)&
>(a)...));
712template<
typename TAllocator,
typename... Args>
720 std::back_insert_iterator<TAString<wchar_t, TAllocator>> it(target);
726 vformat_to(it, fmtpackage.
format,
727 make_wformat_args(
static_cast<const decltype(a)&
>(a)...));
739 template<
typename... Args>
743 template<
typename... Args>
747 template<
typename... Args>
751 template<
typename TAppendable>
TAString & Append(const TCharSrc *src, integer srcLength)
integer Length(const TChar *cstring)
lang::integer integer
Type alias in namespace alib.
strings::TStdFormat< wchar_t, Args... > WStdFormat
Type alias in namespace alib.
strings::TStdFormat< character, Args... > StdFormat
Type alias in namespace alib.
strings::TStdFormat< char, Args... > NStdFormat
Type alias in namespace alib.
characters::character character
Type alias in namespace alib.
strings::Appendable< TAppendable > Appendable
Type alias in namespace alib.
Appendable(const TAppendable &pAppendable)
const TAppendable & appendable
A reference to the wrapped appendable.