summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTobias Markmann <tm@ayena.de>2016-03-09 14:38:57 (GMT)
committerTobias Markmann <tm@ayena.de>2016-03-15 15:53:03 (GMT)
commitf7de41c770be1bc6c45e825ff0fbdd6bfb799fae (patch)
tree60f7802290dd1d06399f7a7c59fa621046321e18 /SwifTools/Cocoa
parent8cdebcff1d1e8321b070c7e675f9a9709a2b0b81 (diff)
downloadswift-f7de41c770be1bc6c45e825ff0fbdd6bfb799fae.zip
swift-f7de41c770be1bc6c45e825ff0fbdd6bfb799fae.tar.bz2
Explicitly convert between nullable and non-nullable on OS X
Clang was complaining about implicit conversions between nullable and non-nullable NSString pointers. Adjusted our std::string -> NSString* conversion utilities to check for nil and return an empty std::string in that case. Replaced uses of [NSString stringWithUTF8String] with our STD2NSSTRING macro. Turned std::string <-> NSString* conversion macros into functions. Test-Information: Builds without the warning on OS X 10.11.3 and Swift runs without issues. Change-Id: I949f2f3332018391aead58ef362764f4b7955b01
Diffstat (limited to 'SwifTools/Cocoa')
-rw-r--r--SwifTools/Cocoa/CocoaUtil.h30
1 files changed, 25 insertions, 5 deletions
diff --git a/SwifTools/Cocoa/CocoaUtil.h b/SwifTools/Cocoa/CocoaUtil.h
index 49ed682..83d95b6 100644
--- a/SwifTools/Cocoa/CocoaUtil.h
+++ b/SwifTools/Cocoa/CocoaUtil.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2011 Isode Limited.
+ * Copyright (c) 2011-2016 Isode Limited.
* All rights reserved.
* See the COPYING file for more information.
*/
@@ -7,16 +7,36 @@
#pragma once
// Conversion utilities
-#define NS2STDSTRING(a) (a == nil ? std::string() : std::string([a cStringUsingEncoding:NSUTF8StringEncoding]))
-#define STD2NSSTRING(a) [NSString stringWithCString:a.c_str() encoding:NSUTF8StringEncoding]
+namespace {
+
+inline std::string ns2StdString(NSString* _Nullable nsString);
+inline std::string ns2StdString(NSString* _Nullable nsString) {
+ std::string stdString;
+ if (nsString != nil) {
+ stdString = std::string([nsString cStringUsingEncoding:NSUTF8StringEncoding]);
+ }
+ return stdString;
+}
+
+inline NSString* _Nonnull std2NSString(const std::string& stdString);
+inline NSString* _Nonnull std2NSString(const std::string& stdString) {
+ NSString* _Nullable nsString = [NSString stringWithUTF8String:stdString.c_str()];
+ if (nsString == nil) {
+ nsString = @"";
+ }
+ // At this point nsString is guaranteed to be not null/nil.
+ return static_cast<NSString* _Nonnull>(nsString);
+}
+
+}
// Intrusive pointer for NSObjects
namespace boost {
- inline void intrusive_ptr_add_ref(NSObject* object) {
+ inline void intrusive_ptr_add_ref(NSObject* _Nonnull object) {
[object retain];
}
- inline void intrusive_ptr_release(NSObject* object) {
+ inline void intrusive_ptr_release(NSObject* _Nonnull object) {
[object release];
}
}