]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Simplify code. 1183/head
authorWolfgang Bangerth <bangerth@math.tamu.edu>
Thu, 23 Jul 2015 22:07:07 +0000 (17:07 -0500)
committerWolfgang Bangerth <bangerth@math.tamu.edu>
Thu, 23 Jul 2015 22:07:07 +0000 (17:07 -0500)
There are a couple of places where we call a get_data() function
that returns a pointer to a base class when we know that the actual
data type is a pointer to derived class. We need to cast right back
to the derived class.

This can be avoided by using covariant return types where the get_data()
function returns a pointer to derived right away.

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

index ff30ce782d9339ac5481b4546d99e32f67da8173..75a3b3e8d375d9adca38eb1e2c8de38de30be8fc 100644 (file)
@@ -298,8 +298,18 @@ private:
                                          std::vector<Point<spacedim> > &points) const;
 
 
+  /**
+   * Implementation of the Mapping::get_data() interface.
+   *
+   * As allowed by C++ (using a feature called "covariant return
+   * types"), this function returns a pointer to a
+   * MappingQ::InternalData object since these objects are
+   * derived from the Mapping::InternalDataBase class, pointers to
+   * which are returned by the Mapping::get_data() function. This
+   * makes some uses of this function simpler.
+   */
   virtual
-  typename Mapping<dim,spacedim>::InternalDataBase *
+  InternalData *
   get_data (const UpdateFlags,
             const Quadrature<dim> &quadrature) const;
 
index 5ac2510d8b442ec68a64251df7215c87977ca025..57da023f1ce28c6f2f0528b761478cc32183c203 100644 (file)
@@ -538,8 +538,18 @@ private:
    */
   virtual UpdateFlags update_each (const UpdateFlags flags) const;
 
+  /**
+   * Implementation of the Mapping::get_data() interface.
+   *
+   * As allowed by C++ (using a feature called "covariant return
+   * types"), this function returns a pointer to a
+   * MappingQ1::InternalData object since these objects are
+   * derived from the Mapping::InternalDataBase class, pointers to
+   * which are returned by the Mapping::get_data() function. This
+   * makes some uses of this function simpler.
+   */
   virtual
-  typename Mapping<dim,spacedim>::InternalDataBase *
+  InternalData *
   get_data (const UpdateFlags,
             const Quadrature<dim> &quadrature) const;
 
index d3ab6751692f9f3917f015c99c61e14e548cfbb2..18047e52e72e59ef385d3f073f98ed0734a4bab1 100644 (file)
@@ -194,7 +194,7 @@ MappingQ<dim,spacedim>::compute_shapes_virtual (const std::vector<Point<dim> > &
 
 
 template<int dim, int spacedim>
-typename Mapping<dim,spacedim>::InternalDataBase *
+typename MappingQ<dim,spacedim>::InternalData *
 MappingQ<dim,spacedim>::get_data (const UpdateFlags update_flags,
                                   const Quadrature<dim> &quadrature) const
 {
@@ -1044,9 +1044,8 @@ transform_unit_to_real_cell (const typename Triangulation<dim,spacedim>::cell_it
   // the right size and transformation shape values already computed at point
   // p.
   const Quadrature<dim> point_quadrature(p);
-  std_cxx11::unique_ptr<InternalData>
-  mdata (dynamic_cast<InternalData *> (
-           get_data(update_transformation_values, point_quadrature)));
+  std_cxx11::unique_ptr<InternalData> mdata (get_data(update_transformation_values,
+                                                      point_quadrature));
 
   mdata->use_mapping_q1_on_current_cell = !(use_mapping_q_on_all_cells ||
                                             cell->has_boundary_lines());
@@ -1130,9 +1129,8 @@ transform_real_to_unit_cell (const typename Triangulation<dim,spacedim>::cell_it
       UpdateFlags update_flags = update_transformation_values|update_transformation_gradients;
       if (spacedim>dim)
         update_flags |= update_jacobian_grads;
-      std_cxx11::unique_ptr<InternalData>
-      mdata (dynamic_cast<InternalData *> (
-               get_data(update_flags,point_quadrature)));
+      std_cxx11::unique_ptr<InternalData> mdata (get_data(update_flags,
+                                                          point_quadrature));
 
       mdata->use_mapping_q1_on_current_cell = false;
 
index 73dea53ebfdda4d6e318c13509960fedbe757c59..f2b6ce4537a74cf2fbfd2497cf969ba1c3d9574f 100644 (file)
@@ -491,7 +491,7 @@ MappingQ1<dim,spacedim>::compute_data (const UpdateFlags      update_flags,
 
 
 template<int dim, int spacedim>
-typename Mapping<dim,spacedim>::InternalDataBase *
+typename MappingQ1<dim,spacedim>::InternalData *
 MappingQ1<dim,spacedim>::get_data (const UpdateFlags update_flags,
                                    const Quadrature<dim> &q) const
 {
@@ -1427,16 +1427,13 @@ MappingQ1<dim,spacedim>::transform_unit_to_real_cell (
   const typename Triangulation<dim,spacedim>::cell_iterator &cell,
   const Point<dim> &p) const
 {
-  // Use the get_data function to
-  // create an InternalData with data
-  // vectors of the right size and
-  // transformation shape values
-  // already computed at point p.
+  // Use the get_data function to create an InternalData with data
+  // vectors of the right size and transformation shape values already
+  // computed at point p.
   const Quadrature<dim> point_quadrature(p);
 
-  std_cxx11::unique_ptr<InternalData>
-  mdata (dynamic_cast<InternalData *> (
-           get_data(update_transformation_values, point_quadrature)));
+  std_cxx11::unique_ptr<InternalData> mdata (get_data(update_transformation_values,
+                                                      point_quadrature));
 
   // compute the mapping support
   // points
@@ -1670,9 +1667,8 @@ transform_real_to_unit_cell (const typename Triangulation<dim,spacedim>::cell_it
       if (spacedim>dim)
         update_flags |= update_jacobian_grads;
 
-      std_cxx11::unique_ptr<InternalData>
-      mdata(dynamic_cast<InternalData *> (
-              MappingQ1<dim,spacedim>::get_data(update_flags, point_quadrature)));
+      std_cxx11::unique_ptr<InternalData> mdata(get_data(update_flags,
+                                                         point_quadrature));
 
       compute_mapping_support_points (cell, mdata->mapping_support_points);
       // The support points have to be at

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.