NSNumber+KiwiAdditions.m 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. //
  2. // Licensed under the terms in License.txt
  3. //
  4. // Copyright 2010 Allen Ding. All rights reserved.
  5. //
  6. #import "NSNumber+KiwiAdditions.h"
  7. #import "KWObjCUtilities.h"
  8. @implementation NSNumber(KiwiAdditions)
  9. #pragma mark - Creating Numbers
  10. + (id)numberWithBytes:(const void *)bytes objCType:(const char *)anObjCType {
  11. // Yeah, this is ugly.
  12. if (KWObjCTypeEqualToObjCType(anObjCType, @encode(BOOL)))
  13. return [self numberWithBoolBytes:bytes];
  14. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(bool)))
  15. return [self numberWithStdBoolBytes:bytes];
  16. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(char)))
  17. return [self numberWithCharBytes:bytes];
  18. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(double)))
  19. return [self numberWithDoubleBytes:bytes];
  20. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(float)))
  21. return [self numberWithFloatBytes:bytes];
  22. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(int)))
  23. return [self numberWithIntBytes:bytes];
  24. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(NSInteger)))
  25. return [self numberWithIntegerBytes:bytes];
  26. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(long)))
  27. return [self numberWithLongBytes:bytes];
  28. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(long long)))
  29. return [self numberWithLongLongBytes:bytes];
  30. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(short)))
  31. return [self numberWithShortBytes:bytes];
  32. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned char)))
  33. return [self numberWithUnsignedCharBytes:bytes];
  34. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned int)))
  35. return [self numberWithUnsignedIntBytes:bytes];
  36. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(NSUInteger)))
  37. return [self numberWithUnsignedIntegerBytes:bytes];
  38. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned long)))
  39. return [self numberWithUnsignedLongBytes:bytes];
  40. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned long long)))
  41. return [self numberWithUnsignedLongLongBytes:bytes];
  42. else if (KWObjCTypeEqualToObjCType(anObjCType, @encode(unsigned short)))
  43. return [self numberWithUnsignedShortBytes:bytes];
  44. else
  45. return nil;
  46. }
  47. + (id)numberWithBoolBytes:(const void *)bytes {
  48. return @(*(const BOOL *)bytes);
  49. }
  50. + (id)numberWithStdBoolBytes:(const void *)bytes {
  51. return @(*(const bool *)bytes);
  52. }
  53. + (id)numberWithCharBytes:(const void *)bytes {
  54. return @(*(const char *)bytes);
  55. }
  56. + (id)numberWithDoubleBytes:(const void *)bytes {
  57. return @(*(const double *)bytes);
  58. }
  59. + (id)numberWithFloatBytes:(const void *)bytes {
  60. return @(*(const float *)bytes);
  61. }
  62. + (id)numberWithIntBytes:(const void *)bytes {
  63. return @(*(const int *)bytes);
  64. }
  65. + (id)numberWithIntegerBytes:(const void *)bytes {
  66. return @(*(const NSInteger *)bytes);
  67. }
  68. + (id)numberWithLongBytes:(const void *)bytes {
  69. return @(*(const long *)bytes);
  70. }
  71. + (id)numberWithLongLongBytes:(const void *)bytes {
  72. return @(*(const long long *)bytes);
  73. }
  74. + (id)numberWithShortBytes:(const void *)bytes {
  75. return @(*(const short *)bytes);
  76. }
  77. + (id)numberWithUnsignedCharBytes:(const void *)bytes {
  78. return @(*(const unsigned char *)bytes);
  79. }
  80. + (id)numberWithUnsignedIntBytes:(const void *)bytes {
  81. return @(*(const unsigned int *)bytes);
  82. }
  83. + (id)numberWithUnsignedIntegerBytes:(const void *)bytes {
  84. return @(*(const NSUInteger *)bytes);
  85. }
  86. + (id)numberWithUnsignedLongBytes:(const void *)bytes {
  87. return @(*(const unsigned long *)bytes);
  88. }
  89. + (id)numberWithUnsignedLongLongBytes:(const void *)bytes {
  90. return @(*(const unsigned long long *)bytes);
  91. }
  92. + (id)numberWithUnsignedShortBytes:(const void *)bytes {
  93. return @(*(const unsigned short *)bytes);
  94. }
  95. @end