From: Marc Fehling Date: Sat, 14 Nov 2020 02:31:36 +0000 (-0700) Subject: Remove DoFHandlerType from internal::DataOutImplementation::{DataEntryBase|DataEntry... X-Git-Tag: v9.3.0-rc1~901^2 X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b909e4fade94a3983ce1052c70b8a581edbe4017;p=dealii.git Remove DoFHandlerType from internal::DataOutImplementation::{DataEntryBase|DataEntry|MGDataEntry}. --- diff --git a/include/deal.II/numerics/data_out_dof_data.h b/include/deal.II/numerics/data_out_dof_data.h index c326b475fa..86fe1fcea0 100644 --- a/include/deal.II/numerics/data_out_dof_data.h +++ b/include/deal.II/numerics/data_out_dof_data.h @@ -218,7 +218,7 @@ namespace internal * type * erasure design pattern. */ - template + template class DataEntryBase { public: @@ -227,8 +227,8 @@ namespace internal * the vector and their interpretation as scalar or vector data. This * constructor assumes that no postprocessor is going to be used. */ - DataEntryBase(const DoFHandlerType * dofs, - const std::vector &names, + DataEntryBase(const DoFHandler *dofs, + const std::vector & names, const std::vector< DataComponentInterpretation::DataComponentInterpretation> &data_component_interpretation); @@ -238,9 +238,8 @@ namespace internal * case, the names and vector declarations are going to be acquired from * the postprocessor. */ - DataEntryBase(const DoFHandlerType *dofs, - const DataPostprocessor - *data_postprocessor); + DataEntryBase(const DoFHandler * dofs, + const DataPostprocessor *data_postprocessor); /** * Destructor made virtual. @@ -260,11 +259,9 @@ namespace internal * from the vector we actually store. */ virtual void - get_function_values( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector &patch_values) const = 0; + get_function_values(const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector &patch_values) const = 0; /** * Given a FEValuesBase object, extract the values on the present cell @@ -273,9 +270,8 @@ namespace internal */ virtual void get_function_values( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, + const FEValuesBase & fe_patch_values, + const ComponentExtractor extract_component, std::vector> &patch_values_system) const = 0; /** @@ -284,11 +280,9 @@ namespace internal */ virtual void get_function_gradients( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector> - &patch_gradients) const = 0; + const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector> & patch_gradients) const = 0; /** * Given a FEValuesBase object, extract the gradients on the present @@ -296,12 +290,10 @@ namespace internal * as the one above but for vector-valued finite elements. */ virtual void - get_function_gradients( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector>> - &patch_gradients_system) const = 0; + get_function_gradients(const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector>> + &patch_gradients_system) const = 0; /** * Given a FEValuesBase object, extract the second derivatives on the @@ -309,11 +301,9 @@ namespace internal */ virtual void get_function_hessians( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector> &patch_hessians) - const = 0; + const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector> & patch_hessians) const = 0; /** * Given a FEValuesBase object, extract the second derivatives on the @@ -321,12 +311,10 @@ namespace internal * the same as the one above but for vector-valued finite elements. */ virtual void - get_function_hessians( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector>> - &patch_hessians_system) const = 0; + get_function_hessians(const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector>> + &patch_hessians_system) const = 0; /** * Return whether the data represented by (a derived class of) this object @@ -351,7 +339,7 @@ namespace internal /** * Pointer to the DoFHandler object that the vector is based on. */ - SmartPointer dof_handler; + SmartPointer> dof_handler; /** * Names of the components of this data vector. @@ -371,9 +359,7 @@ namespace internal * Pointer to a DataPostprocessing object which shall be applied to this * data vector. */ - SmartPointer< - const dealii::DataPostprocessor> - postprocessor; + SmartPointer> postprocessor; /** * Number of output variables this dataset provides (either number of @@ -428,10 +414,9 @@ namespace internal ParallelDataBase(const ParallelDataBase &data); - template void reinit_all_fe_values( - std::vector>> &dof_data, + std::vector>> &dof_data, const typename dealii::Triangulation::cell_iterator & cell, const unsigned int face = numbers::invalid_unsigned_int); @@ -994,15 +979,17 @@ protected: /** * List of data elements with vectors of values for each degree of freedom. */ - std::vector>> + std::vector>> dof_data; /** * List of data elements with vectors of values for each cell. */ - std::vector>> + std::vector>> cell_data; /** diff --git a/include/deal.II/numerics/data_out_dof_data.templates.h b/include/deal.II/numerics/data_out_dof_data.templates.h index 19332c8938..f7b9b6fbe2 100644 --- a/include/deal.II/numerics/data_out_dof_data.templates.h +++ b/include/deal.II/numerics/data_out_dof_data.templates.h @@ -347,10 +347,9 @@ namespace internal template - template void ParallelDataBase::reinit_all_fe_values( - std::vector>> &dof_data, + std::vector>> &dof_data, const typename dealii::Triangulation::cell_iterator &cell, const unsigned int face) { @@ -365,11 +364,11 @@ namespace internal { if (cell->active()) { - typename DoFHandlerType::active_cell_iterator dh_cell( - &cell->get_triangulation(), - cell->level(), - cell->index(), - dof_data[dataset]->dof_handler); + typename DoFHandler::active_cell_iterator + dh_cell(&cell->get_triangulation(), + cell->level(), + cell->index(), + dof_data[dataset]->dof_handler); if (x_fe_values.empty()) { AssertIndexRange(face, GeometryInfo::faces_per_cell); @@ -596,19 +595,18 @@ namespace internal - template - DataEntryBase::DataEntryBase( - const DoFHandlerType * dofs, - const std::vector &names_in, + template + DataEntryBase::DataEntryBase( + const DoFHandler *dofs, + const std::vector & names_in, const std::vector< DataComponentInterpretation::DataComponentInterpretation> &data_component_interpretation) - : dof_handler(dofs, - typeid( - dealii::DataOut_DoFData) - .name()) + : dof_handler( + dofs, + typeid( + dealii::DataOut_DoFData, dim, spacedim>) + .name()) , names(names_in) , data_component_interpretation(data_component_interpretation) , postprocessor(nullptr, typeid(*this).name()) @@ -635,17 +633,15 @@ namespace internal - template - DataEntryBase::DataEntryBase( - const DoFHandlerType *dofs, - const DataPostprocessor - *data_postprocessor) - : dof_handler(dofs, - typeid( - dealii::DataOut_DoFData) - .name()) + template + DataEntryBase::DataEntryBase( + const DoFHandler * dofs, + const DataPostprocessor *data_postprocessor) + : dof_handler( + dofs, + typeid( + dealii::DataOut_DoFData, dim, spacedim>) + .name()) , names(data_postprocessor->get_names()) , data_component_interpretation( data_postprocessor->get_data_component_interpretation()) @@ -679,8 +675,8 @@ namespace internal * Class that stores a pointer to a vector of type equal to the template * argument, and provides the functions to extract data from it. */ - template - class DataEntry : public DataEntryBase + template + class DataEntry : public DataEntryBase { public: /** @@ -688,9 +684,9 @@ namespace internal * the vector and their interpretation as scalar or vector data. This * constructor assumes that no postprocessor is going to be used. */ - DataEntry(const DoFHandlerType * dofs, - const VectorType * data, - const std::vector &names, + DataEntry(const DoFHandler *dofs, + const VectorType * data, + const std::vector & names, const std::vector< DataComponentInterpretation::DataComponentInterpretation> &data_component_interpretation); @@ -700,10 +696,9 @@ namespace internal * case, the names and vector declarations are going to be acquired from * the postprocessor. */ - DataEntry(const DoFHandlerType *dofs, - const VectorType * data, - const DataPostprocessor - *data_postprocessor); + DataEntry(const DoFHandler * dofs, + const VectorType * data, + const DataPostprocessor *data_postprocessor); /** * Assuming that the stored vector is a cell vector, extract the given @@ -719,11 +714,9 @@ namespace internal * from the vector we actually store. */ virtual void - get_function_values( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector &patch_values) const override; + get_function_values(const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector &patch_values) const override; /** * Given a FEValuesBase object, extract the values on the present cell @@ -731,12 +724,10 @@ namespace internal * one above but for vector-valued finite elements. */ virtual void - get_function_values( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector> &patch_values_system) - const override; + get_function_values(const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector> + &patch_values_system) const override; /** * Given a FEValuesBase object, extract the gradients on the present @@ -744,11 +735,9 @@ namespace internal */ virtual void get_function_gradients( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector> - &patch_gradients) const override; + const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector> & patch_gradients) const override; /** * Given a FEValuesBase object, extract the gradients on the present @@ -756,12 +745,10 @@ namespace internal * as the one above but for vector-valued finite elements. */ virtual void - get_function_gradients( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector>> - &patch_gradients_system) const override; + get_function_gradients(const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector>> + &patch_gradients_system) const override; /** * Given a FEValuesBase object, extract the second derivatives on the @@ -769,11 +756,9 @@ namespace internal */ virtual void get_function_hessians( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector> &patch_hessians) - const override; + const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector> & patch_hessians) const override; /** * Given a FEValuesBase object, extract the second derivatives on the @@ -781,12 +766,10 @@ namespace internal * the same as the one above but for vector-valued finite elements. */ virtual void - get_function_hessians( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector>> - &patch_hessians_system) const override; + get_function_hessians(const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector>> + &patch_hessians_system) const override; /** * Return whether the data represented by (a derived class of) this object @@ -818,37 +801,34 @@ namespace internal - template - DataEntry::DataEntry( - const DoFHandlerType * dofs, - const VectorType * data, - const std::vector &names, + template + DataEntry::DataEntry( + const DoFHandler *dofs, + const VectorType * data, + const std::vector & names, const std::vector< DataComponentInterpretation::DataComponentInterpretation> &data_component_interpretation) - : DataEntryBase(dofs, - names, - data_component_interpretation) + : DataEntryBase(dofs, names, data_component_interpretation) , vector(data) {} - template - DataEntry::DataEntry( - const DoFHandlerType *dofs, - const VectorType * data, - const DataPostprocessor - *data_postprocessor) - : DataEntryBase(dofs, data_postprocessor) + template + DataEntry::DataEntry( + const DoFHandler * dofs, + const VectorType * data, + const DataPostprocessor *data_postprocessor) + : DataEntryBase(dofs, data_postprocessor) , vector(data) {} - template + template double - DataEntry::get_cell_data_value( + DataEntry::get_cell_data_value( const unsigned int cell_number, const ComponentExtractor extract_component) const { @@ -859,12 +839,11 @@ namespace internal - template + template void - DataEntry::get_function_values( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, + DataEntry::get_function_values( + const FEValuesBase & fe_patch_values, + const ComponentExtractor extract_component, std::vector> &patch_values_system) const { if (typeid(typename VectorType::value_type) == typeid(double)) @@ -916,13 +895,12 @@ namespace internal - template + template void - DataEntry::get_function_values( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector & patch_values) const + DataEntry::get_function_values( + const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector & patch_values) const { if (typeid(typename VectorType::value_type) == typeid(double)) { @@ -952,14 +930,13 @@ namespace internal - template + template void - DataEntry::get_function_gradients( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector>> - &patch_gradients_system) const + DataEntry::get_function_gradients( + const FEValuesBase & fe_patch_values, + const ComponentExtractor extract_component, + std::vector>> &patch_gradients_system) + const { if (typeid(typename VectorType::value_type) == typeid(double)) { @@ -973,10 +950,8 @@ namespace internal // above, this is the identity cast whenever the code is executed, // but the cast is necessary to allow compilation even if we don't // get here - reinterpret_cast>> &>( + reinterpret_cast>> &>( patch_gradients_system)); } else @@ -991,9 +966,8 @@ namespace internal const unsigned int n_eval_points = fe_patch_values.n_quadrature_points; - std::vector>> + std::vector< + std::vector>> tmp(n_eval_points); for (unsigned int i = 0; i < n_eval_points; i++) tmp[i].resize(n_components); @@ -1014,14 +988,12 @@ namespace internal - template + template void - DataEntry::get_function_gradients( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector> &patch_gradients) - const + DataEntry::get_function_gradients( + const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector> & patch_gradients) const { if (typeid(typename VectorType::value_type) == typeid(double)) { @@ -1035,18 +1007,13 @@ namespace internal // above, this is the identity cast whenever the code is executed, // but the cast is necessary to allow compilation even if we don't // get here - reinterpret_cast< - std::vector> &>( + reinterpret_cast> &>( patch_gradients)); } else { - std::vector> - tmp; + std::vector> tmp; tmp.resize(patch_gradients.size()); fe_patch_values.get_function_gradients(*vector, tmp); @@ -1058,14 +1025,13 @@ namespace internal - template + template void - DataEntry::get_function_hessians( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector>> - &patch_hessians_system) const + DataEntry::get_function_hessians( + const FEValuesBase & fe_patch_values, + const ComponentExtractor extract_component, + std::vector>> &patch_hessians_system) + const { if (typeid(typename VectorType::value_type) == typeid(double)) { @@ -1079,10 +1045,8 @@ namespace internal // above, this is the identity cast whenever the code is executed, // but the cast is necessary to allow compilation even if we don't // get here - reinterpret_cast>> &>( + reinterpret_cast>> &>( patch_hessians_system)); } else @@ -1097,9 +1061,8 @@ namespace internal const unsigned int n_eval_points = fe_patch_values.n_quadrature_points; - std::vector>> + std::vector< + std::vector>> tmp(n_eval_points); for (unsigned int i = 0; i < n_eval_points; i++) tmp[i].resize(n_components); @@ -1120,14 +1083,12 @@ namespace internal - template + template void - DataEntry::get_function_hessians( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector> &patch_hessians) - const + DataEntry::get_function_hessians( + const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector> & patch_hessians) const { if (typeid(typename VectorType::value_type) == typeid(double)) { @@ -1141,18 +1102,14 @@ namespace internal // above, this is the identity cast whenever the code is executed, // but the cast is necessary to allow compilation even if we don't // get here - reinterpret_cast< - std::vector> &>( + reinterpret_cast> &>( patch_hessians)); } else { - std::vector> - tmp(patch_hessians.size()); + std::vector> tmp( + patch_hessians.size()); fe_patch_values.get_function_hessians(*vector, tmp); @@ -1163,18 +1120,18 @@ namespace internal - template + template bool - DataEntry::is_complex_valued() const + DataEntry::is_complex_valued() const { return numbers::NumberTraits::is_complex; } - template + template std::size_t - DataEntry::memory_consumption() const + DataEntry::memory_consumption() const { return (sizeof(vector) + MemoryConsumption::memory_consumption(this->names)); @@ -1182,9 +1139,9 @@ namespace internal - template + template void - DataEntry::clear() + DataEntry::clear() { vector = nullptr; this->dof_handler = nullptr; @@ -1198,19 +1155,19 @@ namespace internal * MGLevelObject given on the specific level instead of * interpolating data to coarser cells. */ - template - class MGDataEntry : public DataEntryBase + template + class MGDataEntry : public DataEntryBase { public: - MGDataEntry(const DoFHandlerType * dofs, + MGDataEntry(const DoFHandler *dofs, const MGLevelObject *vectors, const std::vector & names, const std::vector< DataComponentInterpretation::DataComponentInterpretation> &data_component_interpretation) - : DataEntryBase(dofs, - names, - data_component_interpretation) + : DataEntryBase(dofs, + names, + data_component_interpretation) , vectors(vectors) {} @@ -1220,11 +1177,9 @@ namespace internal const ComponentExtractor extract_component) const override; virtual void - get_function_values( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector &patch_values) const override; + get_function_values(const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector &patch_values) const override; /** * Given a FEValuesBase object, extract the values on the present cell @@ -1232,12 +1187,10 @@ namespace internal * one above but for vector-valued finite elements. */ virtual void - get_function_values( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector> &patch_values_system) - const override; + get_function_values(const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector> + &patch_values_system) const override; /** * Given a FEValuesBase object, extract the gradients on the present @@ -1245,12 +1198,9 @@ namespace internal */ virtual void get_function_gradients( - const FEValuesBase - & /*fe_patch_values*/, + const FEValuesBase & /*fe_patch_values*/, const ComponentExtractor /*extract_component*/, - std::vector> - & /*patch_gradients*/) const override + std::vector> & /*patch_gradients*/) const override { Assert(false, ExcNotImplemented()); } @@ -1262,11 +1212,9 @@ namespace internal */ virtual void get_function_gradients( - const FEValuesBase - & /*fe_patch_values*/, + const FEValuesBase & /*fe_patch_values*/, const ComponentExtractor /*extract_component*/, - std::vector>> + std::vector>> & /*patch_gradients_system*/) const override { Assert(false, ExcNotImplemented()); @@ -1279,12 +1227,9 @@ namespace internal */ virtual void get_function_hessians( - const FEValuesBase - & /*fe_patch_values*/, + const FEValuesBase & /*fe_patch_values*/, const ComponentExtractor /*extract_component*/, - std::vector> - & /*patch_hessians*/) const override + std::vector> & /*patch_hessians*/) const override { Assert(false, ExcNotImplemented()); } @@ -1296,11 +1241,9 @@ namespace internal */ virtual void get_function_hessians( - const FEValuesBase - & /*fe_patch_values*/, + const FEValuesBase & /*fe_patch_values*/, const ComponentExtractor /*extract_component*/, - std::vector>> + std::vector>> & /*patch_hessians_system*/) const override { Assert(false, ExcNotImplemented()); @@ -1346,9 +1289,9 @@ namespace internal - template + template double - MGDataEntry::get_cell_data_value( + MGDataEntry::get_cell_data_value( const unsigned int cell_number, const ComponentExtractor extract_component) const { @@ -1361,18 +1304,17 @@ namespace internal - template + template void - MGDataEntry::get_function_values( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, - std::vector & patch_values) const + MGDataEntry::get_function_values( + const FEValuesBase &fe_patch_values, + const ComponentExtractor extract_component, + std::vector & patch_values) const { Assert(extract_component == ComponentExtractor::real_part, ExcNotImplemented()); - const typename DoFHandlerType::level_cell_iterator dof_cell( + const typename DoFHandler::level_cell_iterator dof_cell( &fe_patch_values.get_cell()->get_triangulation(), fe_patch_values.get_cell()->level(), fe_patch_values.get_cell()->index(), @@ -1400,18 +1342,17 @@ namespace internal - template + template void - MGDataEntry::get_function_values( - const FEValuesBase &fe_patch_values, - const ComponentExtractor extract_component, + MGDataEntry::get_function_values( + const FEValuesBase & fe_patch_values, + const ComponentExtractor extract_component, std::vector> &patch_values_system) const { Assert(extract_component == ComponentExtractor::real_part, ExcNotImplemented()); - typename DoFHandlerType::level_cell_iterator dof_cell( + typename DoFHandler::level_cell_iterator dof_cell( &fe_patch_values.get_cell()->get_triangulation(), fe_patch_values.get_cell()->level(), fe_patch_values.get_cell()->index(), @@ -1543,7 +1484,9 @@ DataOut_DoFData::add_data_vector( auto new_entry = std::make_unique< - internal::DataOutImplementation::DataEntry>( + internal::DataOutImplementation::DataEntry>( &dof_handler, &vec, &data_postprocessor); dof_data.emplace_back(std::move(new_entry)); } @@ -1665,7 +1608,9 @@ DataOut_DoFData:: // finally, add the data vector: auto new_entry = std::make_unique< - internal::DataOutImplementation::DataEntry>( + internal::DataOutImplementation::DataEntry>( dof_handler, &data_vector, deduced_names, data_component_interpretation); if (actual_type == type_dof_data) @@ -1737,9 +1682,14 @@ DataOut_DoFData::add_mg_data_vector( ExcMessage( "Invalid number of entries in data_component_interpretation.")); - auto new_entry = std::make_unique< - internal::DataOutImplementation::MGDataEntry>( - &dof_handler, &data, deduced_names, data_component_interpretation); + auto new_entry = + std::make_unique>(&dof_handler, + &data, + deduced_names, + data_component_interpretation); dof_data.emplace_back(std::move(new_entry)); } diff --git a/source/numerics/data_out_dof_data.inst.in b/source/numerics/data_out_dof_data.inst.in index 6e4b8d8307..559cf27b97 100644 --- a/source/numerics/data_out_dof_data.inst.in +++ b/source/numerics/data_out_dof_data.inst.in @@ -145,24 +145,3 @@ for (deal_II_dimension : DIMENSIONS) \} \} } - - -for (DH : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS) - { - namespace internal - \{ - namespace DataOutImplementation - \{ - template void - ParallelDataBase:: - reinit_all_fe_values< - dealii::DH>( - std::vector>>> - &dof_data, - const dealii::Triangulation::cell_iterator &cell, - const unsigned int face); - \} - \} - } diff --git a/source/numerics/data_out_dof_data_codim.inst.in b/source/numerics/data_out_dof_data_codim.inst.in index 5915471d97..cf5e763c8a 100644 --- a/source/numerics/data_out_dof_data_codim.inst.in +++ b/source/numerics/data_out_dof_data_codim.inst.in @@ -82,28 +82,3 @@ for (deal_II_dimension : DIMENSIONS; deal_II_space_dimension : DIMENSIONS) \} \} } - - -for (DH : DOFHANDLER_TEMPLATES; deal_II_dimension : DIMENSIONS; - deal_II_space_dimension : DIMENSIONS) - { - namespace internal - \{ - namespace DataOutImplementation - \{ -#if deal_II_dimension < deal_II_space_dimension - template void - ParallelDataBase:: - reinit_all_fe_values< - dealii::DH>( - std::vector>>> - &dof_data, - const dealii::Triangulation::cell_iterator - & cell, - const unsigned int face); -#endif - \} - \} - }