From cf0bc6a12a3a941d76af3e995c7755ba21660bf0 Mon Sep 17 00:00:00 2001
From: Gabriel Studer <gabriel.studer@unibas.ch>
Date: Thu, 21 Dec 2023 10:49:07 +0100
Subject: [PATCH] mmcif writer: resolve linking errors for certain usages of
 ChemClass

Assignment of ChemClass values happens inside the ChemClass definition
in the header file. Let's say you're using something like:
ChemClass::WATER. If this is resolved at compile time, you won't have
any problem. If not, the linker searches for it in the mol shared object
file. BUT ITS NOT THERE. The hope is that defining the types as an
enum inside the ChemClass definition helps.
---
 modules/mol/base/src/chem_class.hh | 74 +++++++++++++-----------------
 1 file changed, 33 insertions(+), 41 deletions(-)

diff --git a/modules/mol/base/src/chem_class.hh b/modules/mol/base/src/chem_class.hh
index 14581ac5b..2146b300d 100644
--- a/modules/mol/base/src/chem_class.hh
+++ b/modules/mol/base/src/chem_class.hh
@@ -26,68 +26,60 @@ namespace ost { namespace mol {
 
 struct DLLEXPORT ChemClass {
 
-  static constexpr char PEPTIDE_LINKING   ='P';
-  static constexpr char D_PEPTIDE_LINKING ='D';
-  static constexpr char L_PEPTIDE_LINKING ='L';
-  static constexpr char RNA_LINKING       ='R';
-  static constexpr char DNA_LINKING       ='S';
-  static constexpr char NON_POLYMER       ='N';
-  static constexpr char L_SACCHARIDE      ='X';
-  static constexpr char D_SACCHARIDE      ='Y';
-  static constexpr char SACCHARIDE        ='Z';
-  static constexpr char WATER             ='W';
-  static constexpr char UNKNOWN           ='U';
+  typedef enum {
+    PEPTIDE_LINKING   ='P',
+    D_PEPTIDE_LINKING ='D',
+    L_PEPTIDE_LINKING ='L',
+    RNA_LINKING       ='R',
+    DNA_LINKING       ='S',
+    NON_POLYMER       ='N',
+    L_SACCHARIDE      ='X',
+    D_SACCHARIDE      ='Y',
+    SACCHARIDE        ='Z',
+    WATER             ='W',
+    UNKNOWN           ='U'
+  } Type;
   
-  // for backward compatibility to 1.1 and earlier
-  static constexpr char PeptideLinking   =PEPTIDE_LINKING;
-  static constexpr char DPeptideLinking  =D_PEPTIDE_LINKING;
-  static constexpr char LPeptideLinking  =L_PEPTIDE_LINKING;
-  static constexpr char RNALinking       =RNA_LINKING;  
-  static constexpr char DNALinking       =DNA_LINKING;    
-  static constexpr char NonPolymer       =NON_POLYMER;
-  static constexpr char LSaccharide      =L_SACCHARIDE;
-  static constexpr char DSaccharide      =D_SACCHARIDE;    
-  static constexpr char Saccharide       =SACCHARIDE;
-  static constexpr char Water            =WATER;
-  static constexpr char Unknown          =UNKNOWN;
-  explicit ChemClass(char chem_class)
-    : chem_class_(chem_class) {
-  }
+  explicit ChemClass(Type chem_class): chem_class_(chem_class) { }
+
+  explicit ChemClass(char type): chem_class_(Type(type)) { }
+
+  ChemClass(): chem_class_(UNKNOWN) { }
 
-  ChemClass()
-    : chem_class_(UNKNOWN) {
-  }
   bool operator==(const ChemClass& cc) const {
-    return cc.chem_class_==chem_class_;
+    return cc.chem_class_ == chem_class_;
   }
 
   bool operator!=(const ChemClass& cc) const {
-    return !this->operator==(cc);
+    return !this->operator == (cc);
   }
 
   bool IsPeptideLinking() const {
-    return (chem_class_==ChemClass::PEPTIDE_LINKING ||
-            chem_class_==ChemClass::D_PEPTIDE_LINKING ||
-            chem_class_==ChemClass::L_PEPTIDE_LINKING);
+    return (chem_class_ == PEPTIDE_LINKING ||
+            chem_class_ == D_PEPTIDE_LINKING ||
+            chem_class_ == L_PEPTIDE_LINKING);
   }
   bool IsNucleotideLinking() const {
-    return (chem_class_==ChemClass::DNA_LINKING || 
-            chem_class_==ChemClass::RNA_LINKING);
+    return (chem_class_ == DNA_LINKING || 
+            chem_class_ == RNA_LINKING);
   }
   
-  bool IsWater() const { return chem_class_==ChemClass::WATER; }
+  bool IsWater() const {
+    return chem_class_ == WATER;
+  }
+
   operator char() const {
     return chem_class_;
   }
 
   bool IsSaccharide() const {
-    return (chem_class_==ChemClass::SACCHARIDE ||
-            chem_class_==ChemClass::L_SACCHARIDE ||
-            chem_class_==ChemClass::D_SACCHARIDE);
+    return (chem_class_ == SACCHARIDE ||
+            chem_class_ == L_SACCHARIDE ||
+            chem_class_ == D_SACCHARIDE);
   }
 
 private:
-  char chem_class_;
+  Type chem_class_;
 };
 
 }} // ns
-- 
GitLab