1#include <Python.h>
2#include "pyobjc-api.h"
3
4#import <Foundation/Foundation.h>
5
6@interface OC_TestNumber : NSObject {}
7+(Class)numberClass:(NSNumber*)number;
8+(BOOL)numberAsBOOL:(NSNumber*)number;
9+(char)numberAsChar:(NSNumber*)number;
10+(short)numberAsShort:(NSNumber*)number;
11+(int)numberAsInt:(NSNumber*)number;
12+(long)numberAsLong:(NSNumber*)number;
13+(long long)numberAsLongLong:(NSNumber*)number;
14+(unsigned char)numberAsUnsignedChar:(NSNumber*)number;
15+(unsigned short)numberAsUnsignedShort:(NSNumber*)number;
16+(unsigned int)numberAsUnsignedInt:(NSNumber*)number;
17+(unsigned long)numberAsUnsignedLong:(NSNumber*)number;
18+(unsigned long long)numberAsUnsignedLongLong:(NSNumber*)number;
19+(NSDecimal)numberAsDecimal:(NSNumber*)number;
20+(float)numberAsFloat:(NSNumber*)number;
21+(double)numberAsDouble:(NSNumber*)number;
22
23+(const char*)objCTypeOf:(NSNumber*)number;
24+(int)compareA:(NSNumber*)a andB:(NSNumber*)b;
25+(BOOL)number:(NSNumber*)a isEqualTo:(NSNumber*)b;
26+(NSString*)numberDescription:(NSNumber*)number;
27+(NSString*)numberDescription:(NSNumber*)number withLocale:(id)aLocale;
28@end
29
30@implementation OC_TestNumber
31
32+(Class)numberClass:(NSNumber*)number
33{
34	return [number class];
35}
36
37+(const char*)objCTypeOf:(NSNumber*)number
38{
39	return [number objCType];
40}
41
42+(int)compareA:(NSNumber*)a andB:(NSNumber*)b
43{
44	return [a compare:b];
45}
46
47+(BOOL)number:(NSNumber*)a isEqualTo:(NSNumber*)b
48{
49	return [a isEqualToNumber:b];
50}
51
52+(NSString*)numberDescription:(NSNumber*)number
53{
54	return [number description];
55}
56
57+(NSString*)numberAsString:(NSNumber*)number
58{
59	return [number stringValue];
60}
61
62+(NSString*)numberDescription:(NSNumber*)number withLocale:(id)aLocale
63{
64	return [number descriptionWithLocale:aLocale];
65}
66
67+(BOOL)numberAsBOOL:(NSNumber*)number
68{
69	return [number boolValue];
70}
71
72+(char)numberAsChar:(NSNumber*)number
73{
74	return [number charValue];
75}
76
77+(short)numberAsShort:(NSNumber*)number
78{
79	return [number shortValue];
80}
81
82+(int)numberAsInt:(NSNumber*)number
83{
84	return [number intValue];
85}
86
87+(long)numberAsLong:(NSNumber*)number
88{
89	return [number longValue];
90}
91
92+(long long)numberAsLongLong:(NSNumber*)number
93{
94	return [number longLongValue];
95}
96
97+(unsigned char)numberAsUnsignedChar:(NSNumber*)number
98{
99	return [number unsignedCharValue];
100}
101
102+(unsigned short)numberAsUnsignedShort:(NSNumber*)number
103{
104	return [number unsignedShortValue];
105}
106
107+(unsigned int)numberAsUnsignedInt:(NSNumber*)number
108{
109	return [number unsignedIntValue];
110}
111
112+(unsigned long)numberAsUnsignedLong:(NSNumber*)number
113{
114	return [number unsignedLongValue];
115}
116
117+(unsigned long long)numberAsUnsignedLongLong:(NSNumber*)number
118{
119	return [number unsignedLongLongValue];
120}
121
122+(NSDecimal)numberAsDecimal:(NSNumber*)number
123{
124	return [number decimalValue];
125}
126
127+(float)numberAsFloat:(NSNumber*)number
128{
129	return [number floatValue];
130}
131
132+(double)numberAsDouble:(NSNumber*)number
133{
134	return [number doubleValue];
135}
136
137
138@end
139
140
141static PyMethodDef mod_methods[] = {
142	        { 0, 0, 0, 0 }
143};
144
145#if PY_VERSION_HEX >= 0x03000000
146
147static struct PyModuleDef mod_module = {
148	PyModuleDef_HEAD_INIT,
149	"pythonnumber",
150	NULL,
151	0,
152	mod_methods,
153	NULL,
154	NULL,
155	NULL,
156	NULL
157};
158
159#define INITERROR() return NULL
160#define INITDONE() return m
161
162PyObject* PyInit_pythonnumber(void);
163
164PyObject*
165PyInit_pythonnumber(void)
166
167#else
168
169#define INITERROR() return
170#define INITDONE() return
171
172void initpythonnumber(void);
173
174void
175initpythonnumber(void)
176#endif
177{
178	PyObject* m;
179
180#if PY_VERSION_HEX >= 0x03000000
181	m = PyModule_Create(&mod_module);
182#else
183	m = Py_InitModule4("pythonnumber", mod_methods,
184		NULL, NULL, PYTHON_API_VERSION);
185#endif
186	if (!m) {
187		INITERROR();
188	}
189
190	if (PyObjC_ImportAPI(m) < 0) {
191		INITERROR();
192	}
193
194	if (PyModule_AddObject(m, "OC_TestNumber",
195	    PyObjCClass_New([OC_TestNumber class])) < 0){
196		INITERROR();
197	}
198
199	INITDONE();
200}
201