Cell and Struct transpose improved 66/21266/2
Cedric Delamarre [Wed, 29 Jan 2020 14:46:34 +0000 (15:46 +0100)]
    test_run data_structures struct
    test_run data_structures struct mode_nwni_profiling

    test_run ast bug_16200
    test_run ast bug_16200 mode_nwni_profiling

Change-Id: If726cd5ff31b7b390b409ba30fc10cb0b8f5658e

scilab/modules/ast/includes/types/cell.hxx
scilab/modules/ast/includes/types/struct.hxx
scilab/modules/ast/src/cpp/types/cell.cpp
scilab/modules/ast/src/cpp/types/struct.cpp

index f7ecb1d..edda32c 100644 (file)
@@ -34,12 +34,15 @@ class EXTERN_AST Cell : public ArrayOf<InternalType*>
 public :
     ~Cell();
     Cell();
-    Cell(int _iRows, int _iCols, InternalType** data = nullptr);
-    Cell(int _iDims, const int* _piDims, InternalType** data = nullptr);
+    // _bInit: true, fill the struct by empty SingleStructs.
+    // _bInit: false, Only alocate the array and fill each element by NULL.
+    //           that mean you have to fill it by InternalTypes and increase there ref.
+    Cell(int _iRows, int _iCols, InternalType** data = nullptr, bool _bInit = true);
+    Cell(int _iDims, const int* _piDims, InternalType** data = nullptr, bool _bInit = true);
 
 private :
     Cell(Cell* _oCellCopyMe);
-    void createCell(int _iDims, const int* _piDims, InternalType** data);
+    void createCell(int _iDims, const int* _piDims, InternalType** data, bool _bInit);
 public :
 
     void                whoAmI(void) override
index fed2e47..fb0953f 100644 (file)
@@ -32,8 +32,11 @@ class EXTERN_AST Struct : public ArrayOf<SingleStruct*>
 public :
     ~Struct();
     Struct();
-    Struct(int _iRows, int _iCols);
-    Struct(int _iDims, const int* _piDims, bool _bFillIt = true);
+    // _bInit: true, fill the struct by empty SingleStructs.
+    // _bInit: false, Only alocate the array and fill each element by NULL.
+    //           that mean you have to fill it by SingleStructs and increase there ref.
+    Struct(int _iRows, int _iCols, bool _bInit = true);
+    Struct(int _iDims, const int* _piDims, bool _bInit = true);
 
 private :
     Struct(Struct* _oCellCopyMe);
index 62469a6..1748bb6 100644 (file)
@@ -37,18 +37,18 @@ namespace types
 Cell::Cell()
 {
     int piDims[2] = {0, 0};
-    createCell(2, piDims, nullptr);
+    createCell(2, piDims, nullptr, false);
 }
 
-Cell::Cell(int _iRows, int _iCols, InternalType** data)
+Cell::Cell(int _iRows, int _iCols, InternalType** data, bool _bInit)
 {
     int piDims[2] = {_iRows, _iCols};
-    createCell(2, piDims, data);
+    createCell(2, piDims, data, _bInit);
 }
 
-Cell::Cell(int _iDims, const int* _piDims, InternalType** data)
+Cell::Cell(int _iDims, const int* _piDims, InternalType** data, bool _bInit)
 {
-    createCell(_iDims, _piDims, data);
+    createCell(_iDims, _piDims, data, _bInit);
 }
 
 bool Cell::getMemory(long long* _piSize, long long* _piSizePlusType)
@@ -69,11 +69,11 @@ bool Cell::getMemory(long long* _piSize, long long* _piSizePlusType)
     return true;
 }
 
-void Cell::createCell(int _iDims, const int* _piDims, InternalType** data)
+void Cell::createCell(int _iDims, const int* _piDims, InternalType** data, bool _bInit)
 {
     InternalType** pIT = NULL;
     create(_piDims, _iDims, &pIT, NULL);
-    if( m_iSizeMax == 0)
+    if(m_iSizeMax == 0 || _bInit == false)
     {
         return;
     }
@@ -149,16 +149,16 @@ bool Cell::transpose(InternalType *& out)
 
     if (m_iDims == 2)
     {
-        Cell * pC = new Cell(getCols(), getRows());
-        out = pC;
-        for (int i = 0, k = 0; i < getCols(); i++, k += getRows())
+        // dont fill the Cell, transpose will do it.
+        Cell * pC = new Cell(getCols(), getRows(), nullptr, false);
+        Transposition::transpose(getRows(), getCols(), m_pRealData, pC->get());
+        for(int i = 0; i < getSize(); ++i)
         {
-            for (int j = 0, l = 0; j < getRows(); j++, l += getCols())
-            {
-                pC->set(i + l, m_pRealData[j + k]);
-            }
+            // Transposition::transpose doesn't increase the ref.
+            pC->get(i)->IncreaseRef();
         }
 
+        out = pC;
         return true;
     }
 
index 50efc08..c03ebc9 100644 (file)
@@ -35,33 +35,34 @@ Struct::Struct()
 #endif
 }
 
-Struct::Struct(int _iRows, int _iCols)
+Struct::Struct(int _iRows, int _iCols, bool _bInit)
 {
     m_bDisableCloneInCopyValue = false;
     SingleStruct** pIT  = NULL;
-    SingleStruct *p = new SingleStruct();
     int piDims[2] = {_iRows, _iCols};
     create(piDims, 2, &pIT, NULL);
-    for (int i = 0 ; i < getSize() ; i++)
+
+    if(_bInit)
     {
-        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);
 #endif
 }
 
-// _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)
+Struct::Struct(int _iDims, const int* _piDims, bool _bInit)
 {
     m_bDisableCloneInCopyValue = false;
     SingleStruct** pIT = NULL;
     create(_piDims, _iDims, &pIT, NULL);
-    if(_bFillIt)
+    if(_bInit)
     {
         SingleStruct *p = new SingleStruct();
         for (int i = 0 ; i < getSize() ; i++)
@@ -146,15 +147,12 @@ bool Struct::transpose(InternalType *& out)
 
     if (m_iDims == 2)
     {
-        int piDims[2] = {getCols(), getRows()};
-        // dont fill the struct, transpose will do it.
-        Struct * pSt = new Struct(2, piDims, false);
-
-        Transposition::transpose_clone(getRows(), getCols(), m_pRealData, pSt->get());
-
+        // dont fill the Struct, transpose will do it.
+        Struct * pSt = new Struct(getCols(), getRows(), false);
+        Transposition::transpose(getRows(), getCols(), m_pRealData, pSt->get());
         for (int i = 0; i < m_iSize; ++i)
         {
-            // Transposition::transpose_clone will increase ref of datas content in each SingleStruct but not the ref of itself.
+            // Transposition::transpose doesn't increase the ref.
             pSt->get(i)->IncreaseRef();
         }