157
154
// last thing..close our hashdefine
158
155
h << m_endl << "#endif // " << hashDefine + "_H" << m_endl;
162
158
void CppWriter::writeHeaderAccessorMethodDecl(UMLClassifier *c, Uml::Visibility permitScope, QTextStream &stream)
166
writeHeaderAttributeAccessorMethods(permitScope, true, stream); // write static attributes first
167
writeHeaderAttributeAccessorMethods(permitScope, false, stream);
161
writeHeaderAttributeAccessorMethods(c, permitScope, true, stream); // write static attributes first
162
writeHeaderAttributeAccessorMethods(c, permitScope, false, stream);
170
writeAssociationMethods(m_classifierInfo->plainAssociations, permitScope,
171
true, INLINE_ASSOCIATION_METHODS, true, c->getID(), stream);
172
writeAssociationMethods(m_classifierInfo->uniAssociations, permitScope,
173
true, INLINE_ASSOCIATION_METHODS, true, c->getID(), stream);
174
writeAssociationMethods(m_classifierInfo->aggregations, permitScope,
165
writeAssociationMethods(c->getSpecificAssocs(Uml::at_Association), permitScope,
166
true, INLINE_ASSOCIATION_METHODS, true, c->getID(), stream);
167
writeAssociationMethods(c->getUniAssociationToBeImplemented(), permitScope,
168
true, INLINE_ASSOCIATION_METHODS, true, c->getID(), stream);
169
writeAssociationMethods(c->getAggregations(), permitScope,
175
170
true, INLINE_ASSOCIATION_METHODS, true, c->getID(), stream);
176
writeAssociationMethods(m_classifierInfo->compositions, permitScope,
171
writeAssociationMethods(c->getCompositions(), permitScope,
177
172
true, INLINE_ASSOCIATION_METHODS, false, c->getID(), stream);
179
174
writeBlankLine(stream);
183
177
void CppWriter::writeHeaderFieldDecl(UMLClassifier *c, Uml::Visibility permitScope, QTextStream &stream)
186
writeAttributeDecls(permitScope, true, stream); // write static attributes first
187
writeAttributeDecls(permitScope, false, stream);
180
writeAttributeDecls(c, permitScope, true, stream); // write static attributes first
181
writeAttributeDecls(c, permitScope, false, stream);
190
writeAssociationDecls(m_classifierInfo->plainAssociations, permitScope, c->getID(), stream);
191
writeAssociationDecls(m_classifierInfo->uniAssociations, permitScope, c->getID(), stream);
192
writeAssociationDecls(m_classifierInfo->aggregations, permitScope, c->getID(), stream);
193
writeAssociationDecls(m_classifierInfo->compositions, permitScope, c->getID(), stream);
184
writeAssociationDecls(c->getSpecificAssocs(Uml::at_Association), permitScope, c->getID(), stream);
185
writeAssociationDecls(c->getUniAssociationToBeImplemented(), permitScope, c->getID(), stream);
186
writeAssociationDecls(c->getAggregations(), permitScope, c->getID(), stream);
187
writeAssociationDecls(c->getCompositions(), permitScope, c->getID(), stream);
197
void CppWriter::writeSourceFile (UMLClassifier *c, QFile &filecpp ) {
190
void CppWriter::writeSourceFile (UMLClassifier *c, QFile &filecpp )
199
192
// open stream for writing
200
193
QTextStream cpp (&filecpp);
255
247
// Accessor methods for attributes
256
248
const bool bInlineAccessors = policyExt()->getAccessorsAreInline();
257
if (!bInlineAccessors && m_classifierInfo->hasAttributes)
249
if (!bInlineAccessors && c->hasAttributes())
259
writeAttributeMethods(&(m_classifierInfo->static_atpub), Uml::Visibility::Public, false, true, !bInlineAccessors, cpp);
260
writeAttributeMethods(&(m_classifierInfo->atpub), Uml::Visibility::Public, false, false, !bInlineAccessors, cpp);
261
writeAttributeMethods(&(m_classifierInfo->static_atprot), Uml::Visibility::Protected, false, true, !bInlineAccessors, cpp);
262
writeAttributeMethods(&(m_classifierInfo->atprot), Uml::Visibility::Protected, false, false, !bInlineAccessors, cpp);
263
writeAttributeMethods(&(m_classifierInfo->static_atpriv), Uml::Visibility::Private, false, true, !bInlineAccessors, cpp);
264
writeAttributeMethods(&(m_classifierInfo->atpriv), Uml::Visibility::Private, false, false, !bInlineAccessors, cpp);
251
writeAttributeMethods(c->getAttributeListStatic(Uml::Visibility::Public), Uml::Visibility::Public, false, true, !bInlineAccessors, cpp);
252
writeAttributeMethods(c->getAttributeList(Uml::Visibility::Public), Uml::Visibility::Public, false, false, !bInlineAccessors, cpp);
253
writeAttributeMethods(c->getAttributeListStatic(Uml::Visibility::Protected), Uml::Visibility::Protected, false, true, !bInlineAccessors, cpp);
254
writeAttributeMethods(c->getAttributeList(Uml::Visibility::Protected), Uml::Visibility::Protected, false, false, !bInlineAccessors, cpp);
255
writeAttributeMethods(c->getAttributeListStatic(Uml::Visibility::Private), Uml::Visibility::Private, false, true, !bInlineAccessors, cpp);
256
writeAttributeMethods(c->getAttributeList(Uml::Visibility::Private), Uml::Visibility::Private, false, false, !bInlineAccessors, cpp);
267
259
// accessor methods for associations
270
writeAssociationMethods(m_classifierInfo->plainAssociations, Uml::Visibility::Public, false,
271
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
272
writeAssociationMethods(m_classifierInfo->uniAssociations, Uml::Visibility::Public, false,
273
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
274
writeAssociationMethods(m_classifierInfo->aggregations, Uml::Visibility::Public, false,
275
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
276
writeAssociationMethods(m_classifierInfo->compositions, Uml::Visibility::Public, false,
262
writeAssociationMethods(c->getSpecificAssocs(Uml::at_Association), Uml::Visibility::Public, false,
263
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
264
writeAssociationMethods(c->getUniAssociationToBeImplemented(), Uml::Visibility::Public, false,
265
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
266
writeAssociationMethods(c->getAggregations(), Uml::Visibility::Public, false,
267
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
268
writeAssociationMethods(c->getCompositions(), Uml::Visibility::Public, false,
277
269
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
280
writeAssociationMethods(m_classifierInfo->plainAssociations, Uml::Visibility::Protected, false,
281
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
282
writeAssociationMethods(m_classifierInfo->uniAssociations, Uml::Visibility::Protected, false,
283
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
284
writeAssociationMethods(m_classifierInfo->aggregations, Uml::Visibility::Protected, false,
285
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
286
writeAssociationMethods(m_classifierInfo->compositions, Uml::Visibility::Protected, false,
272
writeAssociationMethods(c->getSpecificAssocs(Uml::at_Association), Uml::Visibility::Protected, false,
273
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
274
writeAssociationMethods(c->getUniAssociationToBeImplemented(), Uml::Visibility::Protected, false,
275
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
276
writeAssociationMethods(c->getAggregations(), Uml::Visibility::Protected, false,
277
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
278
writeAssociationMethods(c->getCompositions(), Uml::Visibility::Protected, false,
287
279
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
291
writeAssociationMethods(m_classifierInfo->plainAssociations, Uml::Visibility::Private, false,
292
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
293
writeAssociationMethods(m_classifierInfo->uniAssociations, Uml::Visibility::Private, false,
294
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
295
writeAssociationMethods(m_classifierInfo->aggregations, Uml::Visibility::Private, false,
296
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
297
writeAssociationMethods(m_classifierInfo->compositions, Uml::Visibility::Private, false,
283
writeAssociationMethods(c->getSpecificAssocs(Uml::at_Association), Uml::Visibility::Private, false,
284
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
285
writeAssociationMethods(c->getUniAssociationToBeImplemented(), Uml::Visibility::Private, false,
286
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
287
writeAssociationMethods(c->getAggregations(), Uml::Visibility::Private, false,
288
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
289
writeAssociationMethods(c->getCompositions(), Uml::Visibility::Private, false,
298
290
!INLINE_ASSOCIATION_METHODS, true, c->getID(), cpp);
299
291
writeBlankLine(cpp);
336
327
writeBlankLine(cpp);
337
cpp << "#include " << policyExt()->getStringClassNameInclude() << m_endl;
338
if(m_classifierInfo->hasVectorFields)
328
cpp << "#include <" << policyExt()->getStringClassNameInclude() << ">" << m_endl;
329
if (c->hasVectorFields())
340
331
cpp << "#include " << policyExt()->getVectorClassNameInclude() << m_endl;
341
332
writeBlankLine(cpp);
344
if(m_classifierInfo->hasAssociations)
335
if (c->hasAssociations())
346
337
// write all includes we need to include other classes, that arent us.
347
printAssociationIncludeDecl (m_classifierInfo->plainAssociations, c->getID(), cpp);
348
printAssociationIncludeDecl (m_classifierInfo->uniAssociations, c->getID(), cpp);
349
printAssociationIncludeDecl (m_classifierInfo->aggregations, c->getID(), cpp);
350
printAssociationIncludeDecl (m_classifierInfo->compositions, c->getID(), cpp);
338
printAssociationIncludeDecl (c->getSpecificAssocs(Uml::at_Association), c->getID(), cpp);
339
printAssociationIncludeDecl (c->getUniAssociationToBeImplemented(), c->getID(), cpp);
340
printAssociationIncludeDecl (c->getAggregations(), c->getID(), cpp);
341
printAssociationIncludeDecl (c->getCompositions(), c->getID(), cpp);
352
343
writeBlankLine(cpp);
356
for(UMLClassifier *classifier = superclasses.first(); classifier ; classifier = superclasses.next()) {
357
if(classifier->getPackage()!=c->getPackage() && !classifier->getPackage().isEmpty()) {
346
foreach (UMLClassifier* classifier, superclasses ) {
347
if (classifier->getPackage()!=c->getPackage() && !classifier->getPackage().isEmpty()) {
358
348
cpp << "using " << cleanName(classifier->getPackage()) << "::" << cleanName(classifier->getName()) << ";" << m_endl;
362
if(!c->getPackage().isEmpty() && policyExt()->getPackageIsNamespace())
352
if (!c->getPackage().isEmpty() && policyExt()->getPackageIsNamespace())
363
353
cpp << m_endl << "namespace " << cleanName(c->getPackage()) << " {" << m_endl << m_endl;
365
355
//Write class Documentation if there is somthing or if force option
366
if(forceDoc() || !c->getDoc().isEmpty()) {
356
if (forceDoc() || !c->getDoc().isEmpty()) {
367
357
cpp << m_endl << "/**" << m_endl;
368
cpp << " * class " << m_classifierInfo->className << m_endl;
358
cpp << " * class " << className_ << m_endl;
369
359
cpp << formatDoc(c->getDoc()," * ");
371
361
writeBlankLine(cpp);
375
365
//check if class is abstract and / or has abstract methods
376
if((c->getAbstract() || m_classifierInfo->isInterface )
366
if ((c->getAbstract() || c->isInterface())
377
367
&& !hasAbstractOps(c))
378
368
cpp << "/******************************* Abstract Class ****************************" << m_endl
379
<<m_classifierInfo->className << " does not have any pure virtual methods, but its author" << m_endl
380
<<" defined it as an abstract class, so you should not use it directly." << m_endl
381
<<" Inherit from it instead and create only objects from the derived classes" << m_endl
382
<<"*****************************************************************************/" << m_endl << m_endl;
369
<< className_ << " does not have any pure virtual methods, but its author" << m_endl
370
<< " defined it as an abstract class, so you should not use it directly." << m_endl
371
<< " Inherit from it instead and create only objects from the derived classes" << m_endl
372
<< "*****************************************************************************/" << m_endl << m_endl;
384
374
if (c->getBaseType() == Uml::ot_Enum) {
385
375
UMLClassifierListItemList litList = c->getFilteredList(Uml::ot_EnumLiteral);
387
cpp << "enum " << m_classifierInfo->className << " {" << m_endl;
388
for (UMLClassifierListItem *lit = litList.first(); lit; lit = litList.next()) {
377
cpp << "enum " << className_ << " {" << m_endl;
378
foreach (UMLClassifierListItem* lit, litList ) {
389
379
QString enumLiteral = cleanName(lit->getName());
390
380
cpp << getIndent() << enumLiteral;
391
if (++i < litList.count())
381
if (++i < ( uint )litList.count())
395
385
cpp << m_endl << "};" << m_endl; // end of class header
396
if(!c->getPackage().isEmpty() && policyExt()->getPackageIsNamespace())
386
if (!c->getPackage().isEmpty() && policyExt()->getPackageIsNamespace())
397
387
cpp << "} // end of package namespace" << m_endl;
995
927
writeDocumentation("", "Empty Constructor", "", stream);
996
stream << getIndent() << m_classifierInfo->className << " ( );" << m_endl;
928
stream << getIndent() << className_ << " ( );" << m_endl;
997
929
writeDocumentation("", "Empty Destructor", "", stream);
998
930
stream << getIndent();
999
stream << "virtual ~" << m_classifierInfo->className << " ( );" << m_endl;
931
stream << "virtual ~" << className_ << " ( );" << m_endl;
1000
932
writeBlankLine(stream);
1003
void CppWriter::writeInitAttibuteDecl (QTextStream &stream)
935
void CppWriter::writeInitAttributeDecl(UMLClassifier * c, QTextStream &stream)
1005
937
if (UMLApp::app()->getCommonPolicy()->getAutoGenerateConstructors() &&
1006
m_classifierInfo->hasAttributes)
1007
939
stream << getIndent() << "void initAttributes ( ) ;" << m_endl;
1010
void CppWriter::writeInitAttibuteMethod (QTextStream &stream)
942
void CppWriter::writeInitAttributeMethod(UMLClassifier * c, QTextStream &stream)
1012
944
// only need to do this under certain conditions
1013
945
if (!UMLApp::app()->getCommonPolicy()->getAutoGenerateConstructors() ||
1014
!m_classifierInfo->hasAttributes)
1017
QString className = m_classifierInfo->className;
1018
949
QString indent = getIndent();
1020
stream << indent << "void " << className << "::" << "initAttributes ( ) {" << m_endl;
951
stream << indent << "void " << className_ << "::" << "initAttributes ( ) {" << m_endl;
1022
953
m_indentLevel++;
1023
954
// first, initiation of fields derived from attributes
1024
UMLAttributeList atl = m_classifierInfo->getAttList();
1025
for(UMLAttribute *at = atl.first(); at ; at = atl.next()) {
955
UMLAttributeList atl = c->getAttributeList();
956
foreach (UMLAttribute* at, atl ) {
1026
957
if(!at->getInitialValue().isEmpty()) {
1027
958
QString varName = getAttributeVariableName(at);
1028
959
stream << getIndent() << varName << " = " << at->getInitialValue() << ";" << m_endl;
1168
1093
str += methodReturnType + ' ';
1170
1095
if (!isHeaderMethod)
1171
str += className + "::";
1096
str += className_ + "::";
1173
1098
str += cleanName(op->getName()) + " (";
1175
1100
// generate parameters
1177
for (UMLAttribute *at = atl.first(); at; at = atl.next(), j++) {
1102
for (UMLAttributeListIt atlIt( atl ); atlIt.hasNext() ; j++) {
1103
UMLAttribute* at = atlIt.next();
1178
1104
QString typeName = fixTypeName(at->getTypeName());
1179
1105
QString atName = cleanName(at->getName());
1180
1106
str += typeName + ' ' + atName;
1181
1107
const QString initVal = at->getInitialValue();
1182
1108
if (! initVal.isEmpty())
1183
1109
str += " = " + initVal;
1184
if (j < atl.count() - 1)
1110
if (j < ( uint )( atl.count() - 1 ))
1186
returnStr += "@param " + atName + ' ' + at->getDoc() + '\n';
1112
doc += "@param " + atName + ' ' + at->getDoc() + m_endl;
1114
doc = doc.remove(doc.size() - 1, 1); // remove last endl of comment
1190
1117
if (op->getConst())
1191
1118
str += " const";
1193
1120
// method body : only gets IF its not in a header
1194
if (isHeaderMethod && !policyExt()->getOperationsAreInline())
1121
if (isHeaderMethod && !policyExt()->getOperationsAreInline()) {
1195
1122
str += ';'; // terminate now
1197
str +=getIndent() + " {\n\n" + getIndent() + '}'; // empty method body
1125
str += m_endl + getIndent() + '{' + m_endl;
1126
QString sourceCode = op->getSourceCode();
1127
if (sourceCode.isEmpty()) {
1128
// empty method body - TODO: throw exception
1131
str += formatSourceCode(sourceCode, getIndent() + getIndent());
1133
str += getIndent() + '}';
1199
1136
// write it out
1200
writeDocumentation("", op->getDoc(), returnStr, cpp);
1137
writeDocumentation("", op->getDoc(), doc, cpp);
1201
1138
cpp << getIndent() << str << m_endl;
1202
1139
writeBlankLine(cpp);