From a87cf29a087e9bb39941de9ee8a84dc5fd91ead9 Mon Sep 17 00:00:00 2001
From: Markus FRANK <Markus.Frank@cern.ch>
Date: Thu, 9 Apr 2020 17:20:29 +0200
Subject: [PATCH] Separate functionality of parsed grammars into free functions
 instead of templated class

---
 DDCore/include/DD4hep/AlignmentData.h         | 1 +
 DDCore/include/DD4hep/Grammar.h               | 3 +++
 DDCore/include/DD4hep/detail/Grammar_parsed.h | 8 +++++---
 3 files changed, 9 insertions(+), 3 deletions(-)

diff --git a/DDCore/include/DD4hep/AlignmentData.h b/DDCore/include/DD4hep/AlignmentData.h
index 1c5517547..deb0d1a47 100644
--- a/DDCore/include/DD4hep/AlignmentData.h
+++ b/DDCore/include/DD4hep/AlignmentData.h
@@ -196,5 +196,6 @@ namespace dd4hep {
     {  return detectorToLocal(Position(det[0],det[1],det[2]));                        }
   };
 }         /* End namespace dd4hep               */
+std::ostream& operator << (std::ostream& s, const dd4hep::Delta& data);
 std::ostream& operator << (std::ostream& s, const dd4hep::AlignmentData& data);
 #endif    /* DD4HEP_ALIGMENTS_ALIGNMENTDATA_H   */
diff --git a/DDCore/include/DD4hep/Grammar.h b/DDCore/include/DD4hep/Grammar.h
index 52025d25b..ad177954b 100644
--- a/DDCore/include/DD4hep/Grammar.h
+++ b/DDCore/include/DD4hep/Grammar.h
@@ -214,6 +214,8 @@ namespace dd4hep {
   class GrammarRegistry {
     /// Default constructor
     GrammarRegistry() = default;
+    /// PropertyGrammar overload: Serialize a property to a string
+    template <typename T> static std::string str(const BasicGrammar&, const void*)  { return ""; }
   public:
     /// Registry instance singleton
     static const GrammarRegistry& instance();
@@ -230,6 +232,7 @@ namespace dd4hep {
       BasicGrammar::specialization_t spec;
       spec.bind = detail::constructObject<T>;
       spec.copy = detail::copyObject<T>;
+      spec.str  = GrammarRegistry::str<T>;
       return pre_note_specs<T>(spec);
     }
     template <typename T> static const GrammarRegistry& pre_note()   {
diff --git a/DDCore/include/DD4hep/detail/Grammar_parsed.h b/DDCore/include/DD4hep/detail/Grammar_parsed.h
index d6cb82b12..0cc4c42bb 100644
--- a/DDCore/include/DD4hep/detail/Grammar_parsed.h
+++ b/DDCore/include/DD4hep/detail/Grammar_parsed.h
@@ -237,9 +237,11 @@ namespace dd4hep {
     static Grammar<TYPE> gr;
     if ( 0 == gr.specialization.bind       ) gr.specialization.bind       = detail::constructObject<TYPE>;
     if ( 0 == gr.specialization.copy       ) gr.specialization.copy       = detail::copyObject<TYPE>;
-    if ( 0 == gr.specialization.fromString ) gr.specialization.fromString = detail::grammar_fromString<TYPE>;
-    if ( 0 == gr.specialization.eval       ) gr.specialization.eval       = detail::grammar_eval<TYPE>;
-    if ( 0 == gr.specialization.str        ) gr.specialization.str        = detail::grammar_str<TYPE>;
+    if ( 0 == gr.specialization.fromString )  {
+      gr.specialization.fromString = detail::grammar_fromString<TYPE>;
+      gr.specialization.eval       = detail::grammar_eval<TYPE>;
+      gr.specialization.str        = detail::grammar_str<TYPE>;
+    }
     s_gr = &gr;
     return *s_gr;
   }
-- 
GitLab