From: wolf Date: Wed, 3 Sep 2003 15:55:28 +0000 (+0000) Subject: Allow redeclaration of parameter. X-Git-Url: https://gitweb.dealii.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9b4764d8cb9d893145d1ea5f9ead387f6dbd200a;p=dealii-svn.git Allow redeclaration of parameter. git-svn-id: https://svn.dealii.org/trunk@7955 0785d39b-7218-0410-832d-ea1e28bc413d --- diff --git a/deal.II/base/include/base/parameter_handler.h b/deal.II/base/include/base/parameter_handler.h index a8d10d782a..36c36f0a5f 100644 --- a/deal.II/base/include/base/parameter_handler.h +++ b/deal.II/base/include/base/parameter_handler.h @@ -1317,10 +1317,13 @@ class ParameterHandler * function. * * The function generates an - * exception if an entry with - * this name already exists, or - * if the default value doesn't - * match the given pattern. + * exception if the default value + * doesn't match the given + * pattern. An entry can be + * declared more than once + * without generating an error, + * for example to override an + * earlier default value. */ void declare_entry (const std::string &entry, const std::string &default_value, diff --git a/deal.II/base/source/parameter_handler.cc b/deal.II/base/source/parameter_handler.cc index e361e5b5be..fc59c9403a 100644 --- a/deal.II/base/source/parameter_handler.cc +++ b/deal.II/base/source/parameter_handler.cc @@ -661,17 +661,20 @@ ParameterHandler::declare_entry (const std::string &entry, { Section* p = get_present_defaults_subsection (); - // assertions: - // entry must not already exist - Assert (p->entries.find (entry) == p->entries.end(), - ExcEntryAlreadyExists (entry)); - // Default must match Pattern + // default must match Pattern Assert (pattern.match (default_value), ExcDefaultDoesNotMatchPattern(default_value, pattern.description())); + + // if the entry already existed, + // make sure we don't create a + // memory leak + if (p->entries.find (entry) != p->entries.end()) + delete p->entries[entry].pattern; - // entry doesn't yet exist, but - // map::operator[] will create it + // if the entry didn't yet exist, + // but map::operator[] will create + // it p->entries[entry].value = default_value; p->entries[entry].documentation = documentation; p->entries[entry].pattern = pattern.clone(); @@ -873,7 +876,7 @@ ParameterHandler::print_parameters_section (std::ostream &out, unsigned int longest_value = 0; for (ptr = pd->entries.begin(); ptr != pd->entries.end(); ++ptr) longest_value - = std::max ((size_t) longest_value, + = std::max (static_cast (longest_value), (pc->entries.find(ptr->first) != pc->entries.end() ? pc->entries[ptr->first].value diff --git a/deal.II/doc/news/c-4-0.html b/deal.II/doc/news/c-4-0.html index 104bfda18f..3cdb402966 100644 --- a/deal.II/doc/news/c-4-0.html +++ b/deal.II/doc/news/c-4-0.html @@ -84,8 +84,17 @@ contributor's names are abbreviated by WB (Wolfgang Bangerth), GK

base

    +
  1. Changed: The ParameterHandler::declare_entry function + now allows to redeclare an entry that has already been + declared. This can be used to override a default value + previously set. +
    + (WB 2002/09/03) +

    +
  2. Improved: The ParameterHandler::declare_entry now takes an + class="member">ParameterHandler::declare_entry function now takes an additional parameter (defaulting to the empty string) that can be used to document the intent of a parameter. This string, together with the default value of an entry, is written to the output by the +#include +#include +#include + + +int main () +{ + try + { + std::ofstream logfile("parameter_handler_5.output"); + deallog.attach(logfile); + deallog.depth_console(0); + + ParameterHandler prm; + prm.declare_entry ("int", + "1", + Patterns::Integer()); + prm.declare_entry ("int", + "2", + Patterns::Integer()); + + prm.print_parameters (logfile, ParameterHandler::Text); + } + catch (std::exception &exc) + { + std::cerr << std::endl << std::endl + << "----------------------------------------------------" + << std::endl; + std::cerr << "Exception on processing: " << std::endl + << exc.what() << std::endl + << "Aborting!" << std::endl + << "----------------------------------------------------" + << std::endl; + + return 1; + } + catch (...) + { + std::cerr << std::endl << std::endl + << "----------------------------------------------------" + << std::endl; + std::cerr << "Unknown exception!" << std::endl + << "Aborting!" << std::endl + << "----------------------------------------------------" + << std::endl; + return 1; + }; + + return 0; +} diff --git a/tests/results/i686-pc-linux-gnu+gcc2.95/bits/parameter_handler_5.output b/tests/results/i686-pc-linux-gnu+gcc2.95/bits/parameter_handler_5.output new file mode 100644 index 0000000000..e4615b4b2e --- /dev/null +++ b/tests/results/i686-pc-linux-gnu+gcc2.95/bits/parameter_handler_5.output @@ -0,0 +1,4 @@ + +# Listing of Parameters +# --------------------- +set int = 2 # default: 2 diff --git a/tests/results/i686-pc-linux-gnu+gcc3.2/bits/parameter_handler_5.output b/tests/results/i686-pc-linux-gnu+gcc3.2/bits/parameter_handler_5.output new file mode 100644 index 0000000000..e4615b4b2e --- /dev/null +++ b/tests/results/i686-pc-linux-gnu+gcc3.2/bits/parameter_handler_5.output @@ -0,0 +1,4 @@ + +# Listing of Parameters +# --------------------- +set int = 2 # default: 2 diff --git a/tests/results/sparc-sun-solaris2.7+gcc2.95/bits/parameter_handler_5.output b/tests/results/sparc-sun-solaris2.7+gcc2.95/bits/parameter_handler_5.output new file mode 100644 index 0000000000..e4615b4b2e --- /dev/null +++ b/tests/results/sparc-sun-solaris2.7+gcc2.95/bits/parameter_handler_5.output @@ -0,0 +1,4 @@ + +# Listing of Parameters +# --------------------- +set int = 2 # default: 2