annotate generator/containergenerator.cpp @ 248:7664de4a55e5

Fixed #23. QtD_QObjectEntity is not created dynamically for shell classes any more. Class initialization is now performed by static constructors. When wrapping QObjects returned from functions, their run-time types are now taken into account. QObjects are allocated on GC heap, a doubly-linked list is used to prevent them from been collected (arguably a better solution than allocating on C heap and adding GC ranges) Minor changes (including unnecessary).
author maxter
date Thu, 20 Aug 2009 14:47:17 +0000
parents d69b58c01131
children 37eed70de029
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
e78566595089 initial import
mandel
parents:
diff changeset
1 /****************************************************************************
e78566595089 initial import
mandel
parents:
diff changeset
2 **
e78566595089 initial import
mandel
parents:
diff changeset
3 ** Copyright (C) 1992-2008 Nokia. All rights reserved.
e78566595089 initial import
mandel
parents:
diff changeset
4 **
e78566595089 initial import
mandel
parents:
diff changeset
5 ** This file is part of Qt Jambi.
e78566595089 initial import
mandel
parents:
diff changeset
6 **
e78566595089 initial import
mandel
parents:
diff changeset
7 ** * Commercial Usage
e78566595089 initial import
mandel
parents:
diff changeset
8 * Licensees holding valid Qt Commercial licenses may use this file in
e78566595089 initial import
mandel
parents:
diff changeset
9 * accordance with the Qt Commercial License Agreement provided with the
e78566595089 initial import
mandel
parents:
diff changeset
10 * Software or, alternatively, in accordance with the terms contained in
e78566595089 initial import
mandel
parents:
diff changeset
11 * a written agreement between you and Nokia.
e78566595089 initial import
mandel
parents:
diff changeset
12 *
e78566595089 initial import
mandel
parents:
diff changeset
13 *
e78566595089 initial import
mandel
parents:
diff changeset
14 * GNU General Public License Usage
e78566595089 initial import
mandel
parents:
diff changeset
15 * Alternatively, this file may be used under the terms of the GNU
e78566595089 initial import
mandel
parents:
diff changeset
16 * General Public License versions 2.0 or 3.0 as published by the Free
e78566595089 initial import
mandel
parents:
diff changeset
17 * Software Foundation and appearing in the file LICENSE.GPL included in
e78566595089 initial import
mandel
parents:
diff changeset
18 * the packaging of this file. Please review the following information
e78566595089 initial import
mandel
parents:
diff changeset
19 * to ensure GNU General Public Licensing requirements will be met:
e78566595089 initial import
mandel
parents:
diff changeset
20 * http://www.fsf.org/licensing/licenses/info/GPLv2.html and
e78566595089 initial import
mandel
parents:
diff changeset
21 * http://www.gnu.org/copyleft/gpl.html. In addition, as a special
e78566595089 initial import
mandel
parents:
diff changeset
22 * exception, Nokia gives you certain additional rights. These rights
e78566595089 initial import
mandel
parents:
diff changeset
23 * are described in the Nokia Qt GPL Exception version 1.2, included in
e78566595089 initial import
mandel
parents:
diff changeset
24 * the file GPL_EXCEPTION.txt in this package.
e78566595089 initial import
mandel
parents:
diff changeset
25 *
e78566595089 initial import
mandel
parents:
diff changeset
26 * Qt for Windows(R) Licensees
e78566595089 initial import
mandel
parents:
diff changeset
27 * As a special exception, Nokia, as the sole copyright holder for Qt
e78566595089 initial import
mandel
parents:
diff changeset
28 * Designer, grants users of the Qt/Eclipse Integration plug-in the
e78566595089 initial import
mandel
parents:
diff changeset
29 * right for the Qt/Eclipse Integration to link to functionality
e78566595089 initial import
mandel
parents:
diff changeset
30 * provided by Qt Designer and its related libraries.
e78566595089 initial import
mandel
parents:
diff changeset
31 *
e78566595089 initial import
mandel
parents:
diff changeset
32 *
e78566595089 initial import
mandel
parents:
diff changeset
33 * If you are unsure which license is appropriate for your use, please
e78566595089 initial import
mandel
parents:
diff changeset
34 * contact the sales department at qt-sales@nokia.com.
e78566595089 initial import
mandel
parents:
diff changeset
35
e78566595089 initial import
mandel
parents:
diff changeset
36 **
e78566595089 initial import
mandel
parents:
diff changeset
37 ** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
e78566595089 initial import
mandel
parents:
diff changeset
38 ** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
e78566595089 initial import
mandel
parents:
diff changeset
39 **
e78566595089 initial import
mandel
parents:
diff changeset
40 ****************************************************************************/
e78566595089 initial import
mandel
parents:
diff changeset
41
e78566595089 initial import
mandel
parents:
diff changeset
42 #include "containergenerator.h"
e78566595089 initial import
mandel
parents:
diff changeset
43 #include "cppimplgenerator.h"
e78566595089 initial import
mandel
parents:
diff changeset
44 #include "fileout.h"
e78566595089 initial import
mandel
parents:
diff changeset
45
e78566595089 initial import
mandel
parents:
diff changeset
46 static Indentor INDENT;
e78566595089 initial import
mandel
parents:
diff changeset
47
167
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
48 ContainerGenerator::ContainerGenerator(CppImplGenerator *cpp_impl_generator):
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
49 DGenerator(), m_cpp_impl_generator(cpp_impl_generator)
1
e78566595089 initial import
mandel
parents:
diff changeset
50
e78566595089 initial import
mandel
parents:
diff changeset
51 {
e78566595089 initial import
mandel
parents:
diff changeset
52 setFilenameStub("ArrayOps");
e78566595089 initial import
mandel
parents:
diff changeset
53 excludedTypes.clear();
e78566595089 initial import
mandel
parents:
diff changeset
54
e78566595089 initial import
mandel
parents:
diff changeset
55 // qtd2
e78566595089 initial import
mandel
parents:
diff changeset
56 excludedTypes << "QFuture";
e78566595089 initial import
mandel
parents:
diff changeset
57 }
e78566595089 initial import
mandel
parents:
diff changeset
58
e78566595089 initial import
mandel
parents:
diff changeset
59 QString ContainerGenerator::subDirectoryForPackage(const QString &package, OutputDirectoryType type) const
e78566595089 initial import
mandel
parents:
diff changeset
60 {
e78566595089 initial import
mandel
parents:
diff changeset
61 switch (type) {
e78566595089 initial import
mandel
parents:
diff changeset
62 case CppDirectory:
e78566595089 initial import
mandel
parents:
diff changeset
63 return "cpp/" + QString(package).replace(".", "_") + "/";
e78566595089 initial import
mandel
parents:
diff changeset
64 case DDirectory:
e78566595089 initial import
mandel
parents:
diff changeset
65 return QString(package).replace(".", "/");
e78566595089 initial import
mandel
parents:
diff changeset
66 case HDirectory:
e78566595089 initial import
mandel
parents:
diff changeset
67 return "include/";
e78566595089 initial import
mandel
parents:
diff changeset
68 default:
e78566595089 initial import
mandel
parents:
diff changeset
69 return QString(); // kill nonsense warnings
e78566595089 initial import
mandel
parents:
diff changeset
70 }
e78566595089 initial import
mandel
parents:
diff changeset
71 }
e78566595089 initial import
mandel
parents:
diff changeset
72
e78566595089 initial import
mandel
parents:
diff changeset
73 void ContainerGenerator::write(QTextStream &, const AbstractMetaClass *)
e78566595089 initial import
mandel
parents:
diff changeset
74 {
e78566595089 initial import
mandel
parents:
diff changeset
75 // not used
e78566595089 initial import
mandel
parents:
diff changeset
76 }
e78566595089 initial import
mandel
parents:
diff changeset
77
e78566595089 initial import
mandel
parents:
diff changeset
78 void ContainerGenerator::addTypeEntry(const TypeEntry* te)
e78566595089 initial import
mandel
parents:
diff changeset
79 {
e78566595089 initial import
mandel
parents:
diff changeset
80 if (!excludedTypes.contains(te->name()))
e78566595089 initial import
mandel
parents:
diff changeset
81 containerTypes << te;
e78566595089 initial import
mandel
parents:
diff changeset
82 }
e78566595089 initial import
mandel
parents:
diff changeset
83
e78566595089 initial import
mandel
parents:
diff changeset
84 void ContainerGenerator::processType(AbstractMetaType *d_type)
e78566595089 initial import
mandel
parents:
diff changeset
85 {
e78566595089 initial import
mandel
parents:
diff changeset
86 if (d_type->isContainer()) {
e78566595089 initial import
mandel
parents:
diff changeset
87 QList<AbstractMetaType *> args = d_type->instantiations();
e78566595089 initial import
mandel
parents:
diff changeset
88
e78566595089 initial import
mandel
parents:
diff changeset
89 if (args.size() == 1) // QVector or QList
e78566595089 initial import
mandel
parents:
diff changeset
90 if (args.at(0)->typeEntry()->isComplex()
e78566595089 initial import
mandel
parents:
diff changeset
91 && !args.at(0)->isContainer()
e78566595089 initial import
mandel
parents:
diff changeset
92 && !args.at(0)->isTargetLangString())
e78566595089 initial import
mandel
parents:
diff changeset
93 addTypeEntry(args.at(0)->typeEntry()); // qMakePair(args.at(0)->typeEntry(), m_class);
e78566595089 initial import
mandel
parents:
diff changeset
94 }
e78566595089 initial import
mandel
parents:
diff changeset
95 }
e78566595089 initial import
mandel
parents:
diff changeset
96
e78566595089 initial import
mandel
parents:
diff changeset
97 void ContainerGenerator::processFunction(const AbstractMetaFunction *d_function)
e78566595089 initial import
mandel
parents:
diff changeset
98 {
e78566595089 initial import
mandel
parents:
diff changeset
99 if (notWrappedYet(d_function)) // qtd2
e78566595089 initial import
mandel
parents:
diff changeset
100 return;
e78566595089 initial import
mandel
parents:
diff changeset
101
e78566595089 initial import
mandel
parents:
diff changeset
102 if (d_function->type()) {
e78566595089 initial import
mandel
parents:
diff changeset
103 AbstractMetaType *d_type = d_function->type();
e78566595089 initial import
mandel
parents:
diff changeset
104 if (d_type->isContainer()) {
e78566595089 initial import
mandel
parents:
diff changeset
105 processType(d_type);
e78566595089 initial import
mandel
parents:
diff changeset
106 }
e78566595089 initial import
mandel
parents:
diff changeset
107 }
e78566595089 initial import
mandel
parents:
diff changeset
108
e78566595089 initial import
mandel
parents:
diff changeset
109 AbstractMetaArgumentList arguments = d_function->arguments();
e78566595089 initial import
mandel
parents:
diff changeset
110 for (int i=0; i<arguments.count(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
111 const AbstractMetaArgument *arg = arguments.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
112 processType(arg->type());
e78566595089 initial import
mandel
parents:
diff changeset
113 }
e78566595089 initial import
mandel
parents:
diff changeset
114 }
e78566595089 initial import
mandel
parents:
diff changeset
115
e78566595089 initial import
mandel
parents:
diff changeset
116 void ContainerGenerator::buildTypeList()
e78566595089 initial import
mandel
parents:
diff changeset
117 {
e78566595089 initial import
mandel
parents:
diff changeset
118 foreach (AbstractMetaClass *d_class, classes()) {
e78566595089 initial import
mandel
parents:
diff changeset
119 m_class = d_class;
e78566595089 initial import
mandel
parents:
diff changeset
120 AbstractMetaFunctionList d_funcs = d_class->functionsInTargetLang();
e78566595089 initial import
mandel
parents:
diff changeset
121 for (int i=0; i<d_funcs.size(); ++i) {
e78566595089 initial import
mandel
parents:
diff changeset
122 AbstractMetaFunction *function = d_funcs.at(i);
e78566595089 initial import
mandel
parents:
diff changeset
123
e78566595089 initial import
mandel
parents:
diff changeset
124 // If a method in an interface class is modified to be private, this should
e78566595089 initial import
mandel
parents:
diff changeset
125 // not be present in the interface at all, only in the implementation.
e78566595089 initial import
mandel
parents:
diff changeset
126 if (d_class->isInterface()) {
e78566595089 initial import
mandel
parents:
diff changeset
127 uint includedAttributes = 0;
e78566595089 initial import
mandel
parents:
diff changeset
128 uint excludedAttributes = 0;
e78566595089 initial import
mandel
parents:
diff changeset
129 retrieveModifications(function, d_class, &excludedAttributes, &includedAttributes);
e78566595089 initial import
mandel
parents:
diff changeset
130 if (includedAttributes & AbstractMetaAttributes::Private)
e78566595089 initial import
mandel
parents:
diff changeset
131 continue;
e78566595089 initial import
mandel
parents:
diff changeset
132 }
e78566595089 initial import
mandel
parents:
diff changeset
133
e78566595089 initial import
mandel
parents:
diff changeset
134 processFunction(function);
e78566595089 initial import
mandel
parents:
diff changeset
135 }
167
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
136
1
e78566595089 initial import
mandel
parents:
diff changeset
137 AbstractMetaFieldList fields = d_class->fields();
e78566595089 initial import
mandel
parents:
diff changeset
138 foreach (const AbstractMetaField *field, fields) {
e78566595089 initial import
mandel
parents:
diff changeset
139 if (field->wasPublic() || (field->wasProtected() && !d_class->isFinal())) {
e78566595089 initial import
mandel
parents:
diff changeset
140 processFunction(field->setter());
e78566595089 initial import
mandel
parents:
diff changeset
141 processFunction(field->getter());
e78566595089 initial import
mandel
parents:
diff changeset
142 }
e78566595089 initial import
mandel
parents:
diff changeset
143 }
e78566595089 initial import
mandel
parents:
diff changeset
144
167
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
145 AbstractMetaFunctionList signal_funcs = signalFunctions(d_class);
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
146 for(int i = 0; i < signal_funcs.size(); i++) {
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
147 AbstractMetaFunction *signal = signal_funcs.at(i);
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
148
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
149 AbstractMetaArgumentList arguments = signal->arguments();
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
150 foreach (AbstractMetaArgument *argument, arguments) {
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
151 if(argument->type()->isContainer()) {
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
152 bool inList = false;
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
153 foreach(AbstractMetaType* type, signalEntries[d_class->package()]) {
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
154 const TypeEntry *teInList = type->instantiations().first()->typeEntry();
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
155 const TypeEntry *te = argument->type()->instantiations().first()->typeEntry();
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
156
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
157 if ((te == teInList) && (argument->type()->typeEntry() == type->typeEntry()))
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
158 inList = true;
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
159 }
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
160 if (!inList)
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
161 (signalEntries[d_class->package()]) << argument->type();
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
162 // (signalEntries[d_class->package()])[argument->type()->instantiations().first()->typeEntry()] = argument->type();
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
163 }
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
164 }
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
165 }
1
e78566595089 initial import
mandel
parents:
diff changeset
166 }
e78566595089 initial import
mandel
parents:
diff changeset
167 }
e78566595089 initial import
mandel
parents:
diff changeset
168
e78566595089 initial import
mandel
parents:
diff changeset
169 void ContainerGenerator::generate()
e78566595089 initial import
mandel
parents:
diff changeset
170 {
e78566595089 initial import
mandel
parents:
diff changeset
171 buildTypeList();
e78566595089 initial import
mandel
parents:
diff changeset
172
e78566595089 initial import
mandel
parents:
diff changeset
173 writeFile(cppFilename(), CppDirectory, &ContainerGenerator::writeCppContent); // cpp file
e78566595089 initial import
mandel
parents:
diff changeset
174 writeFile("ArrayOps_%1.h", HDirectory, &ContainerGenerator::writeHeaderContent); // header file
e78566595089 initial import
mandel
parents:
diff changeset
175 writeFile(dFilename(), DDirectory, &ContainerGenerator::writeDContent); // d file
167
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
176 writeFile("ArrayOps2.d", DDirectory, &ContainerGenerator::writeDContent2); // d file
1
e78566595089 initial import
mandel
parents:
diff changeset
177 }
e78566595089 initial import
mandel
parents:
diff changeset
178
e78566595089 initial import
mandel
parents:
diff changeset
179 void ContainerGenerator::writeFile(const QString& fileName, OutputDirectoryType dirType, WriteOut writeOut)
e78566595089 initial import
mandel
parents:
diff changeset
180 {
e78566595089 initial import
mandel
parents:
diff changeset
181 AbstractMetaClassList classList = classes();
e78566595089 initial import
mandel
parents:
diff changeset
182 QHash<QString, FileOut *> fileHash;
e78566595089 initial import
mandel
parents:
diff changeset
183
e78566595089 initial import
mandel
parents:
diff changeset
184 // Seems continue is not supported by our foreach loop, so
e78566595089 initial import
mandel
parents:
diff changeset
185 foreach (AbstractMetaClass *cls, classList) {
e78566595089 initial import
mandel
parents:
diff changeset
186
e78566595089 initial import
mandel
parents:
diff changeset
187 FileOut *f = fileHash.value(cls->package(), 0);
e78566595089 initial import
mandel
parents:
diff changeset
188 if (f == 0) {
e78566595089 initial import
mandel
parents:
diff changeset
189 f = new FileOut(outputDirectory() + "/" + subDirectoryForPackage(cls->package(), dirType) + "/" +
e78566595089 initial import
mandel
parents:
diff changeset
190 fileName.arg(cls->package().replace(".", "_")));
e78566595089 initial import
mandel
parents:
diff changeset
191 writeNotice(f->stream);
e78566595089 initial import
mandel
parents:
diff changeset
192
e78566595089 initial import
mandel
parents:
diff changeset
193 (this->*writeOut)(f->stream, cls);
e78566595089 initial import
mandel
parents:
diff changeset
194
e78566595089 initial import
mandel
parents:
diff changeset
195 fileHash.insert(cls->package(), f);
e78566595089 initial import
mandel
parents:
diff changeset
196
e78566595089 initial import
mandel
parents:
diff changeset
197 // QString pro_file_name = cls->package().replace(".", "_") + "/" + cls->package().replace(".", "_") + ".pri";
e78566595089 initial import
mandel
parents:
diff changeset
198 // priGenerator->addSource(pro_file_name, cppFilename());
e78566595089 initial import
mandel
parents:
diff changeset
199 }
e78566595089 initial import
mandel
parents:
diff changeset
200 }
e78566595089 initial import
mandel
parents:
diff changeset
201
e78566595089 initial import
mandel
parents:
diff changeset
202 foreach (QString package, fileHash.keys()) {
e78566595089 initial import
mandel
parents:
diff changeset
203 FileOut *f = fileHash.value(package, 0);
e78566595089 initial import
mandel
parents:
diff changeset
204 if (f != 0) {
e78566595089 initial import
mandel
parents:
diff changeset
205 if( f->done() )
e78566595089 initial import
mandel
parents:
diff changeset
206 ++m_num_generated_written;
e78566595089 initial import
mandel
parents:
diff changeset
207 ++m_num_generated;
e78566595089 initial import
mandel
parents:
diff changeset
208
e78566595089 initial import
mandel
parents:
diff changeset
209 delete f;
e78566595089 initial import
mandel
parents:
diff changeset
210 }
e78566595089 initial import
mandel
parents:
diff changeset
211 }
e78566595089 initial import
mandel
parents:
diff changeset
212 }
e78566595089 initial import
mandel
parents:
diff changeset
213
e78566595089 initial import
mandel
parents:
diff changeset
214 void ContainerGenerator::writeCppContent(QTextStream &s, AbstractMetaClass *cls)
e78566595089 initial import
mandel
parents:
diff changeset
215 {
e78566595089 initial import
mandel
parents:
diff changeset
216 QString package = cls->package().replace(".", "_");
e78566595089 initial import
mandel
parents:
diff changeset
217
e78566595089 initial import
mandel
parents:
diff changeset
218 s << "// stuff for passing D function pointers" << endl << endl
167
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
219 << "#include \"qtd_masterinclude.h\"" << endl << endl
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
220 << "#include \"qtd_core.h\"" << endl
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
221 << "#include \"ArrayOps_" << package << ".h\"" << endl
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
222 << "#include \"ArrayOps_qt_core.h\"" << endl
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
223 << "#include \"ArrayOpsPrimitive.h\"" << endl << endl
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
224 << "#ifdef CPP_SHARED" << endl << endl;
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
225
1
e78566595089 initial import
mandel
parents:
diff changeset
226
e78566595089 initial import
mandel
parents:
diff changeset
227 foreach (const TypeEntry *te, containerTypes) {
e78566595089 initial import
mandel
parents:
diff changeset
228 if (te->javaPackage() == cls->package()) {
e78566595089 initial import
mandel
parents:
diff changeset
229 const ComplexTypeEntry *centry = static_cast<const ComplexTypeEntry *>(te);
e78566595089 initial import
mandel
parents:
diff changeset
230 QString cls_name = centry->name();
e78566595089 initial import
mandel
parents:
diff changeset
231
e78566595089 initial import
mandel
parents:
diff changeset
232 setFuncNames(cls_name);
e78566595089 initial import
mandel
parents:
diff changeset
233 s << "QTD_EXPORT_VAR(" << all_name << ")" << endl
e78566595089 initial import
mandel
parents:
diff changeset
234 << "QTD_EXPORT_VAR(" << ass_name << ")" << endl
e78566595089 initial import
mandel
parents:
diff changeset
235 << "QTD_EXPORT_VAR(" << get_name << ")" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
236 }
e78566595089 initial import
mandel
parents:
diff changeset
237 }
e78566595089 initial import
mandel
parents:
diff changeset
238
e78566595089 initial import
mandel
parents:
diff changeset
239 s << endl
e78566595089 initial import
mandel
parents:
diff changeset
240 << "extern \"C\" DLL_PUBLIC void qtd_" << cls->package().replace(".", "_") << "_ArrayOps_initCallBacks(pfunc_abstr *callbacks)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
241 << "{" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
242
e78566595089 initial import
mandel
parents:
diff changeset
243 int num_funcs = 0;
e78566595089 initial import
mandel
parents:
diff changeset
244 foreach (const TypeEntry *te, containerTypes) {
e78566595089 initial import
mandel
parents:
diff changeset
245 if (te->javaPackage() == cls->package()) {
e78566595089 initial import
mandel
parents:
diff changeset
246 const ComplexTypeEntry *centry = static_cast<const ComplexTypeEntry *>(te);
e78566595089 initial import
mandel
parents:
diff changeset
247 QString cls_name = centry->name();
e78566595089 initial import
mandel
parents:
diff changeset
248
e78566595089 initial import
mandel
parents:
diff changeset
249 setFuncNames(cls_name);
e78566595089 initial import
mandel
parents:
diff changeset
250 s << " QTD_EXPORT_VAR_SET(" << all_name << ", callbacks[" << num_funcs + 0 << "]);" << endl
e78566595089 initial import
mandel
parents:
diff changeset
251 << " QTD_EXPORT_VAR_SET(" << ass_name << ", callbacks[" << num_funcs + 1 << "]);" << endl
e78566595089 initial import
mandel
parents:
diff changeset
252 << " QTD_EXPORT_VAR_SET(" << get_name << ", callbacks[" << num_funcs + 2 << "]);" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
253
e78566595089 initial import
mandel
parents:
diff changeset
254 num_funcs += NUM_ARRAY_FUNCS;
e78566595089 initial import
mandel
parents:
diff changeset
255 }
e78566595089 initial import
mandel
parents:
diff changeset
256 }
e78566595089 initial import
mandel
parents:
diff changeset
257 s << "}" << endl
e78566595089 initial import
mandel
parents:
diff changeset
258 << "#endif" << endl;
167
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
259 /*
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
260 QMap<const TypeEntry*, AbstractMetaType*> typeList = signalEntries[cls->package()];
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
261
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
262 QMapIterator<const TypeEntry*, AbstractMetaType*> i(typeList);
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
263 while (i.hasNext()) {
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
264 i.next();
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
265 s << "// " << i.key()->targetLangName() << endl
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
266 << "extern \"C\" DLL_PUBLIC void qtd_" << package << "_" << i.key()->targetLangName() << "_to_d_array(void *cpp_ptr, DArray* __d_container) {" << endl;
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
267
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
268 AbstractMetaType *arg_type = i.value();
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
269 m_cpp_impl_generator->writeTypeInfo(s, arg_type, NoOption);
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
270 s << "container = (*reinterpret_cast< ";
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
271 m_cpp_impl_generator->writeTypeInfo(s, arg_type, ExcludeReference);
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
272 s << "(*)>(cpp_ptr));" << endl;
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
273
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
274 m_cpp_impl_generator->writeQtToJavaContainer(s, arg_type, "container", "__d_container", 0, -1);
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
275 s << "}" << endl;
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
276 }*/
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
277
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
278 foreach(AbstractMetaType* arg_type, signalEntries[cls->package()]) {
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
279 const TypeEntry *te = arg_type->instantiations().first()->typeEntry();
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
280 s << "// " << te->targetLangName() << endl
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
281 << "extern \"C\" DLL_PUBLIC void " << fromCppContainerName(cls, arg_type) << "(void *cpp_ptr, DArray* __d_container) {" << endl;
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
282
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
283 m_cpp_impl_generator->writeTypeInfo(s, arg_type, NoOption);
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
284 s << "container = (*reinterpret_cast< ";
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
285 m_cpp_impl_generator->writeTypeInfo(s, arg_type, ExcludeReference);
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
286 s << "(*)>(cpp_ptr));" << endl;
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
287
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
288 m_cpp_impl_generator->writeQtToJavaContainer(s, arg_type, "container", "__d_container", 0, -1);
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
289 s << "}" << endl;
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
290 }
1
e78566595089 initial import
mandel
parents:
diff changeset
291 }
e78566595089 initial import
mandel
parents:
diff changeset
292
e78566595089 initial import
mandel
parents:
diff changeset
293 void ContainerGenerator::writeHeaderContent(QTextStream &s, AbstractMetaClass *cls)
e78566595089 initial import
mandel
parents:
diff changeset
294 {
35
5917a613d118 wrapping of QtXml
eldar
parents: 1
diff changeset
295 QString file_upper = "ArrayOps_" + QString(cls->package()).replace(".", "_") + "_h";
5917a613d118 wrapping of QtXml
eldar
parents: 1
diff changeset
296 file_upper = file_upper.toUpper();
5917a613d118 wrapping of QtXml
eldar
parents: 1
diff changeset
297 s << "#ifndef " << file_upper << endl
5917a613d118 wrapping of QtXml
eldar
parents: 1
diff changeset
298 << "#define " << file_upper << endl << endl
5917a613d118 wrapping of QtXml
eldar
parents: 1
diff changeset
299 << "#include <cstring>" << endl
1
e78566595089 initial import
mandel
parents:
diff changeset
300 << "#include \"qtd_core.h\"" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
301
e78566595089 initial import
mandel
parents:
diff changeset
302 foreach (const TypeEntry *te, containerTypes) {
e78566595089 initial import
mandel
parents:
diff changeset
303 if (te->javaPackage() == cls->package()) {
e78566595089 initial import
mandel
parents:
diff changeset
304 const ComplexTypeEntry *typeEntry = static_cast<const ComplexTypeEntry *>(te);
e78566595089 initial import
mandel
parents:
diff changeset
305 s << "// " << typeEntry->name() << endl; // " in " << it.second->name() << endl;
e78566595089 initial import
mandel
parents:
diff changeset
306
e78566595089 initial import
mandel
parents:
diff changeset
307 Indentation indent(INDENT);
e78566595089 initial import
mandel
parents:
diff changeset
308 writeHeaderArrayFunctions(s, typeEntry);
e78566595089 initial import
mandel
parents:
diff changeset
309 }
e78566595089 initial import
mandel
parents:
diff changeset
310 }
35
5917a613d118 wrapping of QtXml
eldar
parents: 1
diff changeset
311
5917a613d118 wrapping of QtXml
eldar
parents: 1
diff changeset
312 s << "#endif // " << file_upper << endl;
1
e78566595089 initial import
mandel
parents:
diff changeset
313 }
e78566595089 initial import
mandel
parents:
diff changeset
314
e78566595089 initial import
mandel
parents:
diff changeset
315 void ContainerGenerator::setFuncNames(const QString& cls_name)
e78566595089 initial import
mandel
parents:
diff changeset
316 {
e78566595089 initial import
mandel
parents:
diff changeset
317 all_name = QString("qtd_allocate_%1_array").arg(cls_name);
e78566595089 initial import
mandel
parents:
diff changeset
318 ass_name = QString("qtd_assign_%1_array_element").arg(cls_name);
e78566595089 initial import
mandel
parents:
diff changeset
319 get_name = QString("qtd_get_%1_from_array").arg(cls_name);
e78566595089 initial import
mandel
parents:
diff changeset
320 }
e78566595089 initial import
mandel
parents:
diff changeset
321
e78566595089 initial import
mandel
parents:
diff changeset
322 void ContainerGenerator::writeHeaderArrayFunctions(QTextStream &s, const ComplexTypeEntry *centry)
e78566595089 initial import
mandel
parents:
diff changeset
323 {
e78566595089 initial import
mandel
parents:
diff changeset
324 QString cls_name = centry->name();
e78566595089 initial import
mandel
parents:
diff changeset
325 bool d_export = true;
e78566595089 initial import
mandel
parents:
diff changeset
326 QString d_type, cpp_type, cpp_type_assign;
e78566595089 initial import
mandel
parents:
diff changeset
327
e78566595089 initial import
mandel
parents:
diff changeset
328 if (centry->name() == "QModelIndex") {
e78566595089 initial import
mandel
parents:
diff changeset
329 cpp_type = "QModelIndexAccessor*";
e78566595089 initial import
mandel
parents:
diff changeset
330 } else if (centry->isStructInD()) {
e78566595089 initial import
mandel
parents:
diff changeset
331 cpp_type = centry->qualifiedCppName() + "*";
e78566595089 initial import
mandel
parents:
diff changeset
332 } else if (centry->isObject() || centry->isQObject() || centry->isValue() || centry->isInterface() || centry->isVariant()) {
e78566595089 initial import
mandel
parents:
diff changeset
333 cpp_type = "void*";
e78566595089 initial import
mandel
parents:
diff changeset
334 }
e78566595089 initial import
mandel
parents:
diff changeset
335
e78566595089 initial import
mandel
parents:
diff changeset
336 setFuncNames(cls_name);
e78566595089 initial import
mandel
parents:
diff changeset
337
e78566595089 initial import
mandel
parents:
diff changeset
338 s << "QTD_EXPORT(void, " << all_name << ", (void* arr, size_t len))" << endl
e78566595089 initial import
mandel
parents:
diff changeset
339 << "QTD_EXPORT(void, " << ass_name << ", (void* arr, size_t pos, " << cpp_type << " elem))" << endl
e78566595089 initial import
mandel
parents:
diff changeset
340 << "QTD_EXPORT(void, " << get_name << ", (void* arr, size_t pos, " << cpp_type << " elem))" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
341
e78566595089 initial import
mandel
parents:
diff changeset
342 s << "#ifdef CPP_SHARED" << endl
e78566595089 initial import
mandel
parents:
diff changeset
343 << "#define " << all_name << " qtd_get_" << all_name << "()" << endl
e78566595089 initial import
mandel
parents:
diff changeset
344 << "#define " << ass_name << " qtd_get_" << ass_name << "()" << endl
e78566595089 initial import
mandel
parents:
diff changeset
345 << "#define " << get_name << " qtd_get_" << get_name << "()" << endl
e78566595089 initial import
mandel
parents:
diff changeset
346 << "#endif" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
347
e78566595089 initial import
mandel
parents:
diff changeset
348 s << endl;
e78566595089 initial import
mandel
parents:
diff changeset
349 }
e78566595089 initial import
mandel
parents:
diff changeset
350
e78566595089 initial import
mandel
parents:
diff changeset
351 void ContainerGenerator::writeDContent(QTextStream &s, AbstractMetaClass *cls)
e78566595089 initial import
mandel
parents:
diff changeset
352 {
e78566595089 initial import
mandel
parents:
diff changeset
353 s << "module " << cls->package() << ".ArrayOps;" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
354
e78566595089 initial import
mandel
parents:
diff changeset
355 int num_funcs = 0;
e78566595089 initial import
mandel
parents:
diff changeset
356 foreach (const TypeEntry *te, containerTypes) {
e78566595089 initial import
mandel
parents:
diff changeset
357 if (te->javaPackage() == cls->package()) {
e78566595089 initial import
mandel
parents:
diff changeset
358 const ComplexTypeEntry *typeEntry = static_cast<const ComplexTypeEntry *>(te);
e78566595089 initial import
mandel
parents:
diff changeset
359 s << "// " << typeEntry->name() << endl;
e78566595089 initial import
mandel
parents:
diff changeset
360 writeImportString(s, typeEntry);
e78566595089 initial import
mandel
parents:
diff changeset
361 s << endl;
e78566595089 initial import
mandel
parents:
diff changeset
362
e78566595089 initial import
mandel
parents:
diff changeset
363 Indentation indent(INDENT);
e78566595089 initial import
mandel
parents:
diff changeset
364
e78566595089 initial import
mandel
parents:
diff changeset
365 writeArrayFunctions(s, typeEntry);
e78566595089 initial import
mandel
parents:
diff changeset
366 s << endl;
e78566595089 initial import
mandel
parents:
diff changeset
367 num_funcs += NUM_ARRAY_FUNCS;
e78566595089 initial import
mandel
parents:
diff changeset
368 }
e78566595089 initial import
mandel
parents:
diff changeset
369 }
e78566595089 initial import
mandel
parents:
diff changeset
370 if (num_funcs == 0)
e78566595089 initial import
mandel
parents:
diff changeset
371 return;
e78566595089 initial import
mandel
parents:
diff changeset
372
125
76e5e8597a83 fixes for ldc on windows
eldar
parents: 110
diff changeset
373 s << "version (cpp_shared) {" << endl
1
e78566595089 initial import
mandel
parents:
diff changeset
374 << " private extern (C) void qtd_" << cls->package().replace(".", "_") << "_ArrayOps_initCallBacks(void* callbacks);" << endl << endl
e78566595089 initial import
mandel
parents:
diff changeset
375 << " static this() {" << endl
e78566595089 initial import
mandel
parents:
diff changeset
376 << " void*[" << num_funcs << "] callbacks; " << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
377
e78566595089 initial import
mandel
parents:
diff changeset
378 num_funcs = 0;
e78566595089 initial import
mandel
parents:
diff changeset
379 foreach (const TypeEntry *te, containerTypes) {
e78566595089 initial import
mandel
parents:
diff changeset
380 if (te->javaPackage() == cls->package()) {
e78566595089 initial import
mandel
parents:
diff changeset
381 const ComplexTypeEntry *centry = static_cast<const ComplexTypeEntry *>(te);
e78566595089 initial import
mandel
parents:
diff changeset
382
e78566595089 initial import
mandel
parents:
diff changeset
383 QString cls_name = centry->name();
e78566595089 initial import
mandel
parents:
diff changeset
384 setFuncNames(cls_name);
e78566595089 initial import
mandel
parents:
diff changeset
385
e78566595089 initial import
mandel
parents:
diff changeset
386 s << " callbacks[" << num_funcs + 0 << "] = &" << all_name << ";" << endl
e78566595089 initial import
mandel
parents:
diff changeset
387 << " callbacks[" << num_funcs + 1 << "] = &" << ass_name << ";" << endl
e78566595089 initial import
mandel
parents:
diff changeset
388 << " callbacks[" << num_funcs + 2 << "] = &" << get_name << ";" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
389
e78566595089 initial import
mandel
parents:
diff changeset
390 s << endl;
e78566595089 initial import
mandel
parents:
diff changeset
391 num_funcs += NUM_ARRAY_FUNCS;
e78566595089 initial import
mandel
parents:
diff changeset
392 }
e78566595089 initial import
mandel
parents:
diff changeset
393 }
e78566595089 initial import
mandel
parents:
diff changeset
394 s << " qtd_" << cls->package().replace(".", "_") << "_ArrayOps_initCallBacks(callbacks.ptr);" << endl
e78566595089 initial import
mandel
parents:
diff changeset
395 << " }" << endl
e78566595089 initial import
mandel
parents:
diff changeset
396 << "}" << endl;
167
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
397
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
398
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
399 }
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
400
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
401 void ContainerGenerator::writeDContent2(QTextStream &s, AbstractMetaClass *cls)
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
402 {
179
d69b58c01131 fix ArrayOps2 bug
eldar
parents: 167
diff changeset
403 s << "module " << cls->package() << ".ArrayOps2;" << endl << endl
d69b58c01131 fix ArrayOps2 bug
eldar
parents: 167
diff changeset
404 << "import qt.QGlobal;" << endl << endl;
167
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
405
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
406 foreach(AbstractMetaType* arg_type, signalEntries[cls->package()]) {
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
407 const TypeEntry *te = arg_type->instantiations().first()->typeEntry();
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
408 if(!te->isPrimitive() && !te->isString())
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
409 writeImportString(s, te);
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
410 s << "extern (C) void " << fromCppContainerName(cls, arg_type) << "(void *cpp_ptr, " << te->targetLangName() << "[]* __d_container);" << endl;
ae06da58ec25 fixed hacky conversion of arguments when emmitting a signal
eldar
parents: 125
diff changeset
411 }
1
e78566595089 initial import
mandel
parents:
diff changeset
412 }
e78566595089 initial import
mandel
parents:
diff changeset
413
e78566595089 initial import
mandel
parents:
diff changeset
414 void ContainerGenerator::writeNotice(QTextStream &s)
e78566595089 initial import
mandel
parents:
diff changeset
415 {
e78566595089 initial import
mandel
parents:
diff changeset
416 s << "/****************************************************************************" << endl
e78566595089 initial import
mandel
parents:
diff changeset
417 << "**" << endl
e78566595089 initial import
mandel
parents:
diff changeset
418 << "** This is a generated file, please don't touch." << endl
e78566595089 initial import
mandel
parents:
diff changeset
419 << "**" << endl
e78566595089 initial import
mandel
parents:
diff changeset
420 << "****************************************************************************/" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
421 }
e78566595089 initial import
mandel
parents:
diff changeset
422
e78566595089 initial import
mandel
parents:
diff changeset
423 void ContainerGenerator::writeArrayFunctions(QTextStream &s, const ComplexTypeEntry *centry)
e78566595089 initial import
mandel
parents:
diff changeset
424 {
e78566595089 initial import
mandel
parents:
diff changeset
425 QString cls_name = centry->name();
e78566595089 initial import
mandel
parents:
diff changeset
426 QString type_name = cls_name;
e78566595089 initial import
mandel
parents:
diff changeset
427
e78566595089 initial import
mandel
parents:
diff changeset
428 bool d_export = true;
e78566595089 initial import
mandel
parents:
diff changeset
429 QString d_type, cpp_type, cpp_assign_type, convert, nativeId;
e78566595089 initial import
mandel
parents:
diff changeset
430
e78566595089 initial import
mandel
parents:
diff changeset
431 convert = "qtd_" + cls_name + "_cpp_to_d(elem)";
e78566595089 initial import
mandel
parents:
diff changeset
432 nativeId = "";
e78566595089 initial import
mandel
parents:
diff changeset
433
e78566595089 initial import
mandel
parents:
diff changeset
434 if (centry->name() == "QModelIndex") {
e78566595089 initial import
mandel
parents:
diff changeset
435 cpp_type = "QModelIndexAccessor*";
e78566595089 initial import
mandel
parents:
diff changeset
436 cpp_assign_type = cpp_type;
e78566595089 initial import
mandel
parents:
diff changeset
437 d_type = cpp_type;
e78566595089 initial import
mandel
parents:
diff changeset
438 convert = "*elem";
e78566595089 initial import
mandel
parents:
diff changeset
439 } else if (centry->isStructInD()) {
e78566595089 initial import
mandel
parents:
diff changeset
440 cpp_type = centry->qualifiedCppName() + "*";
e78566595089 initial import
mandel
parents:
diff changeset
441 cpp_assign_type = cpp_type;
e78566595089 initial import
mandel
parents:
diff changeset
442 d_type = cpp_type;
e78566595089 initial import
mandel
parents:
diff changeset
443 convert = "*elem";
e78566595089 initial import
mandel
parents:
diff changeset
444 } else if (centry->isObject() || centry->isQObject() || centry->isValue() || centry->isInterface() || centry->isVariant()) {
e78566595089 initial import
mandel
parents:
diff changeset
445 cpp_type = "void*";
e78566595089 initial import
mandel
parents:
diff changeset
446 cpp_assign_type = cpp_type + "*";
e78566595089 initial import
mandel
parents:
diff changeset
447 d_type = cls_name;
110
136c9ee83ee5 put conversion code in separate functions
eldar
parents: 35
diff changeset
448 if (centry->designatedInterface())
136c9ee83ee5 put conversion code in separate functions
eldar
parents: 35
diff changeset
449 d_type = centry->designatedInterface()->name();
248
7664de4a55e5 Fixed #23.
maxter
parents: 179
diff changeset
450 nativeId = ".__nativeId";
1
e78566595089 initial import
mandel
parents:
diff changeset
451 }
e78566595089 initial import
mandel
parents:
diff changeset
452
e78566595089 initial import
mandel
parents:
diff changeset
453 if (centry->designatedInterface()) {
e78566595089 initial import
mandel
parents:
diff changeset
454 type_name = centry->designatedInterface()->name();
e78566595089 initial import
mandel
parents:
diff changeset
455 nativeId = ".__ptr_" + type_name;
e78566595089 initial import
mandel
parents:
diff changeset
456 }
e78566595089 initial import
mandel
parents:
diff changeset
457
e78566595089 initial import
mandel
parents:
diff changeset
458 s << "private extern(C) void qtd_allocate_" << cls_name << "_array(" << type_name << "[]* arr, size_t len)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
459 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
460 << INDENT << "*arr = new " << type_name << "[len];" << endl
e78566595089 initial import
mandel
parents:
diff changeset
461 << "}" << endl << endl;
e78566595089 initial import
mandel
parents:
diff changeset
462
e78566595089 initial import
mandel
parents:
diff changeset
463 s << "private extern(C) void qtd_assign_" << cls_name << "_array_element(" << type_name << "[]* arr, size_t pos, " << cpp_type << " elem)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
464 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
465 << INDENT << "(*arr)[pos] = " << convert << ";" << endl
e78566595089 initial import
mandel
parents:
diff changeset
466 << "}" << endl << endl
e78566595089 initial import
mandel
parents:
diff changeset
467
e78566595089 initial import
mandel
parents:
diff changeset
468 << "private extern(C) void qtd_get_" << cls_name << "_from_array(" << type_name << "* arr, size_t pos, " << cpp_assign_type << " elem)" << endl
e78566595089 initial import
mandel
parents:
diff changeset
469 << "{" << endl
e78566595089 initial import
mandel
parents:
diff changeset
470 << INDENT << "*elem = arr[pos]" << nativeId << ";" << endl
e78566595089 initial import
mandel
parents:
diff changeset
471 << "}" << endl << endl
e78566595089 initial import
mandel
parents:
diff changeset
472
248
7664de4a55e5 Fixed #23.
maxter
parents: 179
diff changeset
473 << "package " << d_type << " qtd_" << cls_name << "_cpp_to_d(" << cpp_type << " ret)" << endl
1
e78566595089 initial import
mandel
parents:
diff changeset
474 << "{" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
475
e78566595089 initial import
mandel
parents:
diff changeset
476 marshallFromCppToD(s, centry);
e78566595089 initial import
mandel
parents:
diff changeset
477
e78566595089 initial import
mandel
parents:
diff changeset
478 s << "}" << endl;
e78566595089 initial import
mandel
parents:
diff changeset
479 }