#define GMX_OPTIONS_FILENAMEOPTION_H
#include <string>
+#include <vector>
-#include "abstractoption.h"
-#include "optionfiletype.h"
+#include "gromacs/options/abstractoption.h"
+#include "gromacs/options/optionfiletype.h"
namespace gmx
{
template <typename T> class ConstArrayRef;
class FileNameOptionInfo;
+class FileNameOptionManager;
class FileNameOptionStorage;
/*! \brief
//! Initializes an option with the given name.
explicit FileNameOption(const char *name)
- : MyBase(name), filetype_(eftUnknown), legacyType_(-1),
- defaultBasename_(NULL),
+ : MyBase(name), optionType_(eftUnknown), legacyType_(-1),
+ defaultBasename_(NULL), defaultType_(-1),
+ bLegacyOptionalBehavior_(false),
bRead_(false), bWrite_(false), bLibrary_(false)
{
}
* Either this attribute or legacyType() must be provided.
*/
MyClass &filetype(OptionFileType type)
- { filetype_ = type; return me(); }
+ { optionType_ = type; return me(); }
/*! \brief
* Sets the type of the file from an enum in filenm.h.
*
*/
MyClass &legacyType(int type)
{ legacyType_ = type; return me(); }
+ /*! \brief
+ * Changes the behavior of optional options to match old t_filenm.
+ *
+ * If this is not set, optional options return an empty string if not
+ * set. If this is set, a non-empty value is always returned.
+ * In the latter case, whether the option is set only affects the
+ * return value of OptionInfo::isSet() and Options::isSet().
+ */
+ MyClass &legacyOptionalBehavior()
+ { bLegacyOptionalBehavior_ = true; return me(); }
//! Tells that the file provided by this option is used for input only.
MyClass &inputFile()
{ bRead_ = true; bWrite_ = false; return me(); }
*
* Use this method instead of defaultValue() or defaultValueIfSet() to
* set a default value for a file name option. No extension needs to
- * be provided; it is automatically added based on filetype().
+ * be provided; it is automatically added based on filetype() or
+ * defaultType().
* The behavior is also adjusted based on required(): if the option is
* required, the value given to defaultBasename() is treated as for
* both defaultValue() and defaultValueIfSet(), otherwise it is treated
* as for defaultValueIfSet().
+ *
+ * For input files that accept multiple extensions, the extension is
+ * completed to the default extension on creation of the option or at
+ * time of parsing an option without a value.
+ *
+ * If FileNameOptionManager is used, the extension may change during
+ * Options::finish(), as this is the time when the default names are
+ * checked against the file system to provide an extension that matches
+ * an existing file if that is possible.
+ *
+ * If FileNameOptionManager is used, and
+ * FileNameOptionManager::addDefaultFileNameOption() is used, and the
+ * user provides a global default file name using that option, then the
+ * global default takes precedence over defaultBasename().
*/
MyClass &defaultBasename(const char *basename)
{ defaultBasename_ = basename; return me(); }
+ /*! \brief
+ * Sets a default type/extension for the file option.
+ *
+ * For options that accept multiple types of files (e.g.,
+ * eftTrajectory), this method sets the default extension used
+ * for completing defaultBasename(), as well as the default extension
+ * used by FileNameOptionManager to complete various file names.
+ *
+ * The value should be one of the enumerated `ef*` values from
+ * filenm.h, and be a valid type for the type specified with
+ * filetype().
+ */
+ MyClass &defaultType(int filetype)
+ { defaultType_ = filetype; return me(); }
private:
// Use defaultBasename() instead.
using MyBase::defaultValueIfSet;
//! Creates a FileNameOptionStorage object.
- virtual AbstractOptionStoragePointer createStorage() const;
+ virtual AbstractOptionStorage *createStorage(
+ const OptionManagerContainer &managers) const;
- OptionFileType filetype_;
+ OptionFileType optionType_;
int legacyType_;
const char *defaultBasename_;
+ int defaultType_;
+ bool bLegacyOptionalBehavior_;
bool bRead_;
bool bWrite_;
bool bLibrary_;
{
public:
//! Shorthand for a list of extensions.
- typedef ConstArrayRef<const char *> ExtensionList;
+ typedef std::vector<const char *> ExtensionList;
//! Creates an option info object for the given option.
explicit FileNameOptionInfo(FileNameOptionStorage *option);
//! Whether the option specifies directories.
bool isDirectoryOption() const;
+ //! Whether the option specifies a generic trajectory file.
+ bool isTrajectoryOption() const;
+ //! Returns the default extension for this option.
+ const char *defaultExtension() const;
//! Returns the list of extensions this option accepts.
ExtensionList extensions() const;
+ //! Returns whether \p fileType (from filenm.h) is accepted for this option.
+ bool isValidType(int fileType) const;
+ //! Returns the list of file types this option accepts.
+ ConstArrayRef<int> fileTypes() const;
private:
const FileNameOptionStorage &option() const;