From 951fb45c702107a43b4dc1d896ac22e351300fdc Mon Sep 17 00:00:00 2001
From: Gennady Pospelov <g.pospelov@fz-juelich.de>
Date: Tue, 3 Dec 2013 16:25:18 +0100
Subject: [PATCH] MultiLayer::clone changed to register
 children(layer,interfaces) in right order.

---
 App/src/TestMiscellaneous.cpp   |  7 +++++++
 Core/Samples/src/MultiLayer.cpp | 36 +++++++++++++++++++++------------
 2 files changed, 30 insertions(+), 13 deletions(-)

diff --git a/App/src/TestMiscellaneous.cpp b/App/src/TestMiscellaneous.cpp
index 6ab5d61c89c..b6a6283d640 100644
--- a/App/src/TestMiscellaneous.cpp
+++ b/App/src/TestMiscellaneous.cpp
@@ -92,6 +92,13 @@ void TestMiscellaneous::test_PrintVisitor()
 //    ISample *sample = factory.createSample("isgisaxs06_lattice1");
 //    sample->printSampleTree();
 
+//    MultiLayer ml;
+//    ml.addLayer(Layer());
+//    ml.addLayer(Layer());
+//    ml.printSampleTree();
+//    MultiLayer *ml2 = ml.clone();
+//    ml2->printSampleTree();
+
 }
 
 
diff --git a/Core/Samples/src/MultiLayer.cpp b/Core/Samples/src/MultiLayer.cpp
index 0d72e660d44..0c9cadc38de 100644
--- a/Core/Samples/src/MultiLayer.cpp
+++ b/Core/Samples/src/MultiLayer.cpp
@@ -46,14 +46,10 @@ void MultiLayer::init_parameters()
 /* ************************************************************************* */
 void MultiLayer::clear()
 {
-    for(size_t i=0; i<m_layers.size(); i++) {
-        if( m_layers[i] ) delete m_layers[i];
-    }
+    for(size_t i=0; i<m_layers.size(); i++) delete m_layers[i];
     m_layers.clear();
 
-    for(size_t i=0; i<m_interfaces.size(); i++) {
-        if( m_interfaces[i] ) delete m_interfaces[i];
-    }
+    for(size_t i=0; i<m_interfaces.size(); i++) delete m_interfaces[i];
     m_interfaces.clear();
 
     m_layers_z.clear();
@@ -70,13 +66,16 @@ MultiLayer *MultiLayer::clone() const
 
     newMultiLayer->m_layers_z = m_layers_z;
 
+    std::vector<Layer *> layer_buffer;
     for(size_t i=0; i<m_layers.size(); i++) {
-        newMultiLayer->addAndRegisterLayer( m_layers[i]->clone() );
+        layer_buffer.push_back(m_layers[i]->clone() );
     }
 
     for(size_t i=0; i<m_interfaces.size(); i++) {
-        const Layer *topLayer = newMultiLayer->m_layers[i];
-        const Layer *bottomLayer = newMultiLayer->m_layers[i+1];
+//        const Layer *topLayer = newMultiLayer->m_layers[i];
+//        const Layer *bottomLayer = newMultiLayer->m_layers[i+1];
+        const Layer *topLayer = layer_buffer[i];
+        const Layer *bottomLayer = layer_buffer[i+1];
 
         LayerInterface *newInterface(0);
         if(m_interfaces[i]->getRoughness()) {
@@ -86,8 +85,11 @@ MultiLayer *MultiLayer::clone() const
             newInterface = LayerInterface::createSmoothInterface(topLayer,
                     bottomLayer );
         }
+
+        newMultiLayer->addAndRegisterLayer( layer_buffer[i] );
         newMultiLayer->addAndRegisterInterface( newInterface );
     }
+    newMultiLayer->addAndRegisterLayer( layer_buffer.back() );
 
     newMultiLayer->m_crossCorrLength = m_crossCorrLength;
 
@@ -103,13 +105,19 @@ MultiLayer* MultiLayer::cloneInvertB() const
 
     newMultiLayer->m_layers_z = m_layers_z;
 
+//    for(size_t i=0; i<m_layers.size(); i++) {
+//        newMultiLayer->addAndRegisterLayer( m_layers[i]->cloneInvertB() );
+//    }
+    std::vector<Layer *> layer_buffer;
     for(size_t i=0; i<m_layers.size(); i++) {
-        newMultiLayer->addAndRegisterLayer( m_layers[i]->cloneInvertB() );
+        layer_buffer.push_back(m_layers[i]->cloneInvertB() );
     }
 
     for(size_t i=0; i<m_interfaces.size(); i++) {
-        const Layer *topLayer = newMultiLayer->m_layers[i];
-        const Layer *bottomLayer = newMultiLayer->m_layers[i+1];
+//        const Layer *topLayer = newMultiLayer->m_layers[i];
+//        const Layer *bottomLayer = newMultiLayer->m_layers[i+1];
+        const Layer *topLayer = layer_buffer[i];
+        const Layer *bottomLayer = layer_buffer[i+1];
 
         LayerInterface *newInterface(0);
         if(m_interfaces[i]->getRoughness()) {
@@ -119,8 +127,10 @@ MultiLayer* MultiLayer::cloneInvertB() const
             newInterface = LayerInterface::createSmoothInterface(topLayer,
                     bottomLayer );
         }
+        newMultiLayer->addAndRegisterLayer( layer_buffer[i] );
         newMultiLayer->addAndRegisterInterface( newInterface );
     }
+    newMultiLayer->addAndRegisterLayer( layer_buffer.back() );
 
     newMultiLayer->m_crossCorrLength = m_crossCorrLength;
 
@@ -155,8 +165,8 @@ void MultiLayer::addLayerWithTopRoughness(
         LayerInterface *interface =
             LayerInterface::createRoughInterface(
                 p_last_layer, p_new_layer, roughness);
-        addAndRegisterLayer(p_new_layer);
         addAndRegisterInterface(interface);
+        addAndRegisterLayer(p_new_layer);
         m_layers_z.push_back(m_layers_z.back() - layer.getThickness() );
         return;
     }
-- 
GitLab