| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef BASE_MAC_FOUNDATION_UTIL_H_ | 5 #ifndef BASE_MAC_FOUNDATION_UTIL_H_ |
| 6 #define BASE_MAC_FOUNDATION_UTIL_H_ | 6 #define BASE_MAC_FOUNDATION_UTIL_H_ |
| 7 | 7 |
| 8 #include <CoreFoundation/CoreFoundation.h> | 8 #include <CoreFoundation/CoreFoundation.h> |
| 9 | 9 |
| 10 #include <string> | 10 #include <string> |
| (...skipping 254 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 265 // CFNumberRef some_number = base::mac::CFCast<CFNumberRef>( | 265 // CFNumberRef some_number = base::mac::CFCast<CFNumberRef>( |
| 266 // CFArrayGetValueAtIndex(array, index)); | 266 // CFArrayGetValueAtIndex(array, index)); |
| 267 // | 267 // |
| 268 // CFTypeRef hello = CFSTR("hello world"); | 268 // CFTypeRef hello = CFSTR("hello world"); |
| 269 // CFStringRef some_string = base::mac::CFCastStrict<CFStringRef>(hello); | 269 // CFStringRef some_string = base::mac::CFCastStrict<CFStringRef>(hello); |
| 270 | 270 |
| 271 template<typename T> | 271 template<typename T> |
| 272 T CFCast(const CFTypeRef& cf_val); | 272 T CFCast(const CFTypeRef& cf_val); |
| 273 | 273 |
| 274 template<typename T> | 274 template<typename T> |
| 275 T CFCastStrict(const CFTypeRef& cf_val); | 275 T CFCastStrict(const CFTypeRef& cf_val) { |
| 276 DCHECK(!cf_val || CFCast<T>(cf_val)); |
| 277 // Note: CFTypeRef is const void*, but CGColorRef and some others are non- |
| 278 // const. So this may also cast away a const qualifier. |
| 279 return (T)(cf_val); |
| 280 } |
| 276 | 281 |
| 277 #define CF_CAST_DECL(TypeCF) \ | 282 #define CF_CAST_DECL(TypeCF) \ |
| 278 template<> BASE_EXPORT TypeCF##Ref \ | 283 template<> BASE_EXPORT TypeCF##Ref \ |
| 279 CFCast<TypeCF##Ref>(const CFTypeRef& cf_val);\ | 284 CFCast<TypeCF##Ref>(const CFTypeRef& cf_val); |
| 280 \ | |
| 281 template<> BASE_EXPORT TypeCF##Ref \ | |
| 282 CFCastStrict<TypeCF##Ref>(const CFTypeRef& cf_val); | |
| 283 | 285 |
| 284 CF_CAST_DECL(CFArray); | 286 CF_CAST_DECL(CFArray); |
| 285 CF_CAST_DECL(CFBag); | 287 CF_CAST_DECL(CFBag); |
| 286 CF_CAST_DECL(CFBoolean); | 288 CF_CAST_DECL(CFBoolean); |
| 287 CF_CAST_DECL(CFData); | 289 CF_CAST_DECL(CFData); |
| 288 CF_CAST_DECL(CFDate); | 290 CF_CAST_DECL(CFDate); |
| 289 CF_CAST_DECL(CFDictionary); | 291 CF_CAST_DECL(CFDictionary); |
| 290 CF_CAST_DECL(CFNull); | 292 CF_CAST_DECL(CFNull); |
| 291 CF_CAST_DECL(CFNumber); | 293 CF_CAST_DECL(CFNumber); |
| 292 CF_CAST_DECL(CFSet); | 294 CF_CAST_DECL(CFSet); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 332 template<typename T> | 334 template<typename T> |
| 333 T* ObjCCast(id objc_val) { | 335 T* ObjCCast(id objc_val) { |
| 334 if ([objc_val isKindOfClass:[T class]]) { | 336 if ([objc_val isKindOfClass:[T class]]) { |
| 335 return reinterpret_cast<T*>(objc_val); | 337 return reinterpret_cast<T*>(objc_val); |
| 336 } | 338 } |
| 337 return nil; | 339 return nil; |
| 338 } | 340 } |
| 339 | 341 |
| 340 template<typename T> | 342 template<typename T> |
| 341 T* ObjCCastStrict(id objc_val) { | 343 T* ObjCCastStrict(id objc_val) { |
| 342 T* rv = ObjCCast<T>(objc_val); | 344 DCHECK(!objc_val || ObjCCast<T>(objc_val)); |
| 343 DCHECK(objc_val == nil || rv); | 345 return reinterpret_cast<T*>(objc_val); |
| 344 return rv; | |
| 345 } | 346 } |
| 346 | 347 |
| 347 #endif // defined(__OBJC__) | 348 #endif // defined(__OBJC__) |
| 348 | 349 |
| 349 // Helper function for GetValueFromDictionary to create the error message | 350 // Helper function for GetValueFromDictionary to create the error message |
| 350 // that appears when a type mismatch is encountered. | 351 // that appears when a type mismatch is encountered. |
| 351 BASE_EXPORT std::string GetValueFromDictionaryErrorMessage( | 352 BASE_EXPORT std::string GetValueFromDictionaryErrorMessage( |
| 352 CFStringRef key, const std::string& expected_type, CFTypeRef value); | 353 CFStringRef key, const std::string& expected_type, CFTypeRef value); |
| 353 | 354 |
| 354 // Utility function to pull out a value from a dictionary, check its type, and | 355 // Utility function to pull out a value from a dictionary, check its type, and |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 389 // by using the NSToCFCast methods above. | 390 // by using the NSToCFCast methods above. |
| 390 // e.g. LOG(INFO) << base::mac::NSToCFCast(@"foo"); | 391 // e.g. LOG(INFO) << base::mac::NSToCFCast(@"foo"); |
| 391 // Operator << can not be overloaded for ObjectiveC types as the compiler | 392 // Operator << can not be overloaded for ObjectiveC types as the compiler |
| 392 // can not distinguish between overloads for id with overloads for void*. | 393 // can not distinguish between overloads for id with overloads for void*. |
| 393 BASE_EXPORT extern std::ostream& operator<<(std::ostream& o, | 394 BASE_EXPORT extern std::ostream& operator<<(std::ostream& o, |
| 394 const CFErrorRef err); | 395 const CFErrorRef err); |
| 395 BASE_EXPORT extern std::ostream& operator<<(std::ostream& o, | 396 BASE_EXPORT extern std::ostream& operator<<(std::ostream& o, |
| 396 const CFStringRef str); | 397 const CFStringRef str); |
| 397 | 398 |
| 398 #endif // BASE_MAC_FOUNDATION_UTIL_H_ | 399 #endif // BASE_MAC_FOUNDATION_UTIL_H_ |
| OLD | NEW |