Feature #22574
FHiCL C++ interface for multiple choice values
Status:
Under Discussion
Priority:
Normal
Assignee:
-
Target version:
-
Start date:
05/09/2019
Due date:
% Done:
0%
Estimated time:
Description
I would like to request support in FHiCL C++ interface for multiple choice values.
I am going with an...
Example¶
Here unit
is a configuration parameter of integral type (int
) that may represent three choices: GeV (1
), MeV (2
) and megajoule (3
).
Configuration data structure¶
struct Config {
using Name = fhicl::Name;
using Comment = fhicl::Comment;
using Choices = fhicl::Choices;
fhicl::Atom<double> energy {
Name { "energy" },
Comment { "energy (unit is specified by `unit` parameter)" }
}; // energy
fhicl::Choice<int> unit {
Name { "unit" },
Comment { "energy unit" },
Choices {
{
Name { "GeV" }, // the name of the choice
Comment{ "energies are in GeV" }, // and its description
1 // the value of `unit` if this choice is picked
},
{
Name { "MeV" }, // the name of the choice
Comment{ "energies are in MeV" }, // and its description
2 // the value of `unit` if this choice is picked
},
{
Name { "MJ" }, // the name of the choice
Comment{ "energies are in megajoule" }, // and its description
3 // the value of `unit` if this choice is picked
},
},
1 // default: GeV
}; // unit
}; // Config
If the default value is omitted, the parameter is mandatory. Otherwise, its value must match a supported choice, or else a logic_error
type of exception will be thrown at run time.
Configuration FHiCL table¶
energy: 10 unit: "MeV"
Description on console screen¶
## energy (unit is specified by `unit` parameter) energy: <double> ## energy unit ## Choose one among: ## "GeV" : energies are in GeV ## "MeV" : energies are in MeV ## "MJ" : energies are in megajoule unit: "GeV" # default
User code to access the values¶
double energy = config().energy();
int unit = config().unit();
switch (unit) {
case 1: break;
case 2: energy *= 1e-3; break;
case 3: energy *= JouleToGeV * 1e-6; break;
} // switch
Throws a art::error::Configuration
type of art::Exception
(or equivalent) if the value is not acceptable.
Bonus points¶
Additional candies:
- works with
enum
and/orenum class
types - can be used in a sequence (
fhicl::ChoiceSequence
) - choice value converted from name by default (would not work in the example, but if the type is
std::string
instead ofint
it will save replicating theName
into the value on each entry - different choices may have the same value (e.g.
"MJ"
and"megajoule"
both supported and associated to the same value3
; if3
is the default value, it will be written in the description as the first of the matching choices)
History
#1 Updated by Kyle Knoepfel over 1 year ago
- Status changed from New to Under Discussion
This feature requires a design discussion. Although it seems to be a valuable feature to add, it is not clear to what extent the fhicl-cpp package can easily support this. We will get back to you.