fix trouble after extract improvements 93/16893/2
Antoine ELIAS [Fri, 24 Jul 2015 14:12:18 +0000 (16:12 +0200)]
test_run ast extractEmpty

Change-Id: I01c5c0e3754f6b8277c083cecfb2719d716cd46f

scilab/modules/ast/includes/types/arrayof.hxx
scilab/modules/ast/includes/types/cell.hxx
scilab/modules/ast/includes/types/struct.hxx
scilab/modules/ast/src/cpp/types/arrayof.cpp
scilab/modules/ast/src/cpp/types/cell.cpp
scilab/modules/ast/src/cpp/types/struct.cpp
scilab/modules/ast/src/cpp/types/types_tools.cpp
scilab/modules/ast/tests/unit_tests/extractEmpty.dia.ref [new file with mode: 0644]
scilab/modules/ast/tests/unit_tests/extractEmpty.tst [new file with mode: 0644]

index 5b2846c..8d1d382 100644 (file)
@@ -182,6 +182,11 @@ protected :
 
     virtual T               getNullValue() = 0;
     virtual ArrayOf<T>*     createEmpty(int _iDims, int* _piDims, bool _bComplex = false) = 0;
+    virtual InternalType*   createEmpty()
+    {
+        return createEmptyDouble();
+    }
+
     virtual T               copyValue(T _data) = 0;
     virtual T*              allocData(int _iSize) = 0;
     virtual void            deleteAll() = 0;
index 05e55f3..8ed40a5 100644 (file)
@@ -111,6 +111,7 @@ public :
 private :
     virtual InternalType*   getNullValue();
     virtual Cell*           createEmpty(int _iDims, int* _piDims, bool _bComplex = false);
+    virtual Cell*           createEmpty();
     virtual InternalType*   copyValue(InternalType* _pData);
     virtual void            deleteAll();
     virtual void            deleteImg();
index a385845..a276431 100644 (file)
@@ -133,6 +133,7 @@ public :
 private :
     virtual SingleStruct*       getNullValue();
     virtual Struct*             createEmpty(int _iDims, int* _piDims, bool _bComplex = false);
+    virtual Struct*             createEmpty();
     virtual SingleStruct*       copyValue(SingleStruct* _pData);
     virtual void                deleteAll();
     virtual void                deleteImg();
index c7ec479..e1887d9 100644 (file)
@@ -24,12 +24,6 @@ extern "C"
 
 namespace types
 {
-/*    template <typename T>
-ArrayOf<T>* createEmptyDouble()
-{
-return Double::Empty();
-}
-*/
 //n-uplet in french
 int computeTuples(int* _piCountDim, int _iDims, int _iCurrentDim, int* _piIndex)
 {
@@ -903,7 +897,7 @@ InternalType* ArrayOf<T>::remove(typed_list* _pArgs)
         //free pArg content
         cleanIndexesArguments(_pArgs, &pArg);
         delete[] piNewDims;
-        return createEmptyDouble();
+        return createEmpty();
     }
 
     if (iDims == 1)
@@ -984,6 +978,11 @@ InternalType* ArrayOf<T>::extract(typed_list* _pArgs)
     int index;
     if (getScalarIndex(this, _pArgs, &index))
     {
+        if (getSize() == 0)
+        {
+            return createEmpty();
+        }
+
         if (index < 0 || index >= getSize())
         {
             return NULL;
@@ -1011,9 +1010,9 @@ InternalType* ArrayOf<T>::extract(typed_list* _pArgs)
 
         //std::cout << start << ":" << step << ":" << end << std::endl;
         int size = static_cast<int>((end - start) / step + 1);
-        if (size <= 0)
+        if (size <= 0 || getSize() == 0)
         {
-            return createEmptyDouble();
+            return createEmpty();
         }
 
         bool isRowVector = getRows() == 1;
@@ -1049,7 +1048,7 @@ InternalType* ArrayOf<T>::extract(typed_list* _pArgs)
     {
         if (indexes.size() == 0)
         {
-            return createEmptyDouble();
+            return createEmpty();
         }
 
         if (dims.size() == 1)
@@ -1104,7 +1103,7 @@ InternalType* ArrayOf<T>::extract(typed_list* _pArgs)
         delete[] piCountDim;
         //free pArg content
         cleanIndexesArguments(_pArgs, &pArg);
-        return createEmptyDouble();
+        return createEmpty();
     }
 
     if (iSeqCount < 0)
@@ -1194,7 +1193,7 @@ InternalType* ArrayOf<T>::extract(typed_list* _pArgs)
             delete[] piCountDim;
             //free pArg content
             cleanIndexesArguments(_pArgs, &pArg);
-            return createEmptyDouble();
+            return createEmpty();
         }
         else
         {
index 9714877..472c308 100644 (file)
@@ -464,4 +464,9 @@ void Cell::deleteData(InternalType* _pData)
         _pData->killMe();
     }
 }
+
+Cell* Cell::createEmpty()
+{
+    return new Cell();
+}
 }
