Print default file names for command-line help.
authorTeemu Murtola <teemu.murtola@gmail.com>
Mon, 7 May 2012 03:56:55 +0000 (06:56 +0300)
committerTeemu Murtola <teemu.murtola@gmail.com>
Mon, 7 May 2012 03:56:55 +0000 (06:56 +0300)
Print the value set with defaultValueIfSet() for a file name option in
the command-line help if no other value is provided for the option.

- The value is formatted by the AbstractOptionStorage::formatValue()
  pure virtual method when a special index is provided.
- OptionStorageTemplate implements handling of this special index, and
  provides a new pure virtual method formatSingleValue() to do the
  actual formatting, which no longer needs to know where the value comes
  from.
- Adjust the concrete option storage classes to the changes.

IssueID #666.

Change-Id: I8b51262042415f314bd5d4c8da51e6e31cfe3b21

13 files changed:
src/gromacs/commandline/cmdlinehelpwriter.cpp
src/gromacs/commandline/tests/refdata/CommandLineHelpWriterTest_HandlesOptionTypes.xml
src/gromacs/options/abstractoption.cpp
src/gromacs/options/abstractoptionstorage.h
src/gromacs/options/basicoptions.cpp
src/gromacs/options/basicoptionstorage.h
src/gromacs/options/filenameoption.cpp
src/gromacs/options/filenameoptionstorage.h
src/gromacs/options/optioninfo.h
src/gromacs/options/optionstoragetemplate.h
src/gromacs/options/tests/abstractoptionstorage.cpp
src/gromacs/selection/selectionoption.cpp
src/gromacs/selection/selectionoptionstorage.h

index 6cb1273f54032bb8a9604a600827baed99bab8b1..eec9c6ede44a22fc16f725ccb94254dbb1683784 100644 (file)
@@ -170,9 +170,17 @@ void FileParameterWriter::visitOptionType(const FileNameOptionInfo &option)
     formatter_.clear();
     std::string name(formatString("-%s", option.name().c_str()));
     formatter_.addColumnLine(0, name);
-    for (int i = 0; i < option.valueCount(); ++i)
+    for (int i = 0; i < option.valueCount() || i == 0; ++i)
     {
-        std::string value(option.formatValue(i));
+        std::string value;
+        if (option.valueCount() == 0)
+        {
+            value = option.formatDefaultValueIfSet();
+        }
+        else
+        {
+            value = option.formatValue(i);
+        }
         formatter_.addColumnLine(1, value);
         if (value.length() > 12U && i == firstShortValue)
         {
index 776c3039a5fee59ac87e8224e89acf73c64ac232..8d97077a35cc6ab41732e9e5a26e790fbf2fb5c0 100644 (file)
@@ -5,7 +5,7 @@
 Option Filename     Type         Description
 ---------------------------------------------------------
 -f     traj         Input        Input file description
--lib                Input, Opt., Lib.
+-lib   libdata      Input, Opt., Lib.
                                  Library file description
 -io                 In/Out, Opt. Input/Output file description
 -o                  Output, Opt. Output file description
index 40f752d1d7e51bc471e6ed278f15a7a583eff397..1b201a824106d8d0a8978d9c03a265560e4b3948 100644 (file)
@@ -211,4 +211,9 @@ std::string OptionInfo::formatValue(int i) const
     return option().formatValue(i);
 }
 
+std::string OptionInfo::formatDefaultValueIfSet() const
+{
+    return option().formatDefaultValueIfSet();
+}
+
 } // namespace gmx
index ae89ba91e9f43a49df5d6d83b37e772b0ac1cb2b..23e9bf0ffcf5b2ade2446cec80710985636d5ca7 100644 (file)
@@ -119,8 +119,14 @@ class AbstractOptionStorage
         virtual int valueCount() const = 0;
         /*! \brief
          * Returns the i'th value formatted as a string.
+         *
+         * If \p i is DefaultValueIfSetIndex, should format the default value
+         * if set (see OptionTemplate::defaultValueIfSet()).
          */
         virtual std::string formatValue(int i) const = 0;
+        //! \copydoc OptionInfo::formatDefaultValueIfSet()
+        std::string formatDefaultValueIfSet() const
+        { return formatValue(DefaultValueIfSetIndex); }
 
         /*! \brief
          * Starts adding values from a new source for the option.
@@ -179,6 +185,9 @@ class AbstractOptionStorage
         void finish();
 
     protected:
+        //! Index used with formatValue() for formatting default value if set.
+        static const int DefaultValueIfSetIndex = -1;
+
         /*! \brief
          * Initializes the storage object from the settings object.
          *
index 4a5c03050e1bf77435e8317b1ff073e2ff268472..2ed66caa3fc5c97184c990e68b04a4ad4e09bf22 100644 (file)
@@ -72,9 +72,8 @@ namespace gmx
  * BooleanOptionStorage
  */
 
