Replace "%t" in option descriptions with time unit.
authorTeemu Murtola <teemu.murtola@gmail.com>
Thu, 3 May 2012 08:46:35 +0000 (11:46 +0300)
committerTeemu Murtola <teemu.murtola@gmail.com>
Thu, 3 May 2012 15:57:58 +0000 (18:57 +0300)
Not sure how useful this is, but there was such functionality in the old
option listing, and it was easy to implement.

IssueID #666

Change-Id: Ib9538211fefcde7a89dceb7e1b30a81ab03d9e76

src/gromacs/commandline/cmdlinehelpwriter-impl.h
src/gromacs/commandline/cmdlinehelpwriter.cpp
src/gromacs/commandline/cmdlinehelpwriter.h
src/gromacs/commandline/tests/cmdlinehelpwriter.cpp
src/gromacs/commandline/tests/refdata/CommandLineHelpWriterTest_HandlesOptionTypes.xml
src/gromacs/trajectoryanalysis/cmdlinerunner.cpp

index 287d024e986fe066acee0f9590ddbd520c3a90df..a654ec320796983b6dddba71ff2caed48022636f 100644 (file)
@@ -38,6 +38,8 @@
 #ifndef GMX_COMMANDLINE_CMDLINEHELPWRITER_IMPL_H
 #define GMX_COMMANDLINE_CMDLINEHELPWRITER_IMPL_H
 
+#include <string>
+
 #include "cmdlinehelpwriter.h"
 
 namespace gmx
@@ -58,6 +60,8 @@ class CommandLineHelpWriter::Impl
 
         //! Options object to use for generating help.
         const Options          &options_;
+        //! Time unit to show in descriptions.
+        std::string             timeUnit_;
         //! Whether to write descriptions to output.
         bool                    bShowDescriptions_;
         //! Whether to write hidden options to output.
index 07458e9e5abe2ff190d8cb3b23f69f029b761ca2..6cb1273f54032bb8a9604a600827baed99bab8b1 100644 (file)
@@ -49,6 +49,7 @@
 #include "gromacs/options/filenameoptioninfo.h"
 #include "gromacs/options/options.h"
 #include "gromacs/options/optionsvisitor.h"
+#include "gromacs/options/timeunitmanager.h"
 #include "gromacs/selection/selectionfileoptioninfo.h"
 #include "gromacs/selection/selectionoptioninfo.h"
 #include "gromacs/utility/format.h"
@@ -253,7 +254,7 @@ class ParameterWriter : public OptionsVisitor
 {
     public:
         //! Creates a helper object for writing non-file parameters.
-        explicit ParameterWriter(FILE *fp);
+        ParameterWriter(FILE *fp, const char *timeUnit);
 
         //! Sets the writer to show hidden options.
         void setShowHidden(bool bSet) { bShowHidden_ = bSet; }
@@ -266,11 +267,12 @@ class ParameterWriter : public OptionsVisitor
     private:
         FILE                   *fp_;
         TextTableFormatter      formatter_;
+        const char             *timeUnit_;
         bool                    bShowHidden_;
 };
 
-ParameterWriter::ParameterWriter(FILE *fp)
-    : fp_(fp), bShowHidden_(false)
+ParameterWriter::ParameterWriter(FILE *fp, const char *timeUnit)
+    : fp_(fp), timeUnit_(timeUnit), bShowHidden_(false)
 {
     formatter_.addColumn("Option",      12, false);
     formatter_.addColumn("Type",         6, false);
@@ -316,7 +318,13 @@ void ParameterWriter::visitOption(const OptionInfo &option)
         values.append(option.formatValue(i));
     }
     formatter_.addColumnLine(2, values);
-    formatter_.addColumnLine(3, substituteMarkup(option.description()));
+    std::string description(substituteMarkup(option.description()));
+    const DoubleOptionInfo *doubleOption = option.toType<DoubleOptionInfo>();
+    if (doubleOption != NULL && doubleOption->isTime())
+    {
+        description = replaceAll(description, "%t", timeUnit_);
+    }
+    formatter_.addColumnLine(3, description);
     if (values.length() > 6U)
     {
         formatter_.setColumnFirstLineOffset(3, 1);
@@ -399,7 +407,8 @@ void SelectionParameterWriter::visitOption(const OptionInfo &option)
  */
 
 CommandLineHelpWriter::Impl::Impl(const Options &options)
-    : options_(options), bShowDescriptions_(false), bShowHidden_(false)
+    : options_(options), timeUnit_(TimeUnitManager().timeUnitAsString()),
+      bShowDescriptions_(false), bShowHidden_(false)
 {
 }
 
@@ -428,6 +437,12 @@ CommandLineHelpWriter &CommandLineHelpWriter::setShowDescriptions(bool bSet)
     return *this;
 }
 
