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}