1/*
2 * This module is used in the unittests for object identity.
3 */
4#include "Python.h"
5#include "pyobjc-api.h"
6
7#import <Foundation/Foundation.h>
8
9@interface OC_TestIdentity : NSObject
10{
11	NSObject* storedObject;
12	int       isClassic;
13}
14
15-(NSObject*)storedObject;
16-(void)setStoredClassicObject:(NSObject*)object;
17-(void)setStoredObject:(NSObject*)object;
18-(void)dealloc;
19
20-(void)setStoredObjectToResultOf:(SEL)aSelector on:(NSObject*)object;
21-(void)setStoredObjectToInteger:(int)value;
22-(void)setStoredObjectToUnsignedInteger:(unsigned int)value;
23-(void)setStoredObjectToLongLong:(long long)value;
24-(void)setStoredObjectToUnsignedLongLong:(unsigned long long)value;
25-(void)setStoredObjectToDouble:(double)value;
26-(void)setStoredObjectToFloat:(float)value;
27
28-(int)isSameObjectAsStored:(NSObject*)value;
29-(void)setStoredObjectToAProtocol;
30-(void)setStoredObjectAnInstanceOf:(Class) cls;
31-(void)setStoredObjectAnInstanceOfClassic:(Class) cls;
32
33-(void)writeStoredObjectToFile:(NSString*)fname;
34
35@end
36
37@implementation OC_TestIdentity
38-(void)dealloc
39{
40	if (isClassic) {
41		/* pass, we could call free but why bother? */
42	} else {
43		[storedObject release];
44	}
45    [super dealloc];
46}
47
48-(NSObject*)storedObject
49{
50	if (isClassic) {
51		return storedObject;
52	} else {
53		return [[storedObject retain] autorelease];
54	}
55}
56
57-(void)setStoredObject:(NSObject*)object
58{
59	if (!isClassic) {
60		[storedObject release];
61	}
62	[object retain];
63	storedObject = object;
64	isClassic = 0;
65}
66
67-(void)setStoredClassicObject:(NSObject*)object
68{
69	if (!isClassic) {
70		[storedObject release];
71	}
72	storedObject = object;
73	isClassic = 1;
74}
75
76-(void)setStoredObjectToResultOf:(SEL)aSelector on:(NSObject*)object
77{
78	[self setStoredObject: [object performSelector: aSelector]];
79}
80
81-(void)setStoredObjectToInteger:(int)value
82{
83	[self setStoredObject: [NSNumber numberWithInt: value]];
84}
85
86-(void)setStoredObjectToUnsignedInteger:(unsigned int)value
87{
88	[self setStoredObject: [NSNumber numberWithUnsignedInt: value]];
89}
90
91-(void)setStoredObjectToLongLong:(long long)value
92{
93	[self setStoredObject: [NSNumber numberWithLongLong: value]];
94}
95
96-(void)setStoredObjectToUnsignedLongLong:(unsigned long long)value
97{
98	[self setStoredObject: [NSNumber numberWithUnsignedLongLong: value]];
99}
100
101-(void)setStoredObjectToDouble:(double)value
102{
103	[self setStoredObject: [NSNumber numberWithDouble: value]];
104}
105
106-(void)setStoredObjectToFloat:(float)value
107{
108	[self setStoredObject: [NSNumber numberWithFloat: value]];
109}
110
111-(int)isSameObjectAsStored:(NSObject*)value
112{
113	return value == storedObject;
114}
115
116-(void)setStoredObjectToAProtocol
117{
118	[self setStoredClassicObject: (NSObject*)@protocol(NSObject) ];
119}
120
121-(void)setStoredObjectAnInstanceOf:(Class) cls
122{
123	[self setStoredObject: [[[cls alloc] init] autorelease]];
124}
125-(void)setStoredObjectAnInstanceOfClassic:(Class)cls
126{
127	[self setStoredClassicObject:[[cls alloc] init]];
128}
129
130-(void)writeStoredObjectToFile:(NSString*)fname
131{
132	[(NSArray*)storedObject writeToFile:fname atomically:YES];
133}
134
135@end
136
137static PyMethodDef mod_methods[] = {
138	{ 0, 0, 0, 0 }
139};
140
141#if PY_VERSION_HEX >= 0x03000000
142
143static struct PyModuleDef mod_module = {
144	PyModuleDef_HEAD_INIT,
145	"identity",
146	NULL,
147	0,
148	mod_methods,
149	NULL,
150	NULL,
151	NULL,
152	NULL
153};
154
155#define INITERROR() return NULL
156#define INITDONE() return m
157
158PyObject* PyInit_identity(void);
159
160PyObject*
161PyInit_identity(void)
162
163#else
164
165#define INITERROR() return
166#define INITDONE() return
167
168void initidentity(void);
169
170void
171initidentity(void)
172#endif
173{
174	PyObject* m;
175
176#if PY_VERSION_HEX >= 0x03000000
177	m = PyModule_Create(&mod_module);
178#else
179	m = Py_InitModule4("identity", mod_methods,
180		NULL, NULL, PYTHON_API_VERSION);
181#endif
182	if (!m) {
183		INITERROR();
184	}
185
186	if (PyObjC_ImportAPI(m) < 0) {
187		INITERROR();
188	}
189	if (PyModule_AddObject(m, "OC_TestIdentity",
190		PyObjCClass_New([OC_TestIdentity class])) < 0) {
191		INITERROR();
192	}
193
194	INITDONE();
195}
196