2#ifndef STORMM_NAMELIST_EMULATOR_H
3#define STORMM_NAMELIST_EMULATOR_H
10#include "Constants/behavior.h"
11#include "DataTypes/common_types.h"
12#include "FileManagement/file_enumerators.h"
13#include "Reporting/error_format.h"
14#include "Reporting/summary_file.h"
15#include "namelist_element.h"
16#include "namelist_enumerators.h"
21using constants::CaseSensitivity;
22using constants::ExceptionResponse;
23using data_types::isFloatingPointScalarType;
24using data_types::isSignedIntegralScalarType;
25using data_types::isUnsignedIntegralScalarType;
26using diskutil::PrintSituation;
27using review::default_output_file_width;
40 CaseSensitivity casing_in = CaseSensitivity::AUTOMATIC,
41 ExceptionResponse unknown_keyword_policy = ExceptionResponse::WARN,
42 const std::string &help_in = std::string(
"No description provided"),
43 bool cli_content_in =
false);
66 const std::string&
getKeyword(
size_t index)
const;
71 NamelistType
getKeywordKind(
const std::string &keyword_query)
const;
101 InputStatus
getKeywordStatus(
const std::string &keyword_query,
const std::string &sub_key,
102 int repeat_no = 0)
const;
114 bool hasKeyword(
const std::string &query)
const;
115 bool hasKeyword(
const std::string &query, NamelistType query_kind)
const;
128 bool getBoolValue(
const std::string &keyword_query)
const;
129 bool getBoolValue(
const std::string &keyword_query,
const std::string &sub_key,
130 int index = 0)
const;
143 int getIntValue(
const std::string &keyword_query,
int index = 0)
const;
144 int getIntValue(
const std::string &keyword_query,
const std::string &sub_key,
145 int index = 0)
const;
158 double getRealValue(
const std::string &keyword_query,
int index = 0)
const;
159 double getRealValue(
const std::string &keyword_query,
const std::string &sub_key,
160 int index = 0)
const;
173 const std::string&
getStringValue(
const std::string &keyword_query,
int index = 0)
const;
174 const std::string&
getStringValue(
const std::string &keyword_query,
const std::string &sub_key,
175 int index = 0)
const;
183 const std::string &sub_key)
const;
189 const std::string &sub_key = std::string(
""))
const;
195 const std::string &sub_key = std::string(
""))
const;
200 std::vector<std::string>
202 const std::string &sub_key = std::string(
""))
const;
214 const std::string&
getHelp()
const;
215 const std::string&
getHelp(
const std::string &keyword_query)
const;
216 const std::string&
getHelp(
const std::string &keyword_query,
const std::string &sub_key)
const;
245 template <
typename T>
246 void assignVariable(T *var,
double mult,
const std::string &keyword_query,
int index = 0)
const;
248 template <
typename T>
249 void assignVariable(T *var,
const std::string &keyword_query,
int index = 0)
const;
251 void assignVariable(std::string *var,
double mult,
const std::string &keyword_query,
252 int index = 0)
const;
254 void assignVariable(std::string *var,
const std::string &keyword_query,
int index = 0)
const;
256 template <
typename T>
257 void assignVariable(T *var_x, T *var_y, T *var_z,
double mult,
const std::string &keyword_query,
258 int index = 0)
const;
260 template <
typename T>
261 void assignVariable(T *var_x, T *var_y, T *var_z,
const std::string &keyword_query,
262 int index = 0)
const;
264 template <
typename T>
265 void assignVariable(T *var,
const std::string &keyword_query,
const std::string &sub_key,
266 int index = 0)
const;
268 template <
typename T>
269 void assignVariable(T *var,
double mult,
const std::string &keyword_query,
270 const std::string &sub_key,
int index = 0)
const;
272 void assignVariable(std::string *var,
double mult,
const std::string &keyword_query,
273 const std::string &sub_key,
int index = 0)
const;
275 void assignVariable(std::string *var,
const std::string &keyword_query,
276 const std::string &sub_key,
int index = 0)
const;
278 template <
typename T>
279 void assignVariable(T *var_x, T *var_y, T *var_z,
double mult,
const std::string &keyword_query,
280 const std::string &sub_key,
int index = 0)
const;
282 template <
typename T>
283 void assignVariable(T *var_x, T *var_y, T *var_z,
const std::string &keyword_query,
284 const std::string &sub_key,
int index = 0)
const;
290 void setTitle(
const std::string &title_in);
313 void addKeyword(
const std::vector<NamelistElement> &new_keys);
315 void addKeywords(
const std::vector<NamelistElement> &new_keys);
319 void addKeyword(
const std::string &keyword_in, NamelistType kind_in,
320 const std::string &default_in = std::string(
""),
321 DefaultIsObligatory obligate = DefaultIsObligatory::NO,
322 InputRepeats rep_in = InputRepeats::NO,
323 const std::string &help_in = std::string(
"No description provided"));
325 void addKeyword(
const std::string keyword_in,
const std::vector<std::string> &sub_keys_in,
326 const std::vector<NamelistType> &sub_kinds_in,
327 const std::vector<std::string> &default_list,
328 DefaultIsObligatory obligate_list = DefaultIsObligatory::NO,
329 InputRepeats rep_in = InputRepeats::NO,
330 const std::string &help_in = std::string(
"No description provided"),
331 const std::vector<std::string> &sub_help_in =
332 std::vector<std::string>(1,
"No description provided"),
333 const std::vector<KeyRequirement> &template_requirements_in = {});
351 void setDefaultValue(
const std::string &key,
const std::string &modified_default,
352 int default_idx = 0);
353 void setDefaultValue(
const std::string &key,
const std::vector<std::string> &modified_defaults,
354 const std::vector<std::string> &sub_key_specs);
363 void addDefaultValue(
const std::string &key,
const std::string &next_default);
378 void activateBool(
const std::string &key,
const std::string &sub_key);
398 int assignElement(
const std::string &key,
const std::string &value);
399 int assignElement(
const std::string &key,
const std::string &sub_key,
const std::string &value);
429 void addHelp(
const std::string &blurb);
430 void addHelp(
const std::string &key,
const std::string &blurb);
431 void addHelp(
const std::string &key,
const std::string &sub_key,
const std::string &blurb);
444 void categorizeKeyword(
const std::string &key,
const std::string &category_label);
459 void setImperative(
const std::string &key, KeyRequirement req);
460 void setImperative(
const std::vector<std::string> &directives);
461 void setImperative(
const std::string &key,
const std::vector<std::string> &directives);
474 const std::string &kw_dflt)
const;
504 std::string
printContents(
int file_width = default_output_file_width,
int max_entry_counts = 4,
505 NamelistIntroduction print_decor = NamelistIntroduction::HEADER)
const;
507 void printContents(std::ostream *foutp,
int file_width = default_output_file_width,
508 int max_entry_counts = 4,
509 NamelistIntroduction print_decor = NamelistIntroduction::HEADER)
const;
511 void printContents(std::ofstream *foutp,
int file_width = default_output_file_width,
512 int max_entry_counts = 4,
513 NamelistIntroduction print_decor = NamelistIntroduction::HEADER)
const;
515 void printContents(
const std::string &file_name, PrintSituation expectation,
516 int file_width = default_output_file_width,
int max_entry_counts = 4,
517 NamelistIntroduction print_decor = NamelistIntroduction::HEADER)
const;
525 std::vector<NamelistElement> keywords;
526 CaseSensitivity casing;
527 ExceptionResponse policy;
530 std::string help_message;
531 std::vector<std::string> category_names;
535 std::vector<std::vector<std::string>> categories;
544 int findIndexByKeyword(
const std::string &query)
const;
554 void verifyEstablishment(
const std::string &keyword_query,
const size_t p_index,
555 const char* caller)
const;
561#include "namelist_emulator.tpp"
NamelistEmulator(const std::string &title_in, CaseSensitivity casing_in=CaseSensitivity::AUTOMATIC, ExceptionResponse unknown_keyword_policy=ExceptionResponse::WARN, const std::string &help_in=std::string("No description provided"), bool cli_content_in=false)
Construct an object to emulate Fortran namelist functionality, with improvements.
Definition namelist_emulator.cpp:29
One keyword found in a namelist, ready to store the namelist variable moniker, the type,...
Definition namelist_element.h:18
Collection of variables to transcribe information contained within a namelist.
Definition namelist_emulator.h:30
std::vector< int > getAllIntValues(const std::string &keyword_query, const std::string &sub_key=std::string("")) const
Get all integer values assigned to a particular keyword.
Definition namelist_emulator.cpp:257
void categorizeKeyword(const std::string &key, const std::string &category_label)
Place a namelist keyword into one of a list of arbitrary categories defined by the developer....
Definition namelist_emulator.cpp:907
const std::string & getStringValue(const std::string &keyword_query, int index=0) const
Get a labeled string value from within the namelist.
Definition namelist_emulator.cpp:220
void setDefaultValue(const std::string &key, const std::string &modified_default, int default_idx=0)
Set a default value for one of the namelist's keywords. Like addDefaultValue() and other functions be...
Definition namelist_emulator.cpp:466
void setTitle(const std::string &title_in)
Set the title of the namelist.
Definition namelist_emulator.cpp:350
int getKeywordEntries(const std::string &keyword_query) const
Get the number of entries associated with a specific keyword.
Definition namelist_emulator.cpp:87
double getRealValue(const std::string &keyword_query, int index=0) const
Get a labeled real number value from within the namelist.
Definition namelist_emulator.cpp:197
void triggerResizeBuffer(const std::string &key)
When loading data for STRUCT-type keywords, the decision to increment the number of entries on file c...
Definition namelist_emulator.cpp:787
bool getBoolValue(const std::string &keyword_query) const
Get the value of a boolean keyword from the within the namelist.
Definition namelist_emulator.cpp:151
void addKeyword(const std::vector< NamelistElement > &new_keys)
Add a keyword to the namelist.
Definition namelist_emulator.cpp:360
InputStatus getKeywordStatus(const std::string &keyword_query) const
Test whether a keyword has been set, be that by default or user input.
Definition namelist_emulator.cpp:117
void printHelp() const
Print a detailed message concerning the user documentation for keywords in this namelist....
Definition namelist_emulator.cpp:1161
NamelistEmulator(const std::string &title_in, CaseSensitivity casing_in=CaseSensitivity::AUTOMATIC, ExceptionResponse unknown_keyword_policy=ExceptionResponse::WARN, const std::string &help_in=std::string("No description provided"), bool cli_content_in=false)
Construct an object to emulate Fortran namelist functionality, with improvements.
Definition namelist_emulator.cpp:29
int getIntValue(const std::string &keyword_query, int index=0) const
Get a labeled integer value from within the namelist.
Definition namelist_emulator.cpp:174
void addDefaultValue(const std::string &key, const std::string &next_default)
Add a value to one keyword's default settings. This enables a single keyword to have a collection of ...
Definition namelist_emulator.cpp:508
void assignVariable(T *var, double mult, const std::string &keyword_query, int index=0) const
Assign a value, external to the object, based on the content inside of it. This will first check whet...
std::vector< std::string > getAllStringValues(const std::string &keyword_query, const std::string &sub_key=std::string("")) const
Get all string values assigned to a particular keyword.
Definition namelist_emulator.cpp:281
void setImperative(const std::string &key, KeyRequirement req)
Change the requirement associated with a keyword. By default, all keywords are set to "REQUIRED" just...
Definition namelist_emulator.cpp:927
const NamelistEmulator * getSelfPointer() const
Get a pointer to the object itself.
Definition namelist_emulator.cpp:329
int assignElement(const std::string &key, const std::string &value)
Assign values to elements of each particular NamelistType. These overloaded functions can be called f...
Definition namelist_emulator.cpp:630
const std::string & getTitle() const
Obtain the title of this namelist (i.e. &cntrl or &dock)
Definition namelist_emulator.cpp:43
void setCommandLineContent(bool cli_content_in=true)
Set whether the namelist actually serves command line input for a whole program.
Definition namelist_emulator.cpp:355
std::vector< bool > getAllBoolValues(const std::string &keyword_query, const std::string &sub_key) const
Get all boolen values assigned to a particular keyword. The keyword must have STRUCT type,...
Definition namelist_emulator.cpp:245
std::string printContents(int file_width=default_output_file_width, int max_entry_counts=4, NamelistIntroduction print_decor=NamelistIntroduction::HEADER) const
Print a complete table of the values for all parameters in this namelist, starting including their so...
Definition namelist_emulator.cpp:1233
NamelistType getKeywordKind(const std::string &keyword_query) const
Get the type of a specific keyword within this namelist.
Definition namelist_emulator.cpp:77
int getSubKeyCount(const std::string &keyword_query) const
Get the template size of a keyword, the number of sub-keys it contains. For non-struct keywords the t...
Definition namelist_emulator.cpp:107
void addHelp(const std::string &blurb)
Attach a help message to the namelist itself, to a keyword within the namelist, or even to a member v...
Definition namelist_emulator.cpp:866
void addCategory(const std::string &new_category)
Add a category to a namelist to group its keywords for user documentation.
Definition namelist_emulator.cpp:902
bool hasKeyword(const std::string &query) const
Test whether a namelist contains a particular keyword at all.
Definition namelist_emulator.cpp:139
std::string convertDefaultToString(const NamelistElement &tkw) const
Convert the default value of a keyword to a string for output in a formatted table.
Definition namelist_emulator.cpp:1107
void activateBool(const std::string &key)
Activate a BOOL-type keyword, or a BOOL-type member of a STRUCT-type keyword. These functions are ana...
Definition namelist_emulator.cpp:527
bool isCommandLineContent() const
Detect whether the namelist emulator serves command-line inputs for a program.
Definition namelist_emulator.cpp:48
std::vector< double > getAllRealValues(const std::string &keyword_query, const std::string &sub_key=std::string("")) const
Get all real values assigned to a particular keyword.
Definition namelist_emulator.cpp:269
CaseSensitivity getCaseSensitivity() const
Obtain the case sensitivity setting for this namelist.
Definition namelist_emulator.cpp:58
ExceptionResponse getPolicy() const
Relay the exception handling policy for this namelist.
Definition namelist_emulator.cpp:63
void printKeywordDocumentation(int p_idx, int name_width, int kw_kind_width, const std::string &kw_dflt) const
Print the documentation for a specific keyword. The format is fixed in the sense that it will have a ...
Definition namelist_emulator.cpp:1045
int getKeywordCount() const
Obtain the number of parameters catalogged within this namelist emulator.
Definition namelist_emulator.cpp:53
const std::string & getHelp() const
Report the help message associated with a keyword or sub-key. This can be useful for developers who w...
Definition namelist_emulator.cpp:293
const std::string & getKeyword(size_t index) const
Get a keyword from this namelist based on an index. This is for retrieving the keyword itself,...
Definition namelist_emulator.cpp:68