main
1//
2// Licensed under the terms in License.txt
3//
4// Copyright 2010 Allen Ding. All rights reserved.
5//
6
7#import "KWObjCUtilities.h"
8#import "KWStringUtilities.h"
9
10#pragma mark -
11#pragma mark Objective-C Type Utilities
12
13BOOL KWObjCTypeEqualToObjCType(const char *firstObjCType, const char *secondObjCType) {
14 return strcmp(firstObjCType, secondObjCType) == 0;
15}
16
17BOOL KWObjCTypeIsNumeric(const char *objCType) {
18 return KWObjCTypeIsFloatingPoint(objCType) || KWObjCTypeIsIntegral(objCType);
19}
20
21BOOL KWObjCTypeIsFloatingPoint(const char *objCType) {
22 return strcmp(objCType, @encode(float)) == 0 || strcmp(objCType, @encode(double)) == 0;
23}
24
25BOOL KWObjCTypeIsIntegral(const char *objCType) {
26 return KWObjCTypeIsSignedIntegral(objCType) || KWObjCTypeIsUnsignedIntegral(objCType);
27}
28
29BOOL KWObjCTypeIsSignedIntegral(const char *objCType) {
30 return strcmp(objCType, @encode(char)) == 0 ||
31 strcmp(objCType, @encode(int)) == 0 ||
32 strcmp(objCType, @encode(short)) == 0 ||
33 strcmp(objCType, @encode(long)) == 0 ||
34 strcmp(objCType, @encode(long long)) == 0;
35}
36
37BOOL KWObjCTypeIsUnsignedIntegral(const char *objCType) {
38 return strcmp(objCType, @encode(unsigned char)) == 0 ||
39 strcmp(objCType, @encode(unsigned int)) == 0 ||
40 strcmp(objCType, @encode(unsigned short)) == 0 ||
41 strcmp(objCType, @encode(unsigned long)) == 0 ||
42 strcmp(objCType, @encode(unsigned long long)) == 0;
43}
44
45BOOL KWObjCTypeIsObject(const char *objCType) {
46 return strcmp(objCType, @encode(id)) == 0 || strcmp(objCType, "@?") == 0;
47}
48
49BOOL KWObjCTypeIsCharString(const char *objCType) {
50 return strcmp(objCType, @encode(char *)) == 0;
51}
52
53BOOL KWObjCTypeIsClass(const char *objCType) {
54 return strcmp(objCType, @encode(Class)) == 0;
55}
56
57BOOL KWObjCTypeIsSelector(const char *objCType) {
58 return strcmp(objCType, @encode(SEL)) == 0;
59}
60
61BOOL KWObjCTypeIsPointerToType(const char *objCType) {
62 return *objCType == '^';
63}
64
65BOOL KWObjCTypeIsPointerLike(const char *objCType) {
66 return KWObjCTypeIsObject(objCType) ||
67 KWObjCTypeIsCharString(objCType) ||
68 KWObjCTypeIsClass(objCType) ||
69 KWObjCTypeIsSelector(objCType) ||
70 KWObjCTypeIsPointerToType(objCType);
71}
72
73BOOL KWObjCTypeIsUnknown(const char *objCType) {
74 return *objCType == '?';
75}
76
77NSUInteger KWObjCTypeLength(const char *objCType) {
78 NSString *encoding = KWEncodingWithObjCTypes(objCType, @encode(id), @encode(SEL), nil);
79 NSMethodSignature *signature = [NSMethodSignature signatureWithObjCTypes:[encoding UTF8String]];
80 return [signature methodReturnLength];
81}
82
83BOOL KWObjCTypeIsBlock(const char *objCType) {
84 return strcmp(objCType, "@?") == 0;
85}
86
87
88#pragma mark -
89#pragma mark Selector Utlities
90
91NSUInteger KWSelectorParameterCount(SEL selector) {
92 NSString *selectorString = NSStringFromSelector(selector);
93 NSUInteger length = [selectorString length];
94 NSUInteger parameterCount = 0;
95
96 for (NSUInteger i = 0; i < length; ++i) {
97 if ([selectorString characterAtIndex:i] == ':')
98 ++parameterCount;
99 }
100
101 return parameterCount;
102}