-std::string BooleanOptionStorage::formatValue(int i) const
+std::string BooleanOptionStorage::formatSingleValue(const bool &value) const
 {
-    bool value = values()[i];
     return value ? "yes" : "no";
 }
 
@@ -117,9 +116,8 @@ AbstractOptionStoragePointer BooleanOption::createStorage() const
  * IntegerOptionStorage
  */
 
-std::string IntegerOptionStorage::formatValue(int i) const
+std::string IntegerOptionStorage::formatSingleValue(const int &value) const
 {
-    int value = values()[i];
     return formatString("%d", value);
 }
 
@@ -176,9 +174,9 @@ const char *DoubleOptionStorage::typeString() const
     return hasFlag(efVector) ? "vector" : (isTime() ? "time" : "double");
 }
 
-std::string DoubleOptionStorage::formatValue(int i) const
+std::string DoubleOptionStorage::formatSingleValue(const double &value) const
 {
-    return formatString("%g", values()[i] / factor_);
+    return formatString("%g", value / factor_);
 }
 
 void DoubleOptionStorage::convertValue(const std::string &value)
@@ -324,9 +322,9 @@ StringOptionStorage::StringOptionStorage(const StringOption &settings)
     }
 }
 
-std::string StringOptionStorage::formatValue(int i) const
+std::string StringOptionStorage::formatSingleValue(const std::string &value) const
 {
-    return values()[i];
+    return value;
 }
 
 void StringOptionStorage::convertValue(const std::string &value)
index 506f5e85fbda3cd79e6a65419d1f1b9f3abd3bef..9c73e9cb255ab924cb3e75cfe0f9e62486d8c354 100644 (file)
@@ -75,7 +75,7 @@ class BooleanOptionStorage : public OptionStorageTemplate<bool>
 
         virtual OptionInfo &optionInfo() { return info_; }
         virtual const char *typeString() const { return "bool"; }
-        virtual std::string formatValue(int i) const;
+        virtual std::string formatSingleValue(const bool &value) const;
 
     private:
         virtual void convertValue(const std::string &value);
@@ -98,7 +98,7 @@ class IntegerOptionStorage : public OptionStorageTemplate<int>
         virtual OptionInfo &optionInfo() { return info_; }
         virtual const char *typeString() const
         { return hasFlag(efVector) ? "vector" : "int"; }
-        virtual std::string formatValue(int i) const;
+        virtual std::string formatSingleValue(const int &value) const;
 
     private:
         virtual void convertValue(const std::string &value);
@@ -118,7 +118,7 @@ class DoubleOptionStorage : public OptionStorageTemplate<double>
 
         virtual OptionInfo &optionInfo() { return info_; }
         virtual const char *typeString() const;
-        virtual std::string formatValue(int i) const;
+        virtual std::string formatSingleValue(const double &value) const;
 
         //! \copydoc DoubleOptionInfo::isTime()
         bool isTime() const { return bTime_; }
@@ -146,7 +146,7 @@ class StringOptionStorage : public OptionStorageTemplate<std::string>
 
         virtual OptionInfo &optionInfo() { return _info; }
         virtual const char *typeString() const { return _allowed.empty() ? "string" : "enum"; }
-        virtual std::string formatValue(int i) const;
+        virtual std::string formatSingleValue(const std::string &value) const;
 
     private:
         virtual void convertValue(const std::string &value);
index b8adfcb8554a6f3074c2ea3a02af3d3b2e1eb561..e7384acdaa81900f1ab0982857da9ea0c45fd4d8 100644 (file)
@@ -58,9 +58,9 @@ FileNameOptionStorage::FileNameOptionStorage(const FileNameOption &settings)
 {
 }
 
-std::string FileNameOptionStorage::formatValue(int i) const
+std::string FileNameOptionStorage::formatSingleValue(const std::string &value) const
 {
-    return values()[i];
+    return value;
 }
 
 void FileNameOptionStorage::convertValue(const std::string &value)
index f86cd7fe708369df529b673f0cc402bad54d67d9..6db97156c84eb62700c9ea2435a56103b41585a4 100644 (file)
@@ -61,7 +61,7 @@ class FileNameOptionStorage : public OptionStorageTemplate<std::string>
 
         virtual OptionInfo &optionInfo() { return info_; }
         virtual const char *typeString() const { return "file"; }
-        virtual std::string formatValue(int i) const;
+        virtual std::string formatSingleValue(const std::string &value) const;
 
         //! \copydoc FileNameOptionInfo::isInputFile()
         bool isInputFile() const { return bRead_ && !bWrite_; }
index 6c2d2b88bebda6a29d6e80773253d7425197edf9..49fb30bcaa9fbddf484814433a86ed58ecce45ef 100644 (file)
@@ -116,6 +116,12 @@ class OptionInfo
         int valueCount() const;
         //! Returns the i'th value of the option as a string.
         std::string formatValue(int i) const;
