Scicos macros: add Scicos objects comparison 07/16707/6
Paul Bignier [Fri, 19 Jun 2015 08:17:27 +0000 (10:17 +0200)]
 * Scilab 5 could compare Scicos objects (mlists), but YaSp needs specific comparison for each object (userType)

Change-Id: I680299a36fe20a0dfda8db84b1d6fea4d68a9b95

scilab/modules/ast/includes/operations/types_comparison_eq.hxx
scilab/modules/ast/includes/operations/types_comparison_ne.hxx
scilab/modules/ast/includes/types/user.hxx
scilab/modules/ast/src/cpp/operations/types_comparison_eq.cpp
scilab/modules/ast/src/cpp/operations/types_comparison_ne.cpp
scilab/modules/scicos/src/cpp/view_scilab/BaseAdapter.hxx
scilab/modules/scicos/tests/unit_tests/comparison.dia.ref [new file with mode: 0644]
scilab/modules/scicos/tests/unit_tests/comparison.tst [new file with mode: 0644]
scilab/modules/xcos/tests/unit_tests/xcosBlockInterface.dia.ref

index 35e5a5f..e5b4ce0 100644 (file)
@@ -96,6 +96,8 @@ DECLARE_COMPARISON_EQUAL_PROTO(compequal_LT_LT);
 
 DECLARE_COMPARISON_EQUAL_PROTO(compequal_MCR_MCR);
 
+DECLARE_COMPARISON_EQUAL_PROTO(compequal_UT_UT);
+
 
 #undef DECLARE_COMPARISON_EQUAL_PROTO
 
index 263a07f..936c343 100644 (file)
@@ -96,6 +96,8 @@ DECLARE_COMPARISON_NO_EQUAL_PROTO(compnoequal_LT_LT);
 
 DECLARE_COMPARISON_NO_EQUAL_PROTO(compnoequal_MCR_MCR);
 
+DECLARE_COMPARISON_NO_EQUAL_PROTO(compnoequal_UT_UT);
+
 
 #undef DECLARE_COMPARISON_NO_EQUAL_PROTO
 
index 6459086..7afc758 100644 (file)
@@ -15,6 +15,7 @@
 #define __USER_HXX__
 
 #include "types.hxx"
+#include "bool.hxx"
 
 namespace types
 {
@@ -58,6 +59,11 @@ public :
     /*** User can overload these methods                            ***/
     /*** all methods not overloaded will call scilab overload       ***/
 
+    virtual Bool* equal(UserType*& /*ut*/)
+    {
+        return NULL;
+    }
+
     // hasToString return false so scilab will call overload %..._p
     // and toString method is useless
     // if user overload hasToString for return true, he must overload toString method
index 35495c8..fa31794 100644 (file)
@@ -25,6 +25,7 @@
 #include "macro.hxx"
 #include "macrofile.hxx"
 #include "overload.hxx"
+#include "user.hxx"
 
 using namespace types;
 
@@ -2119,6 +2120,9 @@ void fillComparisonEqualFunction()
     scilab_fill_comparisonequal(ScalarHandle, MacroFile, M_E, GraphicHandle, MacroFile, Bool);
     scilab_fill_comparisonequal(MacroFile, ScalarHandle, M_E, MacroFile, GraphicHandle, Bool);
 
+    //UserType
+    scilab_fill_comparisonequal(UserType, UserType, UT_UT, UserType, UserType, Bool);
+
 #undef scilab_fill_comparisonequal
 
 }
@@ -3600,6 +3604,7 @@ types::InternalType* compequal_M_M<Struct, Struct, Bool>(types::Struct* _pL, typ
     return pOut;
 }
 
+//List, TList, MList
 template<class T, class U, class O>
 InternalType* compequal_LT_LT(T *_pL, U *_pR)
 {
@@ -3741,3 +3746,10 @@ InternalType* compequal_MCR_MCR(T *_pL, U *_pR)
 
     return new Bool(ret);
 }
