5#include "Stroika/Foundation/Containers/Common.h"
8 [[noreturn]]
void ThrowSystemErrNo ();
9 [[noreturn]]
void ThrowSystemErrNo (
int sysErr);
19 template <
typename CHAR_T,
size_t EXTENT>
20 requires (same_as<remove_cv_t<CHAR_T>,
char> or same_as<remove_cv_t<CHAR_T>,
SDKChar>)
23 if constexpr (same_as<CHAR_T, char>) {
24 size_t l = ::strlen (s.data ());
25 Require (s.size () > l);
26 return s.subspan (0, l);
28 else if constexpr (same_as<CHAR_T, wchar_t>) {
29 size_t l = ::wcslen (s.data ());
30 Require (s.size () > l);
31 return s.subspan (0, l);
42#if qTargetPlatformSDKUseswchar_t
43#if qStroika_Foundation_Common_Platform_Windows
44 static constexpr DWORD kFLAGS_ = MB_ERR_INVALID_CHARS;
45 int stringLength = ::MultiByteToWideChar (CP_ACP, kFLAGS_, s.data (),
static_cast<int> (s.size ()),
nullptr, 0);
46 if (stringLength == 0 and s.size () != 0) {
47 Execution::ThrowSystemErrNo ();
50 result.resize (stringLength);
51 Verify (::MultiByteToWideChar (CP_ACP, kFLAGS_, s.data (),
static_cast<int> (s.size ()),
Containers::Start (result), stringLength) == stringLength);
62#if qTargetPlatformSDKUseswchar_t
70#if qTargetPlatformSDKUseswchar_t
71#if qStroika_Foundation_Common_Platform_Windows
72 static constexpr DWORD kFLAGS_ = 0;
73 int stringLength = ::MultiByteToWideChar (CP_ACP, kFLAGS_, s.data (),
static_cast<int> (s.size ()),
nullptr, 0);
74 if (stringLength == 0 and s.size () != 0) {
75 Execution::ThrowSystemErrNo ();
78 result.resize (stringLength);
79 Verify (::MultiByteToWideChar (CP_ACP, kFLAGS_, s.data (),
static_cast<int> (s.size ()),
Containers::Start (result), stringLength) == stringLength);
90#if qTargetPlatformSDKUseswchar_t
128#if qTargetPlatformSDKUseswchar_t
129#if qStroika_Foundation_Common_Platform_Windows
130 static constexpr DWORD kFLAGS_ = 0;
131 int stringLength = ::WideCharToMultiByte (CP_ACP, kFLAGS_, s.data (),
static_cast<int> (s.size ()),
nullptr, 0,
nullptr,
nullptr);
132 if (stringLength == 0 and s.size () != 0) {
133 Execution::ThrowSystemErrNo ();
136 result.resize (stringLength);
137 BOOL usedDefaultChar{
false};
138 Verify (::WideCharToMultiByte (CP_ACP, kFLAGS_, s.data (),
static_cast<int> (s.size ()),
Containers::Start (result), stringLength,
139 nullptr, &usedDefaultChar) == stringLength);
140 if (usedDefaultChar) {
141 Execution::ThrowSystemErrNo (ERROR_NO_UNICODE_TRANSLATION);
148 return string{s.begin (), s.end ()};
153#if qTargetPlatformSDKUseswchar_t
161#if qTargetPlatformSDKUseswchar_t
162#if qStroika_Foundation_Common_Platform_Windows
163 static constexpr DWORD kFLAGS_ = 0;
164 int stringLength = ::WideCharToMultiByte (CP_ACP, kFLAGS_, s.data (),
static_cast<int> (s.size ()),
nullptr, 0,
nullptr,
nullptr);
165 if (stringLength == 0 and s.size () != 0) {
166 Execution::ThrowSystemErrNo ();
169 result.resize (stringLength);
170 Verify (::WideCharToMultiByte (CP_ACP, kFLAGS_, s.data (),
static_cast<int> (s.size ()),
Containers::Start (result), stringLength,
171 nullptr,
nullptr) == stringLength);
177 return string{s.begin (), s.end ()};
182#if qTargetPlatformSDKUseswchar_t
194#if qTargetPlatformSDKUseswchar_t
195 inline wstring
SDK2Wide (span<const SDKChar> s)
197 return wstring{s.begin (), s.end ()};
202#if qTargetPlatformSDKUseswchar_t
208#if qTargetPlatformSDKUseswchar_t
211 return wstring{s.begin (), s.end ()};
216#if qTargetPlatformSDKUseswchar_t
228#if qTargetPlatformSDKUseswchar_t
236#if qTargetPlatformSDKUseswchar_t
242#if qTargetPlatformSDKUseswchar_t
250#if qTargetPlatformSDKUseswchar_t
262 DISABLE_COMPILER_GCC_WARNING_START (
"GCC diagnostic ignored \"-Wdeprecated-declarations\"");
264 "Since Stroika v3.0d1 use String::FromNarrowSDKString (s).As<wstring> () - less efficent but this is never used")]]
inline wstring
265 NarrowSDKStringToWide (
const string& s)
268 Assert (CP_ACP == 0);
270 const unsigned char CP_ACP = 0;
272 return NarrowStringToWide (s, CP_ACP);
274 [[deprecated (
"Since Stroika v3.0d1 use String (s).AsNarrowSDKString () - less efficent but this is never used")]]
inline string
275 WideStringToNarrowSDKString (
const wstring& ws)
278 Assert (CP_ACP == 0);
280 const unsigned char CP_ACP = 0;
282 return WideStringToNarrow (ws, CP_ACP);
285 "Since Stroika v3.0d1 use String::FromSDKString (s).AsNarrowSDKString () - less efficent but this is never used")]]
inline string
288#if qTargetPlatformSDKUseswchar_t
289 return WideStringToNarrowSDKString (s);
295 "Since Stroika v3.0d1 use String::FromNarrowSDKString (s).AsSDKString () - less efficent but this is never used")]]
inline SDKString
296 NarrowSDK2SDKString (
const string& s)
298#if qTargetPlatformSDKUseswchar_t
299 return NarrowSDKStringToWide (s);
304 [[deprecated (
"Since Stroika v3.0d1 use String{s}.AsSDKString () - less efficent but this is never used")]]
inline SDKString
305 Wide2SDKString (
const wstring& s)
307#if qTargetPlatformSDKUseswchar_t
310 return WideStringToNarrowSDKString (s);
313 [[deprecated (
"Since Stroika v3.0d1 - just use String::FromNarrowSDKString (s).AsSDKString ()")]]
inline SDKString ToSDKString (
const string& s)
315 return NarrowSDK2SDKString (s);
317 [[deprecated (
"Since Stroika v3.0d1 - just use String(s).AsSDKString ()")]]
inline SDKString ToSDKString (
const wstring& s)
319 return Wide2SDKString (s);
321 DISABLE_COMPILER_MSC_WARNING_END (4996);
322 DISABLE_COMPILER_GCC_WARNING_END (
"GCC diagnostic ignored \"-Wdeprecated-declarations\"");
#define AssertNotImplemented()
wstring NarrowSDK2Wide(span< const char > s)
SDKString Wide2SDK(span< const wchar_t > s)
wstring SDK2Wide(span< const SDKChar > s)
conditional_t< qTargetPlatformSDKUseswchar_t, wchar_t, char > SDKChar
basic_string< SDKChar > SDKString
SDKString Narrow2SDK(span< const char > s)
DISABLE_COMPILER_MSC_WARNING_START(4996)
span< CHAR_T, EXTENT > AdjustNulTerminatedStringSpan(span< CHAR_T, EXTENT > s)
often apply this adjustment to return the non-nul string prefix from a span of characters.
AllowMissingCharacterErrorsFlag
string SDK2Narrow(span< const SDKChar > s)
CONTAINER::value_type * Start(CONTAINER &c)
For a contiguous container (such as a vector or basic_string) - find the pointer to the start of the ...