index b2076b0..2e84b19 100644 (file)
@@ -377,6 +377,15 @@ void Struct::deleteImg()
     return;
 }
 
+bool Struct::isEmpty()
+{
+    if (getDims() == 2 && getRows() == 0 && getCols() == 0)
+    {
+        return true;
+    }
+    return false;
+}
+
 SingleStruct** Struct::allocData(int _iSize)
 {
     SingleStruct** pData = new SingleStruct*[_iSize];
@@ -708,4 +717,9 @@ void Struct::deleteData(SingleStruct* data)
         data->killMe();
     }
 }
+
+Struct* Struct::createEmpty()
+{
+    return new Struct();
+}
 }
index fd465ee..2e2291d 100644 (file)
@@ -639,7 +639,10 @@ int checkIndexesArguments(InternalType* _pRef, typed_list* _pArgsIn, typed_list*
 
 
     //return 0 to force extract to create an empty matrix
-    if (_pRef &&  _pRef->isDouble() && _pRef->getAs<Double>()->isEmpty())
+    if (_pRef &&
+            (_pRef->isDouble() && _pRef->getAs<Double>()->isEmpty() ||
+             _pRef->isCell() && _pRef->getAs<Cell>()->isEmpty() ||
+             _pRef->isStruct() && _pRef->getAs<Struct>()->isEmpty()))
     {
         return 0;
     }
diff --git a/scilab/modules/ast/tests/unit_tests/extractEmpty.dia.ref b/scilab/modules/ast/tests/unit_tests/extractEmpty.dia.ref
new file mode 100644 (file)
index 0000000..f59ab54
--- /dev/null
@@ -0,0 +1,31 @@
+// ============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// ============================================================================
+// <-- JVM NOT MANDATORY -->
+a = [];
+assert_checkequal(a(5), a);
+assert_checkequal(a(:), a);
+assert_checkequal(a(1:2), a);
+assert_checkequal(a(:,:), a);
+assert_checkequal(a(1:2,1:2), a);
+assert_checkequal(a(%t), a);
+assert_checkequal(a(%f), a);
+a = {};
+assert_checkequal(a(5), a);
+assert_checkequal(a(:), a);
+assert_checkequal(a(1:2), a);
+assert_checkequal(a(:,:), a);
+assert_checkequal(a(1:2,1:2), a);
+assert_checkequal(a(%t), a);
+assert_checkequal(a(%f), a);
+a = struct();
+assert_checkequal(a(5), a);
+assert_checkequal(a(:), a);
+assert_checkequal(a(1:2), a);
+assert_checkequal(a(:,:), a);
+assert_checkequal(a(1:2,1:2), a);
+assert_checkequal(a(%t), a);
+assert_checkequal(a(%f), a);
diff --git a/scilab/modules/ast/tests/unit_tests/extractEmpty.tst b/scilab/modules/ast/tests/unit_tests/extractEmpty.tst
new file mode 100644 (file)
index 0000000..cc97834
--- /dev/null
@@ -0,0 +1,35 @@
+// ============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Antoine ELIAS
+//
+//  This file is distributed under the same license as the Scilab package.
+// ============================================================================
+
+// <-- JVM NOT MANDATORY -->
+
+a = [];
+assert_checkequal(a(5), a);
+assert_checkequal(a(:), a);
+assert_checkequal(a(1:2), a);
+assert_checkequal(a(:,:), a);
+assert_checkequal(a(1:2,1:2), a);
+assert_checkequal(a(%t), a);
+assert_checkequal(a(%f), a);
+
+a = {};
+assert_checkequal(a(5), a);
+assert_checkequal(a(:), a);
+assert_checkequal(a(1:2), a);
+assert_checkequal(a(:,:), a);
+assert_checkequal(a(1:2,1:2), a);
+assert_checkequal(a(%t), a);
+assert_checkequal(a(%f), a);
+
+a = struct();
+assert_checkequal(a(5), a);
+assert_checkequal(a(:), a);
+assert_checkequal(a(1:2), a);
+assert_checkequal(a(:,:), a);
+assert_checkequal(a(1:2,1:2), a);
+assert_checkequal(a(%t), a);
+assert_checkequal(a(%f), a);