From 919ec9f8e182c490c4619ebb5d696e70f25be9f5 Mon Sep 17 00:00:00 2001
From: Markus Frank <Markus.Frank@cern.ch>
Date: Wed, 15 Mar 2017 18:05:57 +0100
Subject: [PATCH] Improve template instantiation for conditions types and
 grammars.

---
 DDCore/include/DD4hep/BasicGrammar_inl.h          |  8 ++++++++
 DDCore/include/DD4hep/Parsers.h                   | 13 ++++++++++---
 DDCore/include/DD4hep/objects/ConditionsInterna.h |  1 +
 DDCore/src/AlignmentData.cpp                      | 13 ++++++++-----
 DDCore/src/ConditionsData.cpp                     |  8 ++++----
 5 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/DDCore/include/DD4hep/BasicGrammar_inl.h b/DDCore/include/DD4hep/BasicGrammar_inl.h
index 9f629aecd..89e8bb6a1 100644
--- a/DDCore/include/DD4hep/BasicGrammar_inl.h
+++ b/DDCore/include/DD4hep/BasicGrammar_inl.h
@@ -331,6 +331,14 @@ namespace DD4hep {
   DD4HEP_DEFINE_PARSER_GRAMMAR_TYPE(x)          \
   DD4HEP_DEFINE_PARSER_GRAMMAR_EVAL(x,func)
 
+#define DD4HEP_DEFINE_PARSER_GRAMMAR_DUMMY(x,func)                      \
+  PARSERS_DECL_FOR_SINGLE(x)                                            \
+  DD4HEP_DEFINE_PARSER_GRAMMAR_TYPE(x)                                  \
+  DD4HEP_DEFINE_PARSER_GRAMMAR_EVAL(x,func)                             \
+  namespace DD4hep   {   namespace Parsers   {                          \
+      int parse(x&, const std::string&)     {  return 1;  }             \
+    }}
+
 #if defined(DD4HEP_HAVE_ALL_PARSERS)
 #define DD4HEP_DEFINE_PARSER_GRAMMAR_CONT(x,eval_func)                  \
   DD4HEP_DEFINE_PARSER_GRAMMAR(x,eval_func)                             \
diff --git a/DDCore/include/DD4hep/Parsers.h b/DDCore/include/DD4hep/Parsers.h
index a84592709..4ff7529ce 100644
--- a/DDCore/include/DD4hep/Parsers.h
+++ b/DDCore/include/DD4hep/Parsers.h
@@ -25,9 +25,16 @@
 #include <deque>
 
 // ============================================================================
-#define PARSERS_DECL_FOR_SINGLE(Type)                       \
-  namespace DD4hep { namespace Parsers {                    \
-      int parse(Type& result, const std::string& input); }}
+#define PARSERS_DECL_FOR_SINGLE(Type)                                   \
+  namespace DD4hep { namespace Parsers {                                \
+      int parse(Type& result, const std::string& input);                \
+    }}
+
+#define DD4HEP_DEFINE_PARSER_DUMMY(Type)                                \
+  PARSERS_DECL_FOR_SINGLE(Type)                                         \
+  namespace DD4hep   {   namespace Parsers   {                          \
+      int parse(Type&, const std::string&)     {  return 1;  }          \
+    }}
 
 #define PARSERS_DECL_FOR_PAIR(FirstType, SecondType)                    \
   namespace DD4hep { namespace Parsers {                                \
diff --git a/DDCore/include/DD4hep/objects/ConditionsInterna.h b/DDCore/include/DD4hep/objects/ConditionsInterna.h
index b700d55e7..52748fc5a 100644
--- a/DDCore/include/DD4hep/objects/ConditionsInterna.h
+++ b/DDCore/include/DD4hep/objects/ConditionsInterna.h
@@ -242,6 +242,7 @@ namespace DD4hep {
 } /* End namespace DD4hep                   */
 
 #define DD4HEP_DEFINE_CONDITIONS_TYPE(x)                               \
+  DD4HEP_DEFINE_OPAQUEDATA_TYPE(x)                                     \
   namespace DD4hep {                                                   \
     namespace Conditions  {                                            \
       template x& Condition::bind<x>(const std::string& val);          \
diff --git a/DDCore/src/AlignmentData.cpp b/DDCore/src/AlignmentData.cpp
index 793b7af6c..23b3f9c2c 100644
--- a/DDCore/src/AlignmentData.cpp
+++ b/DDCore/src/AlignmentData.cpp
@@ -202,13 +202,16 @@ Alignment AlignmentData::nominal() const   {
   return detector.nominal();
 }
 
+#include "DD4hep/Parsers.h"
 #include "DD4hep/ToStream.h"
-#include "DD4hep/objects/ConditionsInterna.h"
-DD4HEP_DEFINE_OPAQUEDATA_TYPE(Delta)
-DD4HEP_DEFINE_OPAQUEDATA_TYPE(AlignmentData)
-DD4HEP_DEFINE_CONDITIONS_TYPE_DUMMY(Delta)
-DD4HEP_DEFINE_CONDITIONS_TYPE_DUMMY(AlignmentData)
+DD4HEP_DEFINE_PARSER_DUMMY(Delta)
+DD4HEP_DEFINE_PARSER_DUMMY(AlignmentData)
 
 #include "DD4hep/BasicGrammar_inl.h"
+#include "DD4hep/objects/ConditionsInterna.h"
 DD4HEP_DEFINE_PARSER_GRAMMAR(Delta,eval_none<Delta>)
 DD4HEP_DEFINE_PARSER_GRAMMAR(AlignmentData,eval_none<AlignmentData>)
+
+DD4HEP_DEFINE_CONDITIONS_TYPE(Delta)
+DD4HEP_DEFINE_CONDITIONS_TYPE(AlignmentData)
+
diff --git a/DDCore/src/ConditionsData.cpp b/DDCore/src/ConditionsData.cpp
index b159d18f7..64e683a36 100644
--- a/DDCore/src/ConditionsData.cpp
+++ b/DDCore/src/ConditionsData.cpp
@@ -69,10 +69,10 @@ AbstractMap& AbstractMap::operator=(const AbstractMap& c)  {
   return *this;
 }
 
+#include "DD4hep/Parsers.h"
 #include "DD4hep/ToStream.h"
-#include "DD4hep/objects/ConditionsInterna.h"
-DD4HEP_DEFINE_CONDITIONS_TYPE_DUMMY(AbstractMap)
-
+DD4HEP_DEFINE_PARSER_DUMMY(AbstractMap)
 #include "DD4hep/BasicGrammar_inl.h"
+#include "DD4hep/objects/ConditionsInterna.h"
 DD4HEP_DEFINE_PARSER_GRAMMAR(AbstractMap,eval_none<AbstractMap>)
-
+DD4HEP_DEFINE_CONDITIONS_TYPE(AbstractMap)
-- 
GitLab