+CommandLineHelpWriter &CommandLineHelpWriter::setTimeUnitString(const char *timeUnit)
+{
+    impl_->timeUnit_ = timeUnit;
+    return *this;
+}
+
 void CommandLineHelpWriter::writeHelp(FILE *fp)
 {
     if (impl_->bShowDescriptions_)
@@ -445,7 +460,7 @@ void CommandLineHelpWriter::writeHelp(FILE *fp)
         }
     }
     {
-        ParameterWriter writer(fp);
+        ParameterWriter writer(fp, impl_->timeUnit_.c_str());
         writer.setShowHidden(impl_->bShowHidden_);
         writer.visitSubSection(impl_->options_);
         if (writer.didOutput())
index 763a3440cd48bcbbb3af7f6118d9e52a29f8deba..6aff979a4cd280e3a0dced4bd71eaf1eb40c107a 100644 (file)
@@ -73,6 +73,17 @@ class CommandLineHelpWriter
          * Sets whether long descriptions for sections are shown in the help.
          */
         CommandLineHelpWriter &setShowDescriptions(bool bShow);
+        /*! \brief
+         * Sets time unit to show in descriptions.
+         *
+         * \param[in] timeUnit  Time unit to show in descriptions.
+         * \throws    std::bad_alloc if out of memory.
+         *
+         * For each time parameter, any "%t" in the description is replaced
+         * with \p timeunit.
+         * If not called, uses a default "ps".
+         */
+        CommandLineHelpWriter &setTimeUnitString(const char *timeUnit);
 
         /*! \brief
          * Writes the help.
index 17a48d9452bfe5e88199d5ad8ec56b728ae78006..8a73b0083bb33510f75fa8ba23ade3767f93cca6 100644 (file)
@@ -122,8 +122,8 @@ TEST_F(CommandLineHelpWriterTest, HandlesOptionTypes)
     dvec dblvec = {1.1, 2.3, 3.2};
     options.addOption(DoubleOption("dvec").description("Double vector option")
                         .vector().store(dblvec));
-    options.addOption(DoubleOption("time").description("Time option")
-                        .defaultValue(10.0));
+    options.addOption(DoubleOption("time").description("Time option (%t)")
+                        .timeValue().defaultValue(10.0));
     options.addOption(StringOption("string").description("String option")
                         .defaultValue("test"));
     const char * const enumValues[] = {"no", "opt1", "opt2", NULL};
index 5a5029c115f1e6f4da717e9b99f8ef7c5eb19821..776c3039a5fee59ac87e8224e89acf73c64ac232 100644 (file)
@@ -19,7 +19,7 @@ Option       Type   Value  Description
 -double      double 2.5    Double option
 -dvec        vector 1.1 2.3 3.2
                            Double vector option
--time        double 10     Time option
+-time        time   10     Time option (ps)
 -string      string test   String option
 -enum        enum   no     Enum option: no, opt1, or opt2
 
index f3bd44c0bef17bc18aecac5f2de11fa69edf003a..d1a0f62dadf4a943707e6d63abe1fbd573eb412b 100644 (file)
@@ -71,6 +71,7 @@ class TrajectoryAnalysisCommandLineRunner::Impl
         ~Impl();
 
         void printHelp(const Options &options,
+                       const TrajectoryAnalysisSettings &settings,
                        const TrajectoryAnalysisRunnerCommon &common);
         bool parseOptions(TrajectoryAnalysisSettings *settings,
                           TrajectoryAnalysisRunnerCommon *common,
@@ -98,6 +99,7 @@ TrajectoryAnalysisCommandLineRunner::Impl::~Impl()
 void
 TrajectoryAnalysisCommandLineRunner::Impl::printHelp(
         const Options &options,
+        const TrajectoryAnalysisSettings &settings,
         const TrajectoryAnalysisRunnerCommon &common)
 {
     TrajectoryAnalysisRunnerCommon::HelpFlags flags = common.helpFlags();
@@ -106,6 +108,7 @@ TrajectoryAnalysisCommandLineRunner::Impl::printHelp(
         CommandLineHelpWriter(options)
             .setShowDescriptions(flags & TrajectoryAnalysisRunnerCommon::efHelpShowDescriptions)
             .setShowHidden(flags & TrajectoryAnalysisRunnerCommon::efHelpShowHidden)
+            .setTimeUnitString(settings.timeUnitManager().timeUnitAsString())
             .writeHelp(stderr);
     }
 }
@@ -137,10 +140,10 @@ TrajectoryAnalysisCommandLineRunner::Impl::parseOptions(
         }
         catch (const UserInputError &ex)
         {
-            printHelp(*options, *common);
+            printHelp(*options, *settings, *common);
             throw;
         }
-        printHelp(*options, *common);
+        printHelp(*options, *settings, *common);
         common->scaleTimeOptions(options);
         options->finish();
     }