KWObjCUtilities.m 3.1 KB

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