4#ifndef _Stroika_Foundation_Common_StdCompat_h_
5#define _Stroika_Foundation_Common_StdCompat_h_ 1
7#include "Stroika/Foundation/StroikaPreComp.h"
20#if qStroika_HasComponent_fmtlib
21#include <fmt/chrono.h>
22#include <fmt/format.h>
24#elif __has_include(<format>)
42namespace Stroika::Foundation::Common::StdCompat {
49#if qStroika_HasComponent_fmtlib
50#define qStroika_Foundation_Characters_FMT_PREFIX_ fmt
51#elif __has_include(<format>)
52#define qStroika_Foundation_Characters_FMT_PREFIX_ std
54 static_assert (
false,
"Stroika v3 requires some std::format compatible library - if building with one lacking builtin std::format, "
55 "configure --fmtlib use");
62 using qStroika_Foundation_Characters_FMT_PREFIX_::basic_format_parse_context;
63 using qStroika_Foundation_Characters_FMT_PREFIX_::format;
64 using qStroika_Foundation_Characters_FMT_PREFIX_::format_args;
65 using qStroika_Foundation_Characters_FMT_PREFIX_::format_error;
66 using qStroika_Foundation_Characters_FMT_PREFIX_::format_string;
67 using qStroika_Foundation_Characters_FMT_PREFIX_::format_to;
68 using qStroika_Foundation_Characters_FMT_PREFIX_::make_format_args;
69 using qStroika_Foundation_Characters_FMT_PREFIX_::make_wformat_args;
70 using qStroika_Foundation_Characters_FMT_PREFIX_::vformat;
71 using qStroika_Foundation_Characters_FMT_PREFIX_::wformat_args;
72 using qStroika_Foundation_Characters_FMT_PREFIX_::wformat_string;
74#if __cplusplus >= kStrokia_Foundation_Common_cplusplus_23 || _HAS_CXX23
75 template <
class T,
class CharT>
76 concept formattable = std::formattable<T, CharT>;
79 template <
class _CharT>
80 struct _Phony_fmt_iter_for {
81 using difference_type = ptrdiff_t;
82 _CharT& operator* ()
const;
83 _Phony_fmt_iter_for& operator++ ();
84 _Phony_fmt_iter_for operator++ (
int);
87 template <
class _Ty,
class _Context,
class _Formatter =
typename _Context::
template formatter_type<remove_const_t<_Ty>>>
88 concept _Formattable_with = semiregular<_Formatter> &&
requires (_Formatter& __f,
const _Formatter& __cf, _Ty&& __t, _Context __fc,
89 basic_format_parse_context<typename _Context::char_type> __pc) {
90 { __f.parse (__pc) } -> same_as<
typename decltype (__pc)::iterator>;
91 { __cf.format (__t, __fc) } -> same_as<typename _Context::iterator>;
94 template <
class T,
class CharT>
96 Private_::_Formattable_with<remove_reference_t<T>, qStroika_Foundation_Characters_FMT_PREFIX_::basic_format_context<Private_::_Phony_fmt_iter_for<CharT>, CharT>>;
102#if __cpp_lib_bit_cast >= 201806L
105 template <
class To,
class From>
107 requires (
sizeof (To) ==
sizeof (From) && std::is_trivially_copyable_v<From> && std::is_trivially_copyable_v<To>)
109 static_assert (std::is_trivially_constructible_v<To>,
"This implementation additionally requires "
110 "destination type to be trivially constructible");
112 std::memcpy (&dst, &src,
sizeof (To));
120#if __cpp_lib_byteswap >= 202110L
126 DISABLE_COMPILER_GCC_WARNING_START (
"GCC diagnostic ignored \"-Warray-bounds\"");
127 static_assert (std::has_unique_object_representations_v<T>,
"T may not have padding bits");
128 auto value_representation =
bit_cast<array<byte,
sizeof (T)>> (n);
129 for (
size_t i = 0; i < value_representation.size () / 2; ++i) {
130 swap (value_representation[i], value_representation[value_representation.size () - i]);
132 return bit_cast<T> (value_representation);
133 DISABLE_COMPILER_GCC_WARNING_END (
"GCC diagnostic ignored \"-Warray-bounds\"");
140 template <
typename T>
141#if __cplusplus >= kStrokia_Foundation_Common_cplusplus_23 || _MSVC_LANG >= kStrokia_Foundation_Common_cplusplus_23
149#if qCompilerAndStdLib_fpclasifyEtcOfInteger_Buggy
150 if constexpr (integral<T>) {
155 return std::isinf (v);
161 template <
typename T>
162#if __cplusplus >= kStrokia_Foundation_Common_cplusplus_23
170#if qCompilerAndStdLib_fpclasifyEtcOfInteger_Buggy
171 if constexpr (integral<T>) {
176 return std::isnan (v);
179#if qCompilerAndStdLib_stdlib_compare_three_way_present_but_Buggy
180 struct compare_three_way {
182 template <
typename LT,
typename RT>
183 constexpr auto operator() (LT&& lhs, RT&& rhs)
const
185 using CT = common_type_t<LT, RT>;
186 if (equal_to<CT>{}(forward<LT> (lhs), forward<RT> (rhs))) {
187 return strong_ordering::equal;
189 return less<CT>{}(forward<LT> (lhs), forward<RT> (rhs)) ? strong_ordering::less : strong_ordering::greater;
191 using is_transparent = void;
194 using compare_three_way = std::compare_three_way;
204#include "StdCompat.inl"
constexpr bool isnan(T v) noexcept
To bit_cast(const From &src) noexcept
constexpr bool isinf(T v) noexcept