Scicos: reimplement scicos_block() depth comparison 65/18965/2
Clément DAVID [Thu, 26 Jan 2017 08:32:22 +0000 (09:32 +0100)]
The in-depth comparison is required to handle superblocks ; with this
the operator== from InternalType is called and can only compare
type names.

Change-Id: I9a3a66c4df27ef2510cd42fb32c696a77c97efe8

scilab/modules/ast/includes/types/user.hxx
scilab/modules/scicos/src/cpp/view_scilab/BaseAdapter.hxx
scilab/modules/scicos/tests/unit_tests/comparison.dia.ref
scilab/modules/scicos/tests/unit_tests/comparison.tst

index 8cb4bd7..403619f 100644 (file)
@@ -62,6 +62,11 @@ public :
     /*** User can overload these methods                            ***/
     /*** all methods not overloaded will call scilab overload       ***/
 
+    virtual bool operator==(const InternalType& it) override
+    {
+        return false;
+    }
+
     virtual Bool* equal(UserType*& /*ut*/)
     {
         return NULL;
index 2ffce29..1eb67bb 100644 (file)
@@ -35,6 +35,7 @@
 #include "overload.hxx"
 #include "configvariable.hxx"
 #include "exp.hxx"
+#include "types_comparison_eq.hxx"
 
 #include "view_scilab/Adapters.hxx"
 #include "controller_helpers.hxx"
@@ -267,6 +268,41 @@ public:
      * property comparison
      */
 
+    bool operator==(const types::InternalType& o) override final
+    {
+
+        const Adapters::adapters_index_t adapter_index = Adapters::instance().lookup_by_typename(o.getShortTypeStr());
+        // Check that 'ut' is an Adapter of the same type as *this
+        if (adapter_index == Adapters::INVALID_ADAPTER)
+        {
+            return false;
+        }
+        if (this->getTypeStr() != o.getTypeStr())
+        {
+            return false;
+        }
+
+        typename property<Adaptor>::props_t properties = property<Adaptor>::fields;
+        std::sort(properties.begin(), properties.end(), property<Adaptor>::original_index_cmp);
+
+        bool internal_equal = true;
+        Controller controller;
+        for (typename property<Adaptor>::props_t_it it = properties.begin(); it != properties.end() && internal_equal; ++it)
+        {
+            types::InternalType* ith_prop1 = it->get(*static_cast<const Adaptor*>(this), controller);
+            types::InternalType* ith_prop2 = it->get(*static_cast<const Adaptor*>(&o), controller);
+
+            // loop while the inner types are equals
+            internal_equal = *ith_prop1 == *ith_prop2;
+
+            // Getting a property allocates data, so free it
+            ith_prop1->killMe();
+            ith_prop2->killMe();
+        }
+
+        return internal_equal;
+    }
+
     types::Bool* equal(types::UserType*& ut) override final
     {
         const Adapters::adapters_index_t adapter_index = Adapters::instance().lookup_by_typename(ut->getShortTypeStr());
index 2a31c63..4141808 100644 (file)
@@ -1,13 +1,14 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2015 - Scilab Enterprises - Paul Bignier
+// Copyright (C) 2017 - Scilab Enterprises - Clement DAVID
 //
 //  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();
@@ -45,3 +46,9 @@ resRef = [%f %t %t %t %f];
 assert_checkequal(b~=Sum, resRef);
 resRef = [%f %t %t %f %f];
 assert_checkequal(d~=d2, resRef);
+// check with an object hierarchy
+o1 = CLOCK_f("define");
+o2 = CLOCK_f("define");
+assert_checktrue(o1 == o2);
+o1.model.rpar.objs(2).graphics.exprs = ["30" ; "0"];
+assert_checkequal(o1 == o2, [%t %t %f %t %t]);
index c1bca6f..b1eca0f 100644 (file)
@@ -1,13 +1,14 @@
 // =============================================================================
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2015 - Scilab Enterprises - Paul Bignier
+// Copyright (C) 2017 - Scilab Enterprises - Clement DAVID
 //
 //  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));
@@ -58,3 +59,14 @@ assert_checkequal(b~=Sum, resRef);
 
 resRef = [%f %t %t %f %f];
 assert_checkequal(d~=d2, resRef);
+
+
+// check with an object hierarchy
+
+o1 = CLOCK_f("define");
+o2 = CLOCK_f("define");
+assert_checktrue(o1 == o2);
+
+o1.model.rpar.objs(2).graphics.exprs = ["30" ; "0"];
+assert_checkequal(o1 == o2, [%t %t %f %t %t]);
+