From daf31466915e41e0889251855114e31cb09260f9 Mon Sep 17 00:00:00 2001 From: Karl Ljungkvist Date: Wed, 23 Nov 2016 14:37:41 +0100 Subject: [PATCH] wrap p[48]est_iterate in a template struct to avoid invalid instantiations --- source/distributed/tria.cc | 67 +++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 23 deletions(-) diff --git a/source/distributed/tria.cc b/source/distributed/tria.cc index ca1f054121..646375d75c 100644 --- a/source/distributed/tria.cc +++ b/source/distributed/tria.cc @@ -3610,9 +3610,49 @@ namespace parallel subids->elem_count = 0; } - } + /** + * This struct wraps the p4est_iterate / p8est_iterate in a templated + * fashion so that we can avoid the compiler complaining about invalid + * types being referred, which would be the case inside switch or if + * statements. + */ + template + struct pXest_iterate_wrapper + { + static void iterate(typename dealii::internal::p4est::types::forest *parallel_forest, + typename dealii::internal::p4est::types::ghost *parallel_ghost, + void *user_data); + }; + + template + struct pXest_iterate_wrapper<2,spacedim> + { + static void iterate(dealii::internal::p4est::types<2>::forest *parallel_forest, + dealii::internal::p4est::types<2>::ghost *parallel_ghost, + void *user_data) + { + p4est_iterate (parallel_forest, parallel_ghost, user_data, + NULL, find_ghosts_face<2,spacedim>, + find_ghosts_corner<2,spacedim>); + } + }; + + template + struct pXest_iterate_wrapper<3,spacedim> + { + static void iterate(dealii::internal::p4est::types<3>::forest *parallel_forest, + dealii::internal::p4est::types<3>::ghost *parallel_ghost, + void *user_data) + { + p8est_iterate (parallel_forest, parallel_ghost, user_data, + NULL, find_ghosts_face<3,spacedim>, find_ghosts_edge<3,spacedim>, + find_ghosts_corner<3,spacedim>); + } + }; + } + /** * Determine the neighboring subdomains that are adjacent to each vertex. @@ -3632,28 +3672,9 @@ namespace parallel fg.triangulation = this; fg.vertices_with_ghost_neighbors = &vertices_with_ghost_neighbors; - // switch between functions. to make the compiler happy, we need to cast - // the first two arguments to the type p[48]est_iterate wants to see. this - // cast is the identity cast in each of the two branches, so it is safe. - switch (dim) - { - case 2: - p4est_iterate (reinterpret_cast::forest *>(this->parallel_forest), - reinterpret_cast::ghost *>(this->parallel_ghost), - static_cast(&fg), - NULL, find_ghosts_face<2,spacedim>, find_ghosts_corner<2,spacedim>); - break; - - case 3: - p8est_iterate (reinterpret_cast::forest *>(this->parallel_forest), - reinterpret_cast::ghost *>(this->parallel_ghost), - static_cast(&fg), - NULL, find_ghosts_face<3,spacedim>, find_ghosts_edge<3,spacedim>, find_ghosts_corner<3,spacedim>); - break; - - default: - Assert (false, ExcNotImplemented()); - } + pXest_iterate_wrapper::iterate (this->parallel_forest, + this->parallel_ghost, + static_cast(&fg)); sc_array_destroy (fg.subids); } -- 2.39.5