Alien-SmokeQt
view release on metacpan or search on metacpan
generator/generators/smoke/writeClasses.cpp view on Meta::CPAN
out << QString("class %1").arg(smokeClassName);
if (!klass->isNameSpace()) {
out << QString(" : public %1").arg(className);
if (Util::hasClassVirtualDestructor(klass) && Util::hasClassPublicDestructor(klass)) {
out << ", public __internal_SmokeClass";
}
}
out << " {\n";
if (Util::canClassBeInstanciated(klass)) {
out << " SmokeBinding* _binding;\n";
out << "public:\n";
out << " void x_0(Smoke::Stack x) {\n";
out << " // set the smoke binding\n";
out << " _binding = (SmokeBinding*)x[1].s_class;\n";
out << " }\n";
switchOut << " case 0: xself->x_0(args);\tbreak;\n";
} else {
out << "public:\n";
}
int xcall_index = 1;
const Method *destructor = 0;
foreach (const Method& meth, klass->methods()) {
if (meth.access() == Access_private)
continue;
if (meth.isDestructor()) {
destructor = &meth;
continue;
}
switchOut << " case " << xcall_index << ": "
<< (((meth.flags() & Method::Static) || meth.isConstructor()) ? smokeClassName + "::" : "xself->")
<< "x_" << xcall_index << "(args);\tbreak;\n";
if (Util::fieldAccessors.contains(&meth)) {
// accessor method?
const Field* field = Util::fieldAccessors[&meth];
if (meth.name().startsWith("set")) {
generateSetAccessor(out, className, *field, meth.parameters()[0].type(), xcall_index);
} else {
generateGetAccessor(out, className, *field, meth.type(), xcall_index);
}
} else {
generateMethod(out, className, smokeClassName, meth, xcall_index, includes);
}
xcall_index++;
}
QString enumCode;
QTextStream enumOut(&enumCode);
const Enum* e = 0;
bool enumFound = false;
foreach (const BasicTypeDeclaration* decl, klass->children()) {
if (!(e = dynamic_cast<const Enum*>(decl)))
continue;
if (e->access() == Access_private)
continue;
foreach (const EnumMember& member, e->members()) {
switchOut << " case " << xcall_index << ": " << smokeClassName << "::x_" << xcall_index << "(args);\tbreak;\n";
if (e->parent())
generateEnumMemberCall(out, className, member.name(), xcall_index++);
else
generateEnumMemberCall(out, e->nameSpace(), member.name(), xcall_index++);
}
// only generate the xenum_call if the enum has a valid name
if (e->name().isEmpty())
continue;
enumFound = true;
// xenum_operation method code
QString enumString = e->toString();
enumOut << " case " << m_smokeData->typeIndex[&types[enumString]] << ": //" << enumString << '\n';
enumOut << " switch(xop) {\n";
enumOut << " case Smoke::EnumNew:\n";
enumOut << " xdata = (void*)new " << enumString << ";\n";
enumOut << " break;\n";
enumOut << " case Smoke::EnumDelete:\n";
enumOut << " delete (" << enumString << "*)xdata;\n";
enumOut << " break;\n";
enumOut << " case Smoke::EnumFromLong:\n";
enumOut << " *(" << enumString << "*)xdata = (" << enumString << ")xvalue;\n";
enumOut << " break;\n";
enumOut << " case Smoke::EnumToLong:\n";
enumOut << " xvalue = (long)*(" << enumString << "*)xdata;\n";
enumOut << " break;\n";
enumOut << " }\n";
enumOut << " break;\n";
}
foreach (const Method* meth, Util::virtualMethodsForClass(klass)) {
generateVirtualMethod(out, *meth, includes);
}
// this class contains enums, write out an xenum_operation method
if (enumFound) {
out << " static void xenum_operation(Smoke::EnumOperation xop, Smoke::Index xtype, void *&xdata, long &xvalue) {\n";
out << " switch(xtype) {\n";
out << enumCode;
out << " }\n";
out << " }\n";
}
// destructor
// if the class can't be instanstiated, a callback when it's deleted is unnecessary
if (Util::canClassBeInstanciated(klass)) {
out << " ~" << smokeClassName << "() ";
if (destructor && destructor->hasExceptionSpec()) {
out << "throw(";
for (int i = 0; i < destructor->exceptionTypes().count(); i++) {
if (i > 0) out << ", ";
out << destructor->exceptionTypes()[i].toString();
}
out << ") ";
}
out << QString("{ this->_binding->deleted(%1, (void*)this); }\n").arg(m_smokeData->classIndex[className]);
}
out << "};\n";
( run in 0.493 second using v1.01-cache-2.11-cpan-140bd7fdf52 )