+
+//UserType
+template<class T, class U, class O>
+InternalType* compequal_UT_UT(T *_pL, U *_pR)
+{
+    return _pL->equal(_pR);
+}
index 125aaf1..6c24cff 100644 (file)
@@ -25,6 +25,7 @@
 #include "macro.hxx"
 #include "macrofile.hxx"
 #include "overload.hxx"
+#include "user.hxx"
 
 using namespace types;
 
@@ -2121,6 +2122,8 @@ void fillComparisonNoEqualFunction()
     scilab_fill_comparison_no_equal(ScalarHandle, MacroFile, M_E, GraphicHandle, MacroFile, Bool);
     scilab_fill_comparison_no_equal(MacroFile, ScalarHandle, M_E, MacroFile, GraphicHandle, Bool);
 
+    //UserType
+    scilab_fill_comparison_no_equal(UserType, UserType, UT_UT, UserType, UserType, Bool);
 
 #undef scilab_fill_comparison_no_equal
 
@@ -3749,3 +3752,17 @@ InternalType* compnoequal_MCR_MCR(T *_pL, U *_pR)
 
     return new Bool(ret);
 }
+
+//UserType
+template<class T, class U, class O>
+InternalType* compnoequal_UT_UT(T *_pL, U *_pR)
+{
+    // Get the equality and return its contrary
+    Bool* eq = _pL->equal(_pR);
+    for (int i = 0; i < eq->getSize(); ++i)
+    {
+        eq->set(i, !eq->get(i));
+    }
+
+    return eq;
+}
index ca55dbf..5c387de 100644 (file)
@@ -20,6 +20,7 @@
 #include <vector>
 #include <sstream>
 
+#include "bool.hxx"
 #include "double.hxx"
 #include "user.hxx"
 #include "internal.hxx"
@@ -231,6 +232,45 @@ public:
     }
 
     /**
+     * property comparison
+     */
+
+    types::Bool* equal(types::UserType*& ut)
+    {
+        const Adapters::adapters_index_t adapter_index = Adapters::instance().lookup_by_typename(ut->getShortTypeStr());
+        // Check that 'ut' is an Adapter of the same type as *this
+        if (adapter_index == Adapters::INVALID_ADAPTER)
+        {
+            return new types::Bool(false);
+        }
+        if (this->getTypeStr() != ut->getTypeStr())
+        {
+            return new types::Bool(false);
+        }
+
+        typename property<Adaptor>::props_t properties = property<Adaptor>::fields;
+        std::sort(properties.begin(), properties.end(), property<Adaptor>::original_index_cmp);
+
+        types::Bool* ret = new types::Bool(1, 1 + properties.size());
+        ret->set(0, true); // First field is just the Adapter's name, which has been checked by the above conditions
+
+        Controller controller = Controller();
+        int index = 1;
+        for (typename property<Adaptor>::props_t_it it = properties.begin(); it != properties.end(); ++it, ++index)
+        {
+            types::InternalType* ith_prop1 = it->get(*static_cast<Adaptor*>(this), controller);
+            types::InternalType* ith_prop2 = it->get(*static_cast<Adaptor*>(ut), controller);
+            ret->set(index, *ith_prop1 == *ith_prop2);
+
+            // Getting a property allocates data, so free it
+            ith_prop1->killMe();
+            ith_prop2->killMe();
+        }
+
+        return ret;
+    }
+
+    /**
      * @return the Adaptee
      */
     Adaptee* getAdaptee() const
@@ -327,7 +367,7 @@ private:
         return NULL;
     }
 
