Skip to content

Commit 4593122

Browse files
committed
[CDStringFormatting] Add NSStringFromNSUInteger
1 parent 2974499 commit 4593122

4 files changed

Lines changed: 155 additions & 0 deletions

File tree

ClassDump.xcodeproj/project.pbxproj

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
FA829A0523BD310600FA4DC1 /* CDParseCppTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = FA829A0423BD310600FA4DC1 /* CDParseCppTests.mm */; };
2929
FAAA8C482B8BCCE900BD85B4 /* CDGenerationOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = FAAA8C462B8BCCE900BD85B4 /* CDGenerationOptions.h */; settings = {ATTRIBUTES = (Public, ); }; };
3030
FAAA8C492B8BCCE900BD85B4 /* CDGenerationOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = FAAA8C472B8BCCE900BD85B4 /* CDGenerationOptions.m */; };
31+
FAB999B62F09E19100847625 /* CDStringFormatting.m in Sources */ = {isa = PBXBuildFile; fileRef = FAB999B52F09E19100847625 /* CDStringFormatting.m */; };
32+
FAB999B82F09E1C200847625 /* CDStringFormatting.h in Headers */ = {isa = PBXBuildFile; fileRef = FAB999B72F09E1C200847625 /* CDStringFormatting.h */; };
33+
FAB999BA2F09E28A00847625 /* CDStringFormattingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = FAB999B92F09E28A00847625 /* CDStringFormattingTests.m */; };
3134
FAE3C1102B81E11000242A99 /* CDVariableModel.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF031F22942FC3B00B6C424 /* CDVariableModel.h */; settings = {ATTRIBUTES = (Public, ); }; };
3235
FAE3C1112B81E11A00242A99 /* ClassDump.h in Headers */ = {isa = PBXBuildFile; fileRef = FA2A00EB23ADD21200B52F1D /* ClassDump.h */; settings = {ATTRIBUTES = (Public, ); }; };
3336
FAE3C1182B81E1A000242A99 /* CDPrimitiveType.h in Headers */ = {isa = PBXBuildFile; fileRef = FAF031E32942F6C400B6C424 /* CDPrimitiveType.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -117,6 +120,9 @@
117120
FA829A0423BD310600FA4DC1 /* CDParseCppTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = CDParseCppTests.mm; sourceTree = "<group>"; };
118121
FAAA8C462B8BCCE900BD85B4 /* CDGenerationOptions.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CDGenerationOptions.h; sourceTree = "<group>"; };
119122
FAAA8C472B8BCCE900BD85B4 /* CDGenerationOptions.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CDGenerationOptions.m; sourceTree = "<group>"; };
123+
FAB999B52F09E19100847625 /* CDStringFormatting.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CDStringFormatting.m; sourceTree = "<group>"; };
124+
FAB999B72F09E1C200847625 /* CDStringFormatting.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CDStringFormatting.h; sourceTree = "<group>"; };
125+
FAB999B92F09E28A00847625 /* CDStringFormattingTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CDStringFormattingTests.m; sourceTree = "<group>"; };
120126
FAE71A7423DA0AB20079321A /* CDObjCTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CDObjCTests.m; sourceTree = "<group>"; };
121127
FAF031E02942E4FF00B6C424 /* CDParseType.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CDParseType.h; sourceTree = "<group>"; };
122128
FAF031E12942E4FF00B6C424 /* CDParseType.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CDParseType.m; sourceTree = "<group>"; };
@@ -215,6 +221,8 @@
215221
FA2A00EE23ADD2EA00B52F1D /* CDUtilities.m */,
216222
FA2A00EF23ADD2EA00B52F1D /* CDTypeParser.h */,
217223
FA2A00F123ADD2EA00B52F1D /* CDTypeParser.m */,
224+
FAB999B72F09E1C200847625 /* CDStringFormatting.h */,
225+
FAB999B52F09E19100847625 /* CDStringFormatting.m */,
218226
);
219227
path = Services;
220228
sourceTree = "<group>";
@@ -244,6 +252,7 @@
244252
FA829A0423BD310600FA4DC1 /* CDParseCppTests.mm */,
245253
FAE71A7423DA0AB20079321A /* CDObjCTests.m */,
246254
FA53C6C92B959A8100FC1A15 /* CDProtocolTest.m */,
255+
FAB999B92F09E28A00847625 /* CDStringFormattingTests.m */,
247256
);
248257
path = ClassDumpTests;
249258
sourceTree = "<group>";
@@ -306,6 +315,7 @@
306315
FAE3C1572B81E5AC00242A99 /* CDTypeParser.h in Headers */,
307316
FAAA8C482B8BCCE900BD85B4 /* CDGenerationOptions.h in Headers */,
308317
FAE3C11D2B81E1A000242A99 /* CDPointerType.h in Headers */,
318+
FAB999B82F09E1C200847625 /* CDStringFormatting.h in Headers */,
309319
FA53C6A92B8DA96E00FC1A15 /* NSArray+CDFiltering.h in Headers */,
310320
);
311321
runOnlyForDeploymentPostprocessing = 0;
@@ -413,6 +423,7 @@
413423
FAF031E22942E4FF00B6C424 /* CDParseType.m in Sources */,
414424
FA53C6A62B8DA8E200FC1A15 /* NSArray+CDFiltering.h in Sources */,
415425
FA06EA29296934A5008E133B /* CDPropertyAttribute.m in Sources */,
426+
FAB999B62F09E19100847625 /* CDStringFormatting.m in Sources */,
416427
FAF031FA2943154B00B6C424 /* CDObjectType.m in Sources */,
417428
FA2A00FF23ADD2EA00B52F1D /* CDTypeParser.m in Sources */,
418429
FAF031F72942FF2A00B6C424 /* CDArrayType.m in Sources */,
@@ -432,6 +443,7 @@
432443
files = (
433444
FAE71A7523DA0AB20079321A /* CDObjCTests.m in Sources */,
434445
FA53C6CA2B959A8100FC1A15 /* CDProtocolTest.m in Sources */,
446+
FAB999BA2F09E28A00847625 /* CDStringFormattingTests.m in Sources */,
435447
FA2A011C23AEB15700B52F1D /* CDParsePrimitiveTests.m in Sources */,
436448
FA829A0523BD310600FA4DC1 /* CDParseCppTests.mm in Sources */,
437449
FA829A0323BD250100FA4DC1 /* CDParseAdvancedTests.m in Sources */,
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
//
2+
// CDStringFormatting.h
3+
// ClassDump
4+
//
5+
// Created by Leptos on 1/3/26.
6+
// Copyright © 2026 Leptos. All rights reserved.
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
11+
/// Decimal (base ten) representation
12+
NSString *NSStringFromNSUInteger(NSUInteger value);
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//
2+
// CDStringFormatting.m
3+
// ClassDump
4+
//
5+
// Created by Leptos on 1/3/26.
6+
// Copyright © 2026 Leptos. All rights reserved.
7+
//
8+
9+
#import <Foundation/Foundation.h>
10+
11+
NSString *NSStringFromNSUInteger(NSUInteger value) {
12+
// fast path
13+
switch (value) {
14+
case 0:
15+
return @"0";
16+
case 1:
17+
return @"1";
18+
case 2:
19+
return @"2";
20+
case 3:
21+
return @"3";
22+
case 4:
23+
return @"4";
24+
case 5:
25+
return @"5";
26+
case 6:
27+
return @"6";
28+
case 7:
29+
return @"7";
30+
case 8:
31+
return @"8";
32+
case 9:
33+
return @"9";
34+
}
35+
36+
NSUInteger place = 1;
37+
size_t digits = 1;
38+
while ((value / place) >= 10) {
39+
place *= 10;
40+
digits += 1;
41+
}
42+
43+
char buff[digits];
44+
char *tail = buff + digits;
45+
while (tail > buff) {
46+
NSUInteger const trailingDigit = value % 10;
47+
value /= 10;
48+
49+
tail--;
50+
*tail = (trailingDigit + '0');
51+
}
52+
53+
return [[NSString alloc] initWithBytes:buff length:digits encoding:NSASCIIStringEncoding];
54+
}
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
//
2+
// CDStringFormattingTests.m
3+
// ClassDumpTests
4+
//
5+
// Created by Leptos on 1/3/26.
6+
// Copyright © 2026 Leptos. All rights reserved.
7+
//
8+
9+
#import <XCTest/XCTest.h>
10+
#import "../ClassDump/Services/CDStringFormatting.h"
11+
12+
@interface CDStringFormattingTests : XCTestCase
13+
14+
@end
15+
16+
@implementation CDStringFormattingTests
17+
18+
- (void)testSingleDigit {
19+
XCTAssert([NSStringFromNSUInteger(0) isEqualToString:@"0"]);
20+
XCTAssert([NSStringFromNSUInteger(1) isEqualToString:@"1"]);
21+
XCTAssert([NSStringFromNSUInteger(2) isEqualToString:@"2"]);
22+
XCTAssert([NSStringFromNSUInteger(3) isEqualToString:@"3"]);
23+
XCTAssert([NSStringFromNSUInteger(4) isEqualToString:@"4"]);
24+
XCTAssert([NSStringFromNSUInteger(5) isEqualToString:@"5"]);
25+
XCTAssert([NSStringFromNSUInteger(6) isEqualToString:@"6"]);
26+
XCTAssert([NSStringFromNSUInteger(7) isEqualToString:@"7"]);
27+
XCTAssert([NSStringFromNSUInteger(8) isEqualToString:@"8"]);
28+
XCTAssert([NSStringFromNSUInteger(9) isEqualToString:@"9"]);
29+
}
30+
31+
- (void)testDoubleDigit {
32+
XCTAssert([NSStringFromNSUInteger(10) isEqualToString:@"10"]);
33+
XCTAssert([NSStringFromNSUInteger(11) isEqualToString:@"11"]);
34+
XCTAssert([NSStringFromNSUInteger(12) isEqualToString:@"12"]);
35+
XCTAssert([NSStringFromNSUInteger(13) isEqualToString:@"13"]);
36+
XCTAssert([NSStringFromNSUInteger(14) isEqualToString:@"14"]);
37+
XCTAssert([NSStringFromNSUInteger(15) isEqualToString:@"15"]);
38+
XCTAssert([NSStringFromNSUInteger(16) isEqualToString:@"16"]);
39+
XCTAssert([NSStringFromNSUInteger(17) isEqualToString:@"17"]);
40+
XCTAssert([NSStringFromNSUInteger(18) isEqualToString:@"18"]);
41+
XCTAssert([NSStringFromNSUInteger(19) isEqualToString:@"19"]);
42+
}
43+
44+
- (void)testBaseMultiple {
45+
XCTAssert([NSStringFromNSUInteger(100) isEqualToString:@"100"]);
46+
XCTAssert([NSStringFromNSUInteger(1000) isEqualToString:@"1000"]);
47+
XCTAssert([NSStringFromNSUInteger(10000000) isEqualToString:@"10000000"]);
48+
}
49+
50+
- (void)testRandom {
51+
// random number
52+
XCTAssert([NSStringFromNSUInteger(1113096422) isEqualToString:@"1113096422"]);
53+
}
54+
55+
- (void)testMax {
56+
NSUInteger const max = -1;
57+
#if __LP64__ || NS_BUILD_32_LIKE_64
58+
XCTAssertEqual(max, 18446744073709551615ul);
59+
XCTAssert([NSStringFromNSUInteger(max) isEqualToString:@"18446744073709551615"]);
60+
#else
61+
XCTAssertEqual(max, 4294967295u);
62+
XCTAssert([NSStringFromNSUInteger(max) isEqualToString:@"4294967295"]);
63+
#endif
64+
}
65+
66+
- (void)testMaxMinusOne {
67+
NSUInteger const maxMinusOne = -2;
68+
#if __LP64__ || NS_BUILD_32_LIKE_64
69+
XCTAssertEqual(maxMinusOne, 18446744073709551614ul);
70+
XCTAssert([NSStringFromNSUInteger(maxMinusOne) isEqualToString:@"18446744073709551614"]);
71+
#else
72+
XCTAssertEqual(maxMinusOne, 4294967294u);
73+
XCTAssert([NSStringFromNSUInteger(maxMinusOne) isEqualToString:@"4294967294"]);
74+
#endif
75+
}
76+
77+
@end

0 commit comments

Comments
 (0)