]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Strengthen the guarantees by FiniteElement::operator==.
authorWolfgang Bangerth <bangerth@colostate.edu>
Fri, 27 Apr 2018 22:09:23 +0000 (16:09 -0600)
committerWolfgang Bangerth <bangerth@colostate.edu>
Fri, 27 Apr 2018 22:11:28 +0000 (16:11 -0600)
This includes more fields of information. However, the operator now goes through
fields in roughly increasing order of how expensive it is to compare things.

include/deal.II/fe/fe.h
source/fe/fe.cc

index 273be3c05ec5be1340ff9e80e86e425ae744c6ab..c519de1b0e4c216f3b95617184b2ad3d6f794d2c 100644 (file)
@@ -1335,17 +1335,24 @@ public:
   /**
    * Comparison operator.
    *
-   * The implementation in the current class checks for equality of the name
-   * returned by get_name() and for equality of the constraint matrix, as well
-   * as all of the fields in FiniteElementData. This covers most cases where
-   * elements can differ, but there are cases of derived elements that are
-   * different and for which the current function still returns @p true.
-   * For these cases, derived classes should overload this function.
-   *
-   * We do not compare the matrix arrays #restriction and #prolongation.
+   * The implementation in the current class checks for equality of the
+   * following pieces of information between the current object and the one
+   * given as argument, in this order:
+   * - the dynamic type (i.e., the type of the most derived class) of the
+   *   current object and of the given object,
+   * - the name returned by get_name(),
+   * - as all of the fields in FiniteElementData,
+   * - constraint matrices,
+   * - restriction matrices,
+   * - prolongation matrices of this object and the argument.
+   *
+   * This covers most cases where elements can differ, but there are
+   * cases of derived elements that are different and for which the
+   * current function still returns @p true. For these cases, derived
+   * classes should overload this function.
    */
   virtual
-  bool operator == (const FiniteElement<dim,spacedim> &) const;
+  bool operator == (const FiniteElement<dim,spacedim> &fe) const;
 
   /**
    * Non-equality comparison operator. Defined in terms of the equality comparison operator.
index e877973aea065bf6c1e10cac7c1018beb2368c99..6c658766ca17cafd6064f6c5026c19ac88633943 100644 (file)
@@ -27,6 +27,7 @@
 #include <algorithm>
 #include <functional>
 #include <numeric>
+#include <typeinfo>
 
 DEAL_II_NAMESPACE_OPEN
 
@@ -937,10 +938,20 @@ template <int dim, int spacedim>
 bool
 FiniteElement<dim,spacedim>::operator == (const FiniteElement<dim,spacedim> &f) const
 {
-  return ((static_cast<const FiniteElementData<dim>&>(*this) ==
-           static_cast<const FiniteElementData<dim>&>(f)) &&
-          (interface_constraints == f.interface_constraints) &&
-          (this->get_name() == f.get_name()));
+  // Compare fields in roughly increasing order of how expensive the
+  // comparison is
+  return ((typeid(*this) == typeid(f))
+          &&
+          (this->get_name() == f.get_name())
+          &&
+          (static_cast<const FiniteElementData<dim>&>(*this) ==
+           static_cast<const FiniteElementData<dim>&>(f))
+          &&
+          (interface_constraints == f.interface_constraints)
+          &&
+          (restriction == f.restriction)
+          &&
+          (prolongation == f.prolongation));
 }
 
 

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.

Douglas Adams


Typeset in Trocchi and Trocchi Bold Sans Serif.