浏览代码

Adding private assignment operator and copy constructor in c++ generator (-weffc++) (#1648)

* Added initialisation list

* Added copyConstructor and assignment operator as private

Prepared declaration for copyConstructor

* removed copyConstructorDefinition
rherrmannr 8 年之前
父节点
当前提交
0ad4ecfb2e

+ 20 - 1
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StatemachineHeader.xtend

@@ -116,6 +116,12 @@ class StatemachineHeader extends org.yakindu.sct.generator.c.StatemachineHeader
 		'''
 			«entry.innerClassVisibility»:
 			
+				«IF (timed || hasOperationCallbacks)»
+				«copyConstructorDecl»
+				
+				«assignmentOperatorDecl»
+				«ENDIF»
+			
 				«FOR s : scopes.filter(typeof(InternalScope))»«s.createInterface»«ENDFOR»
 			
 				«statemachineTypeDecl»
@@ -125,7 +131,20 @@ class StatemachineHeader extends org.yakindu.sct.generator.c.StatemachineHeader
 		'''
 	}
 	
-	def protected generatePrivateClassmembers(ExecutionFlow it) {
+	
+	def protected copyConstructorDecl(ExecutionFlow it) {
+		'''
+		«module»(const «module» &rhs);
+		'''
+	}
+	
+	def protected assignmentOperatorDecl(ExecutionFlow it) {
+		'''
+			«module»& operator=(const «module»&);
+		'''
+	}
+	
+		def protected generatePrivateClassmembers(ExecutionFlow it) {
 		''''''
 	}
 

+ 27 - 8
plugins/org.yakindu.sct.generator.cpp/src/org/yakindu/sct/generator/cpp/StatemachineImplementation.xtend

@@ -89,6 +89,9 @@ class StatemachineImplementation implements IContentTemplate {
 	'''
 	}
 	
+
+		
+	
 	def protected usingNamespaces(ExecutionFlow it) {
 		''''''
 	}
@@ -98,26 +101,42 @@ class StatemachineImplementation implements IContentTemplate {
 		''''''
 	}
 	
-	def constructorDefinition(ExecutionFlow it) '''
-		«module»::«module»()
+	def constructorDefinition(ExecutionFlow it){
+	'''
+		«module»::«module»():
+			«initialisationList»
 		{
 			«constructorBody(it)»
 		}
 	'''
+	}
+	
+	def protected initialisationList(ExecutionFlow it) {
+		'''
+			«IF timed»«timerInstance»(null),«ENDIF»
+			stateConfVectorPosition(0)«FOR s : getInterfaces»,
+			«s.instance»()«IF s.hasOperations && !entry.useStaticOPC»,
+			«s.OCB_Instance»(null)«ENDIF»«ENDFOR»
+		'''
+	}
+	
+	def protected initialisationListCopy(ExecutionFlow it) {
+		'''
+			«IF timed»«timerInstance»(rhs.«timerInstance»),«ENDIF»
+			stateConfVectorPosition(rhs.stateConfVectorPosition)«FOR s : getInterfaces»,
+			«s.instance»(rhs.«s.instance»)«IF s.hasOperations && !entry.useStaticOPC»,
+			«s.OCB_Instance»(rhs.«s.OCB_Instance»)«ENDIF»«ENDFOR»
+		'''	
+	}
 	
 	protected def CharSequence constructorBody(ExecutionFlow it)
 		'''
-		«scopes.filter(typeof(StatechartScope)).filter[hasOperations && !entry.useStaticOPC].map['''«OCB_Instance» = null;'''].join('\n')»
+«««		«scopes.filter(typeof(StatechartScope)).filter[hasOperations && !entry.useStaticOPC].map['''«OCB_Instance» = null;'''].join('\n')»
 		«IF hasHistory»
 			for (int i = 0; i < «historyStatesConst»; ++i)
 				historyVector[i] = «null_state»;
 				
 		«ENDIF»
-		stateConfVectorPosition = 0;
-		
-		«IF timed»
-			«timerInstance» = null;
-		«ENDIF»
 		'''