Replace EnumOption with EnumerationArrayOption
[alexxy/gromacs.git] / src / gromacs / gmxpreprocess / pdb2gmx.cpp
index 8f1a716f58fa4206c27ef7f7a82d594af0e56b41..171db584ce42c131032848b49bad725999ddf1f7 100644 (file)
@@ -1125,25 +1125,27 @@ static void find_nc_ter(t_atoms* pdba, int r0, int r1, int* r_start, int* r_end,
     }
 }
 
-/* enum for chain separation */
-enum ChainSepType
+enum class ChainSeparationType : int
 {
-    enChainSep_id_or_ter,
-    enChainSep_id_and_ter,
-    enChainSep_ter,
-    enChainSep_id,
-    enChainSep_interactive
+    IdOrTer,
+    IdAndTer,
+    Ter,
+    Id,
+    Interactive,
+    Count
 };
-static const char* ChainSepEnum[]       = { "id_or_ter", "id_and_ter", "ter", "id", "interactive" };
-static const char* ChainSepInfoString[] = {
-    "Splitting chemical chains based on TER records or chain id changing.\n",
-    "Splitting chemical chains based on TER records and chain id changing.\n",
-    "Splitting chemical chains based on TER records only (ignoring chain id).\n",
-    "Splitting chemical chains based on changing chain id only (ignoring TER records).\n",
-    "Splitting chemical chains interactively.\n"
+static const gmx::EnumerationArray<ChainSeparationType, const char*> c_chainSeparationTypeNames = {
+    { "id_or_ter", "id_and_ter", "ter", "id", "interactive" }
+};
+static const gmx::EnumerationArray<ChainSeparationType, const char*> c_chainSeparationTypeNotificationMessages = {
+    { "Splitting chemical chains based on TER records or chain id changing.\n",
+      "Splitting chemical chains based on TER records and chain id changing.\n",
+      "Splitting chemical chains based on TER records only (ignoring chain id).\n",
+      "Splitting chemical chains based on changing chain id only (ignoring TER records).\n",
+      "Splitting chemical chains interactively.\n" }
 };
 
-static void modify_chain_numbers(t_atoms* pdba, ChainSepType enumChainSep, const gmx::MDLogger& logger)
+static void modify_chain_numbers(t_atoms* pdba, ChainSeparationType chainSeparation, const gmx::MDLogger& logger)
 {
     int         i;
     char        old_prev_chainid;
@@ -1165,7 +1167,7 @@ static void modify_chain_numbers(t_atoms* pdba, ChainSepType enumChainSep, const
     char        this_chainid;
 
     /* The default chain enumeration is based on TER records only */
-    printf("%s", ChainSepInfoString[enumChainSep]);
+    printf("%s", c_chainSeparationTypeNotificationMessages[chainSeparation]);
 
     old_prev_chainid  = '?';
     old_prev_chainnum = -1;
@@ -1195,36 +1197,36 @@ static void modify_chain_numbers(t_atoms* pdba, ChainSepType enumChainSep, const
         this_resnum   = ri->nr;
         this_chainid  = ri->chainid;
 
-        switch (enumChainSep)
+        switch (chainSeparation)
         {
-            case enChainSep_id_or_ter:
+            case ChainSeparationType::IdOrTer:
                 if (old_this_chainid != old_prev_chainid || old_this_chainnum != old_prev_chainnum)
                 {
                     new_chainnum++;
                 }
                 break;
 
-            case enChainSep_id_and_ter:
+            case ChainSeparationType::IdAndTer:
                 if (old_this_chainid != old_prev_chainid && old_this_chainnum != old_prev_chainnum)
                 {
                     new_chainnum++;
                 }
                 break;
 
-            case enChainSep_id:
+            case ChainSeparationType::Id:
                 if (old_this_chainid != old_prev_chainid)
                 {
                     new_chainnum++;
                 }
                 break;
 
-            case enChainSep_ter:
+            case ChainSeparationType::Ter:
                 if (old_this_chainnum != old_prev_chainnum)
                 {
                     new_chainnum++;
                 }
                 break;
-            case enChainSep_interactive:
+            case ChainSeparationType::Interactive:
                 if (old_this_chainid != old_prev_chainid || old_this_chainnum != old_prev_chainnum)
                 {
                     if (i > 0)
@@ -1250,7 +1252,8 @@ static void modify_chain_numbers(t_atoms* pdba, ChainSepType enumChainSep, const
                     }
                 }
                 break;
-            default: gmx_fatal(FARGS, "Internal inconsistency - this shouldn't happen...");
+            case ChainSeparationType::Count:
+                gmx_fatal(FARGS, "Internal inconsistency - this shouldn't happen...");
         }
         old_prev_chainid  = old_this_chainid;
         old_prev_chainnum = old_this_chainnum;
@@ -1285,39 +1288,42 @@ struct t_chain
     std::vector<gmx::RVec>              x;
 };
 
-// TODO make all enums into scoped enums
-/* enum for vsites */
-enum VSitesType
+enum class VSitesType : int
 {
-    enVSites_none,
-    enVSites_hydrogens,
-    enVSites_aromatics
+    None,
+    Hydrogens,
+    Aromatics,
+    Count
+};
+static const gmx::EnumerationArray<VSitesType, const char*> c_vsitesTypeNames = {
+    { "none", "hydrogens", "aromatics" }
 };
-static const char* VSitesEnum[] = { "none", "hydrogens", "aromatics" };
 
-/* enum for water model */
-enum WaterType
+enum class WaterType : int
 {
-    enWater_select,
-    enWater_none,
-    enWater_spc,
-    enWater_spce,
-    enWater_tip3p,
-    enWater_tip4p,
-    enWater_tip5p,
-    enWater_tips3p
+    Select,
+    None,
+    Spc,
+    SpcE,
+    Tip3p,
+    Tip4p,
+    Tip5p,
+    Tips3p,
+    Count
+};
+static const gmx::EnumerationArray<WaterType, const char*> c_waterTypeNames = {
+    { "select", "none", "spc", "spce", "tip3p", "tip4p", "tip5p", "tips3p" }
 };
-static const char* WaterEnum[] = { "select", "none",  "spc",   "spce",
-                                   "tip3p",  "tip4p", "tip5p", "tips3p" };
 
-/* enum for merge */
-enum MergeType
+enum class MergeType : int
 {
-    enMerge_no,
-    enMerge_all,
-    enMerge_interactive
+    No,
+    All,
+    Interactive,
+    Count
 };
-static const char* MergeEnum[] = { "no", "all", "interactive" };
+static const gmx::EnumerationArray<MergeType, const char*> c_mergeTypeNames = { { "no", "all",
+                                                                                  "interactive" } };
 
 namespace gmx
 {
@@ -1332,10 +1338,10 @@ public:
         bVsites_(FALSE),
         bPrevWat_(FALSE),
         bVsiteAromatics_(FALSE),
-        enumChainSep_(enChainSep_id_or_ter),
-        enumVSites_(enVSites_none),
-        enumWater_(enWater_select),
-        enumMerge_(enMerge_no),
+        chainSeparation_(ChainSeparationType::IdOrTer),
+        vsitesType_(VSitesType::None),
+        waterType_(WaterType::Select),
+        mergeType_(MergeType::No),
         itp_file_(nullptr),
         mHmult_(0)
     {
@@ -1394,10 +1400,10 @@ private:
     std::string outFile_;
     std::string ff_;
 
-    ChainSepType enumChainSep_;
-    VSitesType   enumVSites_;
-    WaterType    enumWater_;
-    MergeType    enumMerge_;
+    ChainSeparationType chainSeparation_;
+    VSitesType          vsitesType_;
+    WaterType           waterType_;
+    MergeType           mergeType_;
 
     FILE*                          itp_file_;
     char                           forcefield_[STRLEN];
@@ -1532,16 +1538,19 @@ void pdb2gmx::initOptions(IOptionsContainer* options, ICommandLineOptionsModuleS
             RealOption("lb").store(&long_bond_dist_).defaultValue(0.25).hidden().description("Long bond warning distance"));
     options->addOption(
             RealOption("sb").store(&short_bond_dist_).defaultValue(0.05).hidden().description("Short bond warning distance"));
-    options->addOption(
-            EnumOption<ChainSepType>("chainsep").enumValue(ChainSepEnum).store(&enumChainSep_).description("Condition in PDB files when a new chain should be started (adding termini)"));
+    options->addOption(EnumOption<ChainSeparationType>("chainsep")
+                               .enumValue(c_chainSeparationTypeNames)
+                               .store(&chainSeparation_)
+                               .description("Condition in PDB files when a new chain should be "
+                                            "started (adding termini)"));
     options->addOption(EnumOption<MergeType>("merge")
-                               .enumValue(MergeEnum)
-                               .store(&enumMerge_)
+                               .enumValue(c_mergeTypeNames)
+                               .store(&mergeType_)
                                .description("Merge multiple chains into a single [moleculetype]"));
     options->addOption(StringOption("ff").store(&ff_).defaultValue("select").description(
             "Force field, interactive by default. Use [TT]-h[tt] for information."));
     options->addOption(
-            EnumOption<WaterType>("water").store(&enumWater_).enumValue(WaterEnum).description("Water model to use"));
+            EnumOption<WaterType>("water").store(&waterType_).enumValue(c_waterTypeNames).description("Water model to use"));
     options->addOption(BooleanOption("inter").store(&bInter_).defaultValue(false).description(
             "Set the next 8 options to interactive"));
     options->addOption(BooleanOption("ss").store(&bCysMan_).defaultValue(false).description(
@@ -1582,8 +1591,10 @@ void pdb2gmx::initOptions(IOptionsContainer* options, ICommandLineOptionsModuleS
             BooleanOption("v").store(&bVerbose_).defaultValue(false).description("Be slightly more verbose in messages"));
     options->addOption(
             RealOption("posrefc").store(&posre_fc_).defaultValue(1000).description("Force constant for position restraints"));
-    options->addOption(
-            EnumOption<VSitesType>("vsite").store(&enumVSites_).enumValue(VSitesEnum).description("Convert atoms to virtual sites"));
+    options->addOption(EnumOption<VSitesType>("vsite")
+                               .store(&vsitesType_)
+                               .enumValue(c_vsitesTypeNames)
+                               .description("Convert atoms to virtual sites"));
     options->addOption(BooleanOption("heavyh").store(&bHeavyH_).defaultValue(false).description(
             "Make hydrogen atoms heavy"));
     options->addOption(
@@ -1726,24 +1737,24 @@ int pdb2gmx::run()
             .asParagraph()
             .appendTextFormatted("Using the %s force field in directory %s", ffname_, ffdir_);
 
-    choose_watermodel(WaterEnum[enumWater_], ffdir_, &watermodel_, logger);
+    choose_watermodel(c_waterTypeNames[waterType_], ffdir_, &watermodel_, logger);
 
-    switch (enumVSites_)
+    switch (vsitesType_)
     {
-        case enVSites_none:
+        case VSitesType::None:
             bVsites_         = false;
             bVsiteAromatics_ = false;
             break;
-        case enVSites_hydrogens:
+        case VSitesType::Hydrogens:
             bVsites_         = true;
             bVsiteAromatics_ = false;
             break;
-        case enVSites_aromatics:
+        case VSitesType::Aromatics:
             bVsites_         = true;
             bVsiteAromatics_ = true;
             break;
-        default:
-            gmx_fatal(FARGS, "Internal inconsistency: VSitesEnum='%s'", VSitesEnum[enumVSites_]);
+        case VSitesType::Count:
+            gmx_fatal(FARGS, "Internal inconsistency: VSitesType='%s'", c_vsitesTypeNames[vsitesType_]);
     } /* end switch */
 
     /* Open the symbol table */
@@ -1812,7 +1823,7 @@ int pdb2gmx::run()
     GMX_LOG(logger.info).asParagraph().appendTextFormatted("Analyzing pdb file");
     int nwaterchain = 0;
 
-    modify_chain_numbers(&pdba_all, enumChainSep_, logger);
+    modify_chain_numbers(&pdba_all, chainSeparation_, logger);
 
     int nchainmerges = 0;
 
@@ -1866,7 +1877,7 @@ int pdb2gmx::run()
             bMerged         = false;
             if (i > 0 && !bWat_)
             {
-                if (!strncmp(MergeEnum[enumMerge_], "int", 3))
+                if (!strncmp(c_mergeTypeNames[mergeType_], "int", 3))
                 {
                     GMX_LOG(logger.info)
                             .asParagraph()
@@ -1885,7 +1896,7 @@ int pdb2gmx::run()
                     }
                     bMerged = (select[0] == 'y');
                 }
-                else if (!strncmp(MergeEnum[enumMerge_], "all", 3))
+                else if (!strncmp(c_mergeTypeNames[mergeType_], "all", 3))
                 {
                     bMerged = true;
                 }