Remove options::getAll() (#7111)
authorGereon Kremer <nafur42@gmail.com>
Thu, 2 Sep 2021 17:46:47 +0000 (10:46 -0700)
committerGitHub <noreply@github.com>
Thu, 2 Sep 2021 17:46:47 +0000 (17:46 +0000)
options::getAll() returns a list of all options and their current values as strings. The same functionality can be obtained by using options::getNames() and options::get(). This PR does exactly this replacement, getting rid of a large chunk of generated code. Calling getInfo("all-options") may suffer a minor performance hit, but not noticeable in practice.

src/options/mkoptions.py
src/options/options_public.h
src/options/options_public_template.cpp
src/smt/smt_engine.cpp

index 30c2fc1c34392bdfbeabd473616b7bd5c14d9f29..289fa95dbd615beb40cc7c16eccaa809b1a7e1c5 100644 (file)
@@ -214,22 +214,6 @@ def get_predicates(option):
     return res
 
 
-def get_getall(module, option):
-    """Render snippet to add option to result of getAll()"""
-    if option.type == 'bool':
-        return 'res.push_back({{"{}", opts.{}.{} ? "true" : "false"}});'.format(
-            option.long_name, module.id, option.name)
-    elif option.type == 'std::string':
-        return 'res.push_back({{"{}", opts.{}.{}}});'.format(
-            option.long_name, module.id, option.name)
-    elif is_numeric_cpp_type(option.type):
-        return 'res.push_back({{"{}", std::to_string(opts.{}.{})}});'.format(
-            option.long_name, module.id, option.name)
-    else:
-        return '{{ std::stringstream ss; ss << opts.{}.{}; res.push_back({{"{}", ss.str()}}); }}'.format(module.id,
-            option.name, option.long_name)
-
-
 class Module(object):
     """Options module.
 
@@ -700,7 +684,6 @@ def codegen_all_modules(modules, build_dir, dst_dir, tpls):
     headers_handler = set()  # option includes (for handlers, predicates, ...)
     getopt_short = []        # short options for getopt_long
     getopt_long = []         # long options for getopt_long
-    options_getall = []      # options for options::getAll()
     options_get_info = []    # code for getOptionInfo()
     options_handler = []     # option handler calls
     options_names = set()    # option names
@@ -889,11 +872,6 @@ def codegen_all_modules(modules, build_dir, dst_dir, tpls):
                 cases.append('  break;')
                 options_handler.extend(cases)
 
-            if option.name:
-                # Build options for options::getOptions()
-                if option.long_name:
-                    options_getall.append(get_getall(module, option))
-
     options_all_names = ', '.join(map(lambda s: '"' + s + '"', sorted(options_names)))
     options_all_names = '\n'.join(textwrap.wrap(options_all_names, width=80, break_on_hyphens=False))
 
@@ -911,7 +889,6 @@ def codegen_all_modules(modules, build_dir, dst_dir, tpls):
         'help_others': '\n'.join(help_others),
         'options_handler': '\n    '.join(options_handler),
         'options_short': ''.join(getopt_short),
-        'options_getall': '\n  '.join(options_getall),
         'options_all_names': options_all_names,
         'options_get_info': '\n  '.join(sorted(options_get_info)),
         'getoption_handlers': '\n'.join(getoption_handlers),
index 17a70cadd15af9249e4d5cd5ecc17c8bbeb17f95..afd7777610df4a911f9e3112b238a284b80b8f36 100644 (file)
  * directory for licensing information.
  * ****************************************************************************
  *
- * Global (command-line, set-option, ...) parameters for SMT.
+ * Implements a basic options API intended to be used by the external API:
+ * - list option names (`getNames()`)
+ * - get option value by name (`get()`)
+ * - set option value by name (`set()`)
+ * - get more detailed option information (`getInfo()`)
  */
 
 #include "cvc5_public.h"
@@ -46,11 +50,6 @@ void set(Options& opts,
          const std::string& name,
          const std::string& optionarg) CVC5_EXPORT;
 
-/**
- * Get the setting for all options.
- */
-std::vector<std::vector<std::string> > getAll(const Options& opts) CVC5_EXPORT;
-
 /**
  * Get a (sorted) list of all option names that are available.
  */
index 6269894b48fe099f53bb10bd99a1ce58dfd26993..4beb47e0fdb91c736ee5ad8999b51aab9b5d504c 100644 (file)
@@ -257,15 +257,6 @@ void set(Options& opts, const std::string& name, const std::string& optionarg)
   setInternal(opts, name, optionarg);
 }
 
-std::vector<std::vector<std::string> > getAll(const Options& opts)
-{
-  std::vector<std::vector<std::string>> res;
-  // clang-format off
-  ${options_getall}$
-  // clang-format on
-  return res;
-}
-
 std::vector<std::string> getNames()
 {
   return {
index 5403928ecefdf7f72c018f6ce0d0724efa080a96..72268aa038af01aa68c0710fa800ef4237ca1317 100644 (file)
@@ -520,7 +520,12 @@ std::string SmtEngine::getInfo(const std::string& key) const
   }
   Assert(key == "all-options");
   // get the options, like all-statistics
-  return toSExpr(options::getAll(getOptions()));
+  std::vector<std::vector<std::string>> res;
+  for (const auto& opt: options::getNames())
+  {
+    res.emplace_back(std::vector<std::string>{opt, options::get(getOptions(), opt)});
+  }
+  return toSExpr(res);
 }
 
 void SmtEngine::debugCheckFormals(const std::vector<Node>& formals, Node func)