]> https://gitweb.dealii.org/ - dealii.git/commitdiff
Replace all set_flags functions with a template.
authorDavid Wells <drwells@vt.edu>
Sun, 31 May 2015 22:28:45 +0000 (18:28 -0400)
committerDavid Wells <drwells@vt.edu>
Mon, 1 Jun 2015 02:58:34 +0000 (22:58 -0400)
This sacrifices some type safety in optimized mode to decrease
redundancy.

cmake/config/template-arguments.in
include/deal.II/base/data_out_base.h
source/base/data_out_base.cc
source/base/data_out_base.inst.in

index e655291ad161979f0681899beb922d68a04e444f..c28bc84b3dc83ad6a5396dc6d23b9d6a45ca8559 100644 (file)
@@ -90,3 +90,7 @@ SPARSITY_PATTERNS := { SparsityPattern;
 DIMENSIONS := { 1; 2; 3 }
 
 SPACE_DIMENSIONS := { 1; 2; 3 }
+
+OUTPUT_FLAG_TYPES := { DXFlags; UcdFlags; GnuplotFlags; PovrayFlags; EpsFlags;
+                       GmvFlags; TecplotFlags; VtkFlags; SvgFlags;
+                       Deal_II_IntermediateFlags }
\ No newline at end of file
index ac625dc3ec879f94d05c0d13111a5b1044b769a2..99a3a12d17bf451f6911ef521b06bd3b9a1e4b81 100644 (file)
@@ -26,6 +26,7 @@
 #include <vector>
 #include <string>
 #include <limits>
+#include <typeinfo>
 
 #include <deal.II/base/mpi.h>
 
@@ -2316,55 +2317,14 @@ public:
    */
   void set_default_format (const DataOutBase::OutputFormat default_format);
 
-  /**
-   * Set the flags to be used for output in OpenDX format.
-   */
-  void set_flags (const DataOutBase::DXFlags &dx_flags);
 
   /**
-   * Set the flags to be used for output in UCD format.
+   * Set the flags to be used for output. This method expects <tt>flags</tt> to
+   * be a member of one of the child classes of <tt>OutputFlagsBase</tt>.
    */
-  void set_flags (const DataOutBase::UcdFlags &ucd_flags);
+  template<typename FlagType>
+  void set_flags (const FlagType &flags);
 
-  /**
-   * Set the flags to be used for output in GNUPLOT format.
-   */
-  void set_flags (const DataOutBase::GnuplotFlags &gnuplot_flags);
-
-  /**
-   * Set the flags to be used for output in POVRAY format.
-   */
-  void set_flags (const DataOutBase::PovrayFlags &povray_flags);
-
-  /**
-   * Set the flags to be used for output in EPS output.
-   */
-  void set_flags (const DataOutBase::EpsFlags &eps_flags);
-
-  /**
-   * Set the flags to be used for output in GMV format.
-   */
-  void set_flags (const DataOutBase::GmvFlags &gmv_flags);
-
-  /**
-   * Set the flags to be used for output in Tecplot format.
-   */
-  void set_flags (const DataOutBase::TecplotFlags &tecplot_flags);
-
-  /**
-   * Set the flags to be used for output in VTK format.
-   */
-  void set_flags (const DataOutBase::VtkFlags &vtk_flags);
-
-  /**
-   * Set the flags to be used for output in SVG format.
-   */
-  void set_flags (const DataOutBase::SvgFlags &svg_flags);
-
-  /**
-   * Set the flags to be used for output in deal.II intermediate format.
-   */
-  void set_flags (const DataOutBase::Deal_II_IntermediateFlags &deal_II_intermediate_flags);
 
   /**
    * A function that returns the same string as the respective function in the
index 53a7b6f3386a082a9793fdcce3b700adcfc41179..ab69d353c04c37edf628cdce28d2adaf5dd2aaa3 100644 (file)
@@ -7380,94 +7380,33 @@ DataOutInterface<dim,spacedim>::set_default_format(const DataOutBase::OutputForm
   default_fmt = fmt;
 }
 
-
-
-template <int dim, int spacedim>
-void
-DataOutInterface<dim,spacedim>::set_flags (const DataOutBase::DXFlags &flags)
-{
-  dx_flags = flags;
-}
-
-
-
-template <int dim, int spacedim>
-void
-DataOutInterface<dim,spacedim>::set_flags (const DataOutBase::UcdFlags &flags)
-{
-  ucd_flags = flags;
-}
-
-
-
-template <int dim, int spacedim>
-void
-DataOutInterface<dim,spacedim>::set_flags (const DataOutBase::GnuplotFlags &flags)
-{
-  gnuplot_flags = flags;
-}
-
-
-
-template <int dim, int spacedim>
-void
-DataOutInterface<dim,spacedim>::set_flags (const DataOutBase::PovrayFlags &flags)
-{
-  povray_flags = flags;
-}
-
-
-
-template <int dim, int spacedim>
-void
-DataOutInterface<dim,spacedim>::set_flags (const DataOutBase::EpsFlags &flags)
-{
-  eps_flags = flags;
-}
-
-
-
 template <int dim, int spacedim>
+template <typename FlagType>
 void
-DataOutInterface<dim,spacedim>::set_flags (const DataOutBase::GmvFlags &flags)
+DataOutInterface<dim, spacedim>::set_flags (const FlagType &flags)
 {
-  gmv_flags = flags;
-}
-
-
-
-template <int dim, int spacedim>
-void
-DataOutInterface<dim,spacedim>::set_flags (const DataOutBase::TecplotFlags &flags)
-{
-  tecplot_flags = flags;
-}
-
-
-
-template <int dim, int spacedim>
-void
-DataOutInterface<dim,spacedim>::set_flags (const DataOutBase::VtkFlags &flags)
-{
-  vtk_flags = flags;
-}
-
-
-
-template <int dim, int spacedim>
-void
-DataOutInterface<dim,spacedim>::set_flags (const DataOutBase::SvgFlags &flags)
-{
-  svg_flags = flags;
-}
-
-
-
-template <int dim, int spacedim>
-void
-DataOutInterface<dim,spacedim>::set_flags (const DataOutBase::Deal_II_IntermediateFlags &flags)
-{
-  deal_II_intermediate_flags = flags;
+  // The price for not writing ten duplicates of this function is some loss in
+  // type safety.
+  if (typeid(flags) == typeid(dx_flags))
+    dx_flags = *reinterpret_cast<const DataOutBase::DXFlags *>(&flags);
+  else if (typeid(flags) == typeid(ucd_flags))
+    ucd_flags = *reinterpret_cast<const DataOutBase::UcdFlags *>(&flags);
+  else if (typeid(flags) == typeid(povray_flags))
+    povray_flags = *reinterpret_cast<const DataOutBase::PovrayFlags *>(&flags);
+  else if (typeid(flags) == typeid(eps_flags))
+    eps_flags = *reinterpret_cast<const DataOutBase::EpsFlags *>(&flags);
+  else if (typeid(flags) == typeid(gmv_flags))
+    gmv_flags = *reinterpret_cast<const DataOutBase::GmvFlags *>(&flags);
+  else if (typeid(flags) == typeid(tecplot_flags))
+    tecplot_flags = *reinterpret_cast<const DataOutBase::TecplotFlags *>(&flags);
+  else if (typeid(flags) == typeid(vtk_flags))
+    vtk_flags = *reinterpret_cast<const DataOutBase::VtkFlags *>(&flags);
+  else if (typeid(flags) == typeid(svg_flags))
+    svg_flags = *reinterpret_cast<const DataOutBase::SvgFlags *>(&flags);
+  else if (typeid(flags) == typeid(deal_II_intermediate_flags))
+    deal_II_intermediate_flags = *reinterpret_cast<const DataOutBase::Deal_II_IntermediateFlags *>(&flags);
+  else
+    Assert(false, ExcNotImplemented());
 }
 
 
index ea48dd342f50dbadb3c8c28ddd3d1d00cfc38946..508d8aa6db3e910c01057139531e165374a54796 100644 (file)
@@ -19,7 +19,7 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension :  SPACE_DIMENSIONS
 #if deal_II_dimension <= deal_II_space_dimension
   template class DataOutInterface<deal_II_dimension, deal_II_space_dimension>;
   template class DataOutReader<deal_II_dimension, deal_II_space_dimension>;
-  
+
   namespace DataOutBase
   \{
   template struct Patch<deal_II_dimension, deal_II_space_dimension>;
@@ -133,3 +133,10 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension :  SPACE_DIMENSIONS
   \}
 #endif
 }
+
+for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension :  SPACE_DIMENSIONS; flag_type : OUTPUT_FLAG_TYPES)
+{
+  template
+  void
+  DataOutInterface<deal_II_dimension, deal_II_space_dimension>::set_flags (const DataOutBase::flag_type &flags);
+}

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.