Commit 209e2f2e authored by Aleksey Konovalov's avatar Aleksey Konovalov

c++ wide strings support (objc)

parent 82f0751c
...@@ -79,7 +79,7 @@ class ObjcppMarshal(spec: Spec) extends Marshal(spec) { ...@@ -79,7 +79,7 @@ class ObjcppMarshal(spec: Spec) extends Marshal(spec) {
case MOptional => "Optional" case MOptional => "Optional"
case MBinary => "Binary" case MBinary => "Binary"
case MDate => "Date" case MDate => "Date"
case MString => "String" case MString => if (spec.cppUseWideStrings) "WString" else "String"
case MList => "List" case MList => "List"
case MSet => "Set" case MSet => "Set"
case MMap => "Map" case MMap => "Map"
......
...@@ -118,6 +118,27 @@ struct String { ...@@ -118,6 +118,27 @@ struct String {
} }
}; };
struct WString {
using CppType = std::wstring;
using ObjcType = NSString*;
using Boxed = WString;
static CppType toCpp(ObjcType string) {
assert(string);
NSStringEncoding encoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF32LE);
NSData* data = [string dataUsingEncoding:encoding];
return std::wstring((wchar_t*)[data bytes], [data length] / sizeof (wchar_t));
}
static ObjcType fromCpp(const CppType& string) {
assert(string.size() <= std::numeric_limits<NSUInteger>::max());
return [[NSString alloc] initWithBytes:string.data()
length:string.size() * sizeof(wchar_t)
encoding:NSUTF32LittleEndianStringEncoding];
}
};
struct Date { struct Date {
using CppType = std::chrono::system_clock::time_point; using CppType = std::chrono::system_clock::time_point;
using ObjcType = NSDate*; using ObjcType = NSDate*;
......
...@@ -5,6 +5,6 @@ wchar_test_rec = record { ...@@ -5,6 +5,6 @@ wchar_test_rec = record {
wchar_test_helpers = interface +c { wchar_test_helpers = interface +c {
static get_record() : wchar_test_rec; static get_record() : wchar_test_rec;
static get_string() : string; static get_string() : string;
static check_string(s: string) : bool; static check_string(str: string) : bool;
static check_record(r: wchar_test_rec) : bool; static check_record(rec: wchar_test_rec) : bool;
} }
#import <Foundation/Foundation.h>
#import "DBWcharTestHelpers.h"
#import "DBWcharTestRec.h"
#import <XCTest/XCTest.h>
@interface DBWcharTests : XCTestCase
@end
@implementation DBWcharTests
- (void)setUp
{
[super setUp];
}
- (void)tearDown
{
[super tearDown];
}
- (void)test
{
NSString *str1 = @"some string with unicode \u263a symbol";
NSString *str2 = @"another string with unicode \u263b symbol";
XCTAssertEqualObjects([[DBWcharTestHelpers getRecord] s], str1);
XCTAssertEqualObjects([DBWcharTestHelpers getString], str2);
XCTAssertTrue([DBWcharTestHelpers checkString:str2]);
XCTAssertTrue([DBWcharTestHelpers checkRecord:[[DBWcharTestRec alloc] initWithS:str1]]);
}
@end
...@@ -7,6 +7,7 @@ ...@@ -7,6 +7,7 @@
objects = { objects = {
/* Begin PBXBuildFile section */ /* Begin PBXBuildFile section */
5AEA68151D38F4A40083D770 /* DBWcharTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 728E11201D37DE27005A554D /* DBWcharTests.m */; };
650CA05A1C2AB48E007ADDDB /* DBListenerCaller+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = 650CA0571C2AB48E007ADDDB /* DBListenerCaller+Private.mm */; }; 650CA05A1C2AB48E007ADDDB /* DBListenerCaller+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = 650CA0571C2AB48E007ADDDB /* DBListenerCaller+Private.mm */; };
650CA05E1C2AB5AB007ADDDB /* ListenerCaller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 650CA05D1C2AB5AB007ADDDB /* ListenerCaller.cpp */; }; 650CA05E1C2AB5AB007ADDDB /* ListenerCaller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 650CA05D1C2AB5AB007ADDDB /* ListenerCaller.cpp */; };
650CA0601C2AB6DB007ADDDB /* DBMultipleInheritanceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 650CA05B1C2AB524007ADDDB /* DBMultipleInheritanceTests.m */; }; 650CA0601C2AB6DB007ADDDB /* DBMultipleInheritanceTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 650CA05B1C2AB524007ADDDB /* DBMultipleInheritanceTests.m */; };
...@@ -31,6 +32,10 @@ ...@@ -31,6 +32,10 @@
65868B5F1989FE4200D60EEE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65868B5E1989FE4200D60EEE /* UIKit.framework */; }; 65868B5F1989FE4200D60EEE /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 65868B5E1989FE4200D60EEE /* UIKit.framework */; };
65868B621989FE4200D60EEE /* libDjinniObjcTest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 65868B4A1989FE4200D60EEE /* libDjinniObjcTest.a */; }; 65868B621989FE4200D60EEE /* libDjinniObjcTest.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 65868B4A1989FE4200D60EEE /* libDjinniObjcTest.a */; };
6D66A8A91A3B09F000B312E8 /* DBConstantTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6D66A8A81A3B09F000B312E8 /* DBConstantTests.mm */; }; 6D66A8A91A3B09F000B312E8 /* DBConstantTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 6D66A8A81A3B09F000B312E8 /* DBConstantTests.mm */; };
728E111B1D37DE0B005A554D /* DBWcharTestHelpers+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = 728E11161D37DE0B005A554D /* DBWcharTestHelpers+Private.mm */; };
728E111C1D37DE0B005A554D /* DBWcharTestRec.mm in Sources */ = {isa = PBXBuildFile; fileRef = 728E11181D37DE0B005A554D /* DBWcharTestRec.mm */; };
728E111D1D37DE0B005A554D /* DBWcharTestRec+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = 728E111A1D37DE0B005A554D /* DBWcharTestRec+Private.mm */; };
728E111F1D37DE1C005A554D /* wchar_test_helpers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 728E111E1D37DE1C005A554D /* wchar_test_helpers.cpp */; };
A20094101B06982F00EF8D9B /* DBTokenTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = A200940E1B0697D300EF8D9B /* DBTokenTests.mm */; }; A20094101B06982F00EF8D9B /* DBTokenTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = A200940E1B0697D300EF8D9B /* DBTokenTests.mm */; };
A209B5791BBA2A0A0070C310 /* DBOptColorRecord.mm in Sources */ = {isa = PBXBuildFile; fileRef = A209B5761BBA2A0A0070C310 /* DBOptColorRecord.mm */; }; A209B5791BBA2A0A0070C310 /* DBOptColorRecord.mm in Sources */ = {isa = PBXBuildFile; fileRef = A209B5761BBA2A0A0070C310 /* DBOptColorRecord.mm */; };
A209B57A1BBA2A0A0070C310 /* DBOptColorRecord+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = A209B5781BBA2A0A0070C310 /* DBOptColorRecord+Private.mm */; }; A209B57A1BBA2A0A0070C310 /* DBOptColorRecord+Private.mm in Sources */ = {isa = PBXBuildFile; fileRef = A209B5781BBA2A0A0070C310 /* DBOptColorRecord+Private.mm */; };
...@@ -182,6 +187,17 @@ ...@@ -182,6 +187,17 @@
65868B5B1989FE4200D60EEE /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 65868B5B1989FE4200D60EEE /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
65868B5E1989FE4200D60EEE /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; 65868B5E1989FE4200D60EEE /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
6D66A8A81A3B09F000B312E8 /* DBConstantTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DBConstantTests.mm; sourceTree = "<group>"; }; 6D66A8A81A3B09F000B312E8 /* DBConstantTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DBConstantTests.mm; sourceTree = "<group>"; };
728E11121D37DDFB005A554D /* wchar_test_helpers.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = wchar_test_helpers.hpp; sourceTree = "<group>"; };
728E11131D37DDFB005A554D /* wchar_test_rec.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = wchar_test_rec.hpp; sourceTree = "<group>"; };
728E11141D37DE0B005A554D /* DBWcharTestHelpers.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBWcharTestHelpers.h; sourceTree = "<group>"; };
728E11151D37DE0B005A554D /* DBWcharTestHelpers+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBWcharTestHelpers+Private.h"; sourceTree = "<group>"; };
728E11161D37DE0B005A554D /* DBWcharTestHelpers+Private.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "DBWcharTestHelpers+Private.mm"; sourceTree = "<group>"; };
728E11171D37DE0B005A554D /* DBWcharTestRec.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBWcharTestRec.h; sourceTree = "<group>"; };
728E11181D37DE0B005A554D /* DBWcharTestRec.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DBWcharTestRec.mm; sourceTree = "<group>"; };
728E11191D37DE0B005A554D /* DBWcharTestRec+Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "DBWcharTestRec+Private.h"; sourceTree = "<group>"; };
728E111A1D37DE0B005A554D /* DBWcharTestRec+Private.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "DBWcharTestRec+Private.mm"; sourceTree = "<group>"; };
728E111E1D37DE1C005A554D /* wchar_test_helpers.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wchar_test_helpers.cpp; sourceTree = "<group>"; };
728E11201D37DE27005A554D /* DBWcharTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = DBWcharTests.m; sourceTree = "<group>"; };
A200940E1B0697D300EF8D9B /* DBTokenTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DBTokenTests.mm; sourceTree = "<group>"; }; A200940E1B0697D300EF8D9B /* DBTokenTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DBTokenTests.mm; sourceTree = "<group>"; };
A209B5751BBA2A0A0070C310 /* DBOptColorRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBOptColorRecord.h; sourceTree = "<group>"; }; A209B5751BBA2A0A0070C310 /* DBOptColorRecord.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DBOptColorRecord.h; sourceTree = "<group>"; };
A209B5761BBA2A0A0070C310 /* DBOptColorRecord.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DBOptColorRecord.mm; sourceTree = "<group>"; }; A209B5761BBA2A0A0070C310 /* DBOptColorRecord.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = DBOptColorRecord.mm; sourceTree = "<group>"; };
...@@ -378,6 +394,7 @@ ...@@ -378,6 +394,7 @@
6536CD7519A6C98800DD7715 /* handwritten-cpp */ = { 6536CD7519A6C98800DD7715 /* handwritten-cpp */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
728E111E1D37DE1C005A554D /* wchar_test_helpers.cpp */,
B5E9C9391C1F9D9D0073C123 /* reverse_client_interface_impl.cpp */, B5E9C9391C1F9D9D0073C123 /* reverse_client_interface_impl.cpp */,
B5E9C93A1C1F9D9D0073C123 /* reverse_client_interface_impl.hpp */, B5E9C93A1C1F9D9D0073C123 /* reverse_client_interface_impl.hpp */,
6536CD7619A6C98800DD7715 /* cpp_exception_impl.cpp */, 6536CD7619A6C98800DD7715 /* cpp_exception_impl.cpp */,
...@@ -396,6 +413,7 @@ ...@@ -396,6 +413,7 @@
6536CD7919A6C99800DD7715 /* Tests */ = { 6536CD7919A6C99800DD7715 /* Tests */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
728E11201D37DE27005A554D /* DBWcharTests.m */,
6536CD7A19A6C99800DD7715 /* DBClientInterfaceTests.mm */, 6536CD7A19A6C99800DD7715 /* DBClientInterfaceTests.mm */,
6D66A8A81A3B09F000B312E8 /* DBConstantTests.mm */, 6D66A8A81A3B09F000B312E8 /* DBConstantTests.mm */,
6536CD7B19A6C99800DD7715 /* DBCppExceptionTests.mm */, 6536CD7B19A6C99800DD7715 /* DBCppExceptionTests.mm */,
...@@ -453,6 +471,13 @@ ...@@ -453,6 +471,13 @@
A24249181AF192E0003BF8F0 /* generated-objc */ = { A24249181AF192E0003BF8F0 /* generated-objc */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
728E11141D37DE0B005A554D /* DBWcharTestHelpers.h */,
728E11151D37DE0B005A554D /* DBWcharTestHelpers+Private.h */,
728E11161D37DE0B005A554D /* DBWcharTestHelpers+Private.mm */,
728E11171D37DE0B005A554D /* DBWcharTestRec.h */,
728E11181D37DE0B005A554D /* DBWcharTestRec.mm */,
728E11191D37DE0B005A554D /* DBWcharTestRec+Private.h */,
728E111A1D37DE0B005A554D /* DBWcharTestRec+Private.mm */,
B5D8FC321C23E2F40045ADCF /* DBConstantRecord.h */, B5D8FC321C23E2F40045ADCF /* DBConstantRecord.h */,
B5D8FC331C23E2F40045ADCF /* DBConstantRecord.mm */, B5D8FC331C23E2F40045ADCF /* DBConstantRecord.mm */,
B5D8FC341C23E2F40045ADCF /* DBConstantRecord+Private.h */, B5D8FC341C23E2F40045ADCF /* DBConstantRecord+Private.h */,
...@@ -573,6 +598,8 @@ ...@@ -573,6 +598,8 @@
A242495D1AF192FC003BF8F0 /* generated-cpp */ = { A242495D1AF192FC003BF8F0 /* generated-cpp */ = {
isa = PBXGroup; isa = PBXGroup;
children = ( children = (
728E11121D37DDFB005A554D /* wchar_test_helpers.hpp */,
728E11131D37DDFB005A554D /* wchar_test_rec.hpp */,
B5D8FC381C23E30D0045ADCF /* constant_record.hpp */, B5D8FC381C23E30D0045ADCF /* constant_record.hpp */,
B5E9C93C1C1F9DCA0073C123 /* reverse_client_interface.hpp */, B5E9C93C1C1F9DCA0073C123 /* reverse_client_interface.hpp */,
A209B57B1BBA2A180070C310 /* opt_color_record.hpp */, A209B57B1BBA2A180070C310 /* opt_color_record.hpp */,
...@@ -700,6 +727,7 @@ ...@@ -700,6 +727,7 @@
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
A238CA981AF84B7100CDDCE5 /* DBMapRecord+Private.mm in Sources */, A238CA981AF84B7100CDDCE5 /* DBMapRecord+Private.mm in Sources */,
728E111B1D37DE0B005A554D /* DBWcharTestHelpers+Private.mm in Sources */,
CFC5D9E81B1513E800BF2DF8 /* DBExternInterface1+Private.mm in Sources */, CFC5D9E81B1513E800BF2DF8 /* DBExternInterface1+Private.mm in Sources */,
B5D8FC361C23E2F40045ADCF /* DBConstantRecord.mm in Sources */, B5D8FC361C23E2F40045ADCF /* DBConstantRecord.mm in Sources */,
A24850311AF96EBC00AFE907 /* DBSetRecord.mm in Sources */, A24850311AF96EBC00AFE907 /* DBSetRecord.mm in Sources */,
...@@ -744,6 +772,8 @@ ...@@ -744,6 +772,8 @@
A24249761AF192FC003BF8F0 /* record_with_nested_derivings.cpp in Sources */, A24249761AF192FC003BF8F0 /* record_with_nested_derivings.cpp in Sources */,
CFC5DA081B1532F600BF2DF8 /* DBRecordWithDurationAndDerivings.mm in Sources */, CFC5DA081B1532F600BF2DF8 /* DBRecordWithDurationAndDerivings.mm in Sources */,
A248502D1AF96EBC00AFE907 /* DBNestedCollection.mm in Sources */, A248502D1AF96EBC00AFE907 /* DBNestedCollection.mm in Sources */,
728E111D1D37DE0B005A554D /* DBWcharTestRec+Private.mm in Sources */,
728E111C1D37DE0B005A554D /* DBWcharTestRec.mm in Sources */,
B5E9C93B1C1F9D9D0073C123 /* reverse_client_interface_impl.cpp in Sources */, B5E9C93B1C1F9D9D0073C123 /* reverse_client_interface_impl.cpp in Sources */,
CFC5D9D81B15106400BF2DF8 /* DBExternRecordWithDerivings+Private.mm in Sources */, CFC5D9D81B15106400BF2DF8 /* DBExternRecordWithDerivings+Private.mm in Sources */,
A238CAA21AF84B7100CDDCE5 /* DBSetRecord+Private.mm in Sources */, A238CAA21AF84B7100CDDCE5 /* DBSetRecord+Private.mm in Sources */,
...@@ -763,6 +793,7 @@ ...@@ -763,6 +793,7 @@
A248502E1AF96EBC00AFE907 /* DBPrimitiveList.mm in Sources */, A248502E1AF96EBC00AFE907 /* DBPrimitiveList.mm in Sources */,
A209B57A1BBA2A0A0070C310 /* DBOptColorRecord+Private.mm in Sources */, A209B57A1BBA2A0A0070C310 /* DBOptColorRecord+Private.mm in Sources */,
B5D8FC371C23E2F40045ADCF /* DBConstantRecord+Private.mm in Sources */, B5D8FC371C23E2F40045ADCF /* DBConstantRecord+Private.mm in Sources */,
728E111F1D37DE1C005A554D /* wchar_test_helpers.cpp in Sources */,
A238CAA01AF84B7100CDDCE5 /* DBRecordWithNestedDerivings+Private.mm in Sources */, A238CAA01AF84B7100CDDCE5 /* DBRecordWithNestedDerivings+Private.mm in Sources */,
CFC5DA0A1B1532F600BF2DF8 /* DBRecordWithDurationAndDerivings+Private.mm in Sources */, CFC5DA0A1B1532F600BF2DF8 /* DBRecordWithDurationAndDerivings+Private.mm in Sources */,
); );
...@@ -772,6 +803,7 @@ ...@@ -772,6 +803,7 @@
isa = PBXSourcesBuildPhase; isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647; buildActionMask = 2147483647;
files = ( files = (
5AEA68151D38F4A40083D770 /* DBWcharTests.m in Sources */,
CFC5D9D11B15105100BF2DF8 /* extern_record_with_derivings.cpp in Sources */, CFC5D9D11B15105100BF2DF8 /* extern_record_with_derivings.cpp in Sources */,
6D66A8A91A3B09F000B312E8 /* DBConstantTests.mm in Sources */, 6D66A8A91A3B09F000B312E8 /* DBConstantTests.mm in Sources */,
6536CD9219A6C9A800DD7715 /* DBRecordWithDerivingsCppTests.mm in Sources */, 6536CD9219A6C9A800DD7715 /* DBRecordWithDerivingsCppTests.mm in Sources */,
......
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