+        /*! \brief
+         * Returns the default value if set for the option as a string.
+         *
+         * \see OptionTemplate::defaultValueIfSet()
+         */
+        std::string formatDefaultValueIfSet() const;
 
     protected:
         /*! \cond libapi */
index a6dd8c455cacd6a6a7ee25a626c478cee9a52f96..2703e84ab81c9aebd0fbb6d89b5b4ff68a552ecc 100644 (file)
@@ -94,7 +94,14 @@ class OptionStorageTemplate : public AbstractOptionStorage
         // the declarations are still included for clarity.
         virtual const char *typeString() const = 0;
         virtual int valueCount() const { return static_cast<int>(_values->size()); }
-        virtual std::string formatValue(int i) const = 0;
+        /*! \copydoc AbstractOptionStorage::formatValue()
+         *
+         * OptionStorageTemplate implements handling of DefaultValueIfSetIndex
+         * in this method, as well as checking that \p i is a valid index.
+         * Derived classes must implement formatSingleValue() to provide the
+         * actual formatting for a value of type \p T.
+         */
+        virtual std::string formatValue(int i) const;
 
     protected:
         /*! \brief
@@ -138,7 +145,7 @@ class OptionStorageTemplate : public AbstractOptionStorage
         }
         /*! \copydoc AbstractOptionStorage::processSet()
          *
-         * OptionStorage template implements transaction support for a set of
+         * OptionStorageTemplate implements transaction support for a set of
          * values in this method (see the class description), and provides a
          * more detailed processSetValues() method that can be overridden in
          * subclasses to process the actual values.  Derived classes should
@@ -153,6 +160,16 @@ class OptionStorageTemplate : public AbstractOptionStorage
         virtual void processAll()
         {
         }
+        /*! \brief
+         * Formats a single value as a string.
+         *
+         * \param[in] value  Value to format.
+         * \returns   \p value formatted as a string.
+         *
+         * The derived class must provide this method to format values a
+         * strings.  Called by formatValue() to do the actual formatting.
+         */
+        virtual std::string formatSingleValue(const T &value) const = 0;
 
         /*! \brief
          * Removes all values from the storage.
@@ -314,6 +331,23 @@ OptionStorageTemplate<T>::~OptionStorageTemplate()
 }
 
 
+template <typename T>
+std::string OptionStorageTemplate<T>::formatValue(int i) const
+{
+    GMX_RELEASE_ASSERT(i == DefaultValueIfSetIndex || (i >= 0 && i < valueCount()),
+                       "Invalid value index");
+    if (i == DefaultValueIfSetIndex)
+    {
+        if (_defaultValueIfSet.get() != NULL)
+        {
+            return formatSingleValue(*_defaultValueIfSet);
+        }
+        return std::string();
+    }
+    return formatSingleValue(values()[i]);
+}
+
+
 template <typename T>
 void OptionStorageTemplate<T>::clearSet()
 {
index 3e6499889ded788225e161cf053d536c1f6a8031..ba53fcb9f2af098cd6c9e3f278be3b3f22065971 100644 (file)
@@ -106,7 +106,10 @@ class MockOptionStorage : public gmx::OptionStorageTemplate<std::string>
             GMX_THROW(gmx::test::TestException("Not implemented"));
         }
         virtual const char *typeString() const { return "mock"; }
-        virtual std::string formatValue(int /*i*/) const { return ""; }
+        virtual std::string formatSingleValue(const std::string &/*value*/) const
+        {
+            return "";
+        }
 
         MOCK_METHOD1(convertValue, void(const std::string &value));
         MOCK_METHOD1(processSetValues, void(ValueList *values));
index 0bf0eb4c452c96e3002aa28db4b3d31791292fc7..a93c364b2283a94b8a6c45da5ba9bf31df0fce15 100644 (file)
@@ -74,9 +74,9 @@ SelectionOptionStorage::SelectionOptionStorage(const SelectionOption &settings)
 }
 
 
-std::string SelectionOptionStorage::formatValue(int i) const
+std::string SelectionOptionStorage::formatSingleValue(const Selection &value) const
 {
-    return values()[i].selectionText();
+    return value.selectionText();
 }
 
 
index f0d13e756157b9ce549abb472b3cfd24d4045dcc..368461dd68953dbf9a61903dabf991ece25636c7 100644 (file)
@@ -66,7 +66,7 @@ class SelectionOptionStorage : public OptionStorageTemplate<Selection>
 
         virtual OptionInfo &optionInfo() { return _info; }
         virtual const char *typeString() const { return "sel"; }
-        virtual std::string formatValue(int i) const;
+        virtual std::string formatSingleValue(const Selection &value) const;
 
         //! \copydoc SelectionOptionInfo::setSelectionCollection()
         void setSelectionCollection(SelectionCollection *selections)