Struct concatenation fixed 64/21264/2
Cedric Delamarre [Wed, 29 Jan 2020 11:03:31 +0000 (12:03 +0100)]
    test_run data_structure struct
    test_run data_structure struct mode_nwni_profiling

Change-Id: I57a51c1463890f992fccb0d1ca6682d1efa31fe5

scilab/modules/ast/includes/types/struct.hxx
scilab/modules/ast/src/cpp/types/struct.cpp
scilab/modules/data_structures/tests/unit_tests/struct.tst

index edf3714..fed2e47 100644 (file)
@@ -33,7 +33,7 @@ public :
     ~Struct();
     Struct();
     Struct(int _iRows, int _iCols);
-    Struct(int _iDims, const int* _piDims);
+    Struct(int _iDims, const int* _piDims, bool _bFillIt = true);
 
 private :
     Struct(Struct* _oCellCopyMe);
index dd3a735..50efc08 100644 (file)
@@ -53,17 +53,23 @@ Struct::Struct(int _iRows, int _iCols)
 #endif
 }
 
-Struct::Struct(int _iDims, const int* _piDims)
+// _bFillIt: true, fill the struct by empty SingleStructs.
+// _bFillIt: false, Only alocate the array and fill each element by NULL.
+//           that mean you have to fill it by SingleStructs with ref set to 1.
+Struct::Struct(int _iDims, const int* _piDims, bool _bFillIt)
 {
     m_bDisableCloneInCopyValue = false;
-    SingleStruct** pIT  = NULL;
-    SingleStruct *p = new SingleStruct();
+    SingleStruct** pIT = NULL;
     create(_piDims, _iDims, &pIT, NULL);
-    for (int i = 0 ; i < getSize() ; i++)
+    if(_bFillIt)
     {
-        set(i, p);
+        SingleStruct *p = new SingleStruct();
+        for (int i = 0 ; i < getSize() ; i++)
+        {
+            set(i, p);
+        }
+        p->killMe();
     }
-    p->killMe();
 
 #ifndef NDEBUG
     Inspector::addItem(this);
@@ -141,16 +147,18 @@ bool Struct::transpose(InternalType *& out)
     if (m_iDims == 2)
     {
         int piDims[2] = {getCols(), getRows()};
-        Struct * pSt = new Struct(2, piDims);
-        out = pSt;
+        // dont fill the struct, transpose will do it.
+        Struct * pSt = new Struct(2, piDims, false);
+
+        Transposition::transpose_clone(getRows(), getCols(), m_pRealData, pSt->get());
+
         for (int i = 0; i < m_iSize; ++i)
         {
-            pSt->m_pRealData[i]->DecreaseRef();
-            pSt->m_pRealData[i]->killMe();
+            // Transposition::transpose_clone will increase ref of datas content in each SingleStruct but not the ref of itself.
+            pSt->get(i)->IncreaseRef();
         }
 
-        Transposition::transpose_clone(getRows(), getCols(), m_pRealData, pSt->m_pRealData);
-
+        out = pSt;
         return true;
     }
 
@@ -253,7 +261,7 @@ Struct* Struct::set(int _iIndex, SingleStruct* _pIT)
         m_pRealData[_iIndex] = copyValue(_pIT);
         if (m_bDisableCloneInCopyValue == false)
         {
-            //only in clone mode
+            // only in clone mode
             m_pRealData[_iIndex]->IncreaseRef();
         }
 
index 0a3faee..a8c5452 100644 (file)
@@ -45,7 +45,7 @@ foo(1) = 1;
 foo(2) = 2;
 foo(3) = 3;
 foo = foo([%T %F %T]);
-foo(3) = 2; 
+foo(3) = 2;
 if or([1; 3; 2] <> foo) then pause, end
 
 clear;
@@ -214,3 +214,13 @@ clear firstnames lastnames emails st
 fields = getfield(1,struct());
 assert_checkequal(fields(1), "st");
 assert_checkequal(fields(2), "dims");
+
+// struct concatenation
+clear st;
+st.a = [];
+st.a = [st.a;struct("field1", 1, "field2", 2)];
+st.a = [st.a;struct("field1", 1, "field2", 2)];
+st.a(1).field1 = 12;
+st.a(1).field2 = 42;
+assert_checkequal(st.a(1).field1, 12);
+assert_checkequal(st.a(1).field2, 42);