-    types::InternalType* insert(types::typed_list* _pArgs, InternalType* _pSource)
+    types::InternalType* insert(types::typed_list* _pArgs, types::InternalType* _pSource)
     {
         for (size_t i = 0; i < _pArgs->size(); i++)
         {
diff --git a/scilab/modules/scicos/tests/unit_tests/comparison.dia.ref b/scilab/modules/scicos/tests/unit_tests/comparison.dia.ref
new file mode 100644 (file)
index 0000000..2a31c63
--- /dev/null
@@ -0,0 +1,47 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- XCOS TEST -->
+//
+// <-- CLI SHELL MODE -->
+b = scicos_block();
+assert_checktrue(and(b==b));
+d = scicos_diagram();
+assert_checktrue(and(d==d));
+l = scicos_link();
+assert_checktrue(and(l==l));
+assert_checkfalse(b==l);
+assert_checkfalse(b==d);
+assert_checkfalse(d==l);
+// Just modifying 'graphics'
+b2 = b;
+b2.graphics.sz = [50 50];
+resRef = [%t %f %t %t %t];
+assert_checkequal(b==b2, resRef);
+// 'graphics', 'model' and 'gui' differ
+Sum = BIGSOM_f("define");
+resRef = [%t %f %f %f %t];
+assert_checkequal(b==Sum, resRef);
+// 'props' and 'objs' differ
+d2 = d;
+d2.props.tf = 50;
+d2.objs = list(Sum);
+resRef = [%t %f %f %t %t];
+assert_checkequal(d==d2, resRef);
+// Now test '~='
+assert_checkfalse(or(b~=b));
+assert_checkfalse(or(d~=d));
+assert_checkfalse(or(l~=l));
+assert_checktrue(b~=l);
+assert_checktrue(b~=d);
+assert_checktrue(d~=l);
+resRef = [%f %t %f %f %f];
+assert_checkequal(b~=b2, resRef);
+resRef = [%f %t %t %t %f];
+assert_checkequal(b~=Sum, resRef);
+resRef = [%f %t %t %f %f];
+assert_checkequal(d~=d2, resRef);
diff --git a/scilab/modules/scicos/tests/unit_tests/comparison.tst b/scilab/modules/scicos/tests/unit_tests/comparison.tst
new file mode 100644 (file)
index 0000000..c1bca6f
--- /dev/null
@@ -0,0 +1,60 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2015 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- XCOS TEST -->
+//
+// <-- CLI SHELL MODE -->
+
+b = scicos_block();
+assert_checktrue(and(b==b));
+
+d = scicos_diagram();
+assert_checktrue(and(d==d));
+
+l = scicos_link();
+assert_checktrue(and(l==l));
+
+assert_checkfalse(b==l);
+assert_checkfalse(b==d);
+assert_checkfalse(d==l);
+
+// Just modifying 'graphics'
+b2 = b;
+b2.graphics.sz = [50 50];
+resRef = [%t %f %t %t %t];
+assert_checkequal(b==b2, resRef);
+
+// 'graphics', 'model' and 'gui' differ
+Sum = BIGSOM_f("define");
+resRef = [%t %f %f %f %t];
+assert_checkequal(b==Sum, resRef);
+
+// 'props' and 'objs' differ
+d2 = d;
+d2.props.tf = 50;
+d2.objs = list(Sum);
+resRef = [%t %f %f %t %t];
+assert_checkequal(d==d2, resRef);
+
+
+// Now test '~='
+assert_checkfalse(or(b~=b));
+assert_checkfalse(or(d~=d));
+assert_checkfalse(or(l~=l));
+
+assert_checktrue(b~=l);
+assert_checktrue(b~=d);
+assert_checktrue(d~=l);
+
+resRef = [%f %t %f %f %f];
+assert_checkequal(b~=b2, resRef);
+
+resRef = [%f %t %t %t %f];
+assert_checkequal(b~=Sum, resRef);
+
+resRef = [%f %t %t %f %f];
+assert_checkequal(d~=d2, resRef);
index 21f6f40..a8f060e 100644 (file)
@@ -5,6 +5,7 @@
 //
 //  This file is distributed under the same license as the Scilab package.
 // ============================================================================
+// <-- XCOS TEST -->
 prot = funcprot();
 funcprot(0);
 // Stubbing the x_mdialog method