Line data Source code
1 0 : /* 2 : 3 : NSNumberOOExtensions.m 4 : 5 : 6 : Copyright (C) 2009-2013 Jens Ayton 7 : 8 : Permission is hereby granted, free of charge, to any person obtaining a copy 9 : of this software and associated documentation files (the "Software"), to deal 10 : in the Software without restriction, including without limitation the rights 11 : to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 : copies of the Software, and to permit persons to whom the Software is 13 : furnished to do so, subject to the following conditions: 14 : 15 : The above copyright notice and this permission notice shall be included in all 16 : copies or substantial portions of the Software. 17 : 18 : THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 : IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 : FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 : AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 : LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 : OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 24 : SOFTWARE. 25 : 26 : */ 27 : 28 : #import "NSNumberOOExtensions.h" 29 : #import "OOFunctionAttributes.h" 30 : 31 : 32 : @implementation NSNumber (OOExtensions) 33 : 34 : - (BOOL) oo_isFloatingPointNumber 35 : { 36 : #if __COREFOUNDATION_CFNUMBER__ 37 : return CFNumberIsFloatType((CFNumberRef)self); 38 : #else 39 : /* This happily assumes the compiler will inline strcmp() where one 40 : argument is a single-character constant string. Verified under 41 : apple-gcc 4.0 (even with -O0). 42 : */ 43 : const char *type = [self objCType]; 44 : return (strcmp(type, @encode(double)) == 0 || strcmp(type, @encode(float)) == 0); 45 : #endif 46 : } 47 : 48 : 49 : - (BOOL) oo_isBoolean 50 : { 51 : /* There's no explicit way to test this. However, on Mac OS X boolean 52 : NSNumbers are required to be constant objects because they're toll- 53 : free bridged with kCFBooleanTrue and kCFBooleanFalse, so comparison to 54 : those values has to work. 55 : 56 : In GNUstep, constant objects are also used, because they're not about 57 : to miss such an obvious optimization. 58 : */ 59 : 60 : #if __COREFOUNDATION_CFNUMBER__ 61 : return self == (NSNumber *)kCFBooleanTrue || self == (NSNumber *)kCFBooleanFalse; 62 : #else 63 : static NSNumber *sTrue = nil, *sFalse; 64 : if (EXPECT_NOT(sTrue == nil)) 65 : { 66 : sTrue = [[NSNumber numberWithBool:YES] retain]; 67 : sFalse = [[NSNumber numberWithBool:NO] retain]; 68 : } 69 : return self == sTrue || self == sFalse; 70 : #endif 71 : } 72 : 73 : @end