Commit c375e73d authored by Aleksey Konovalov's avatar Aleksey Konovalov

Improved wchar <-> NSString codec in the objective-c implementation. Added...

Improved wchar <-> NSString codec in the objective-c implementation. Added static_assert to verify assumptions
parent fe000c8d
...@@ -118,6 +118,32 @@ struct String { ...@@ -118,6 +118,32 @@ struct String {
} }
}; };
template<int wcharTypeSize>
static CFStringEncoding getWCharEncoding()
{
static_assert(wcharTypeSize == 2 || wcharTypeSize == 4, "wchar_t must be represented by UTF-16 or UTF-32 encoding");
}
template<>
inline CFStringEncoding getWCharEncoding<2>() {
// case when wchar_t is represented by utf-16 encoding
#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
return NSUTF16BigEndianStringEncoding;
#else
return NSUTF16LittleEndianStringEncoding;
#endif
}
template<>
inline CFStringEncoding getWCharEncoding<4>() {
// case when wchar_t is represented by utf-32 encoding
#if defined(__BYTE_ORDER__) && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__)
return NSUTF32BigEndianStringEncoding;
#else
return NSUTF32LittleEndianStringEncoding;
#endif
}
struct WString { struct WString {
using CppType = std::wstring; using CppType = std::wstring;
using ObjcType = NSString*; using ObjcType = NSString*;
...@@ -126,7 +152,7 @@ struct WString { ...@@ -126,7 +152,7 @@ struct WString {
static CppType toCpp(ObjcType string) { static CppType toCpp(ObjcType string) {
assert(string); assert(string);
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF32LE); NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(getWCharEncoding<sizeof(wchar_t)>());
NSData* data = [string dataUsingEncoding:encoding]; NSData* data = [string dataUsingEncoding:encoding];
return std::wstring((wchar_t*)[data bytes], [data length] / sizeof (wchar_t)); return std::wstring((wchar_t*)[data bytes], [data length] / sizeof (wchar_t));
} }
...@@ -134,8 +160,8 @@ struct WString { ...@@ -134,8 +160,8 @@ struct WString {
static ObjcType fromCpp(const CppType& string) { static ObjcType fromCpp(const CppType& string) {
assert(string.size() <= std::numeric_limits<NSUInteger>::max()); assert(string.size() <= std::numeric_limits<NSUInteger>::max());
return [[NSString alloc] initWithBytes:string.data() return [[NSString alloc] initWithBytes:string.data()
length:string.size() * sizeof(wchar_t) length:string.size() * sizeof(wchar_t)
encoding:NSUTF32LittleEndianStringEncoding]; encoding:getWCharEncoding<sizeof(wchar_t)>()];
} }
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment