From 7bc8214fec0348d2dfdaa6c8bd80bf0c6ab4e87a Mon Sep 17 00:00:00 2001
From: ralfulrich <ralf.ulrich@kit.edu>
Date: Tue, 2 Apr 2019 11:33:18 +0200
Subject: [PATCH] some extra comments

---
 Setup/SetupStack.h | 37 +++++++++++++++++++++++++++++++++++--
 1 file changed, 35 insertions(+), 2 deletions(-)

diff --git a/Setup/SetupStack.h b/Setup/SetupStack.h
index dfcfa757d..2dde8fb4f 100644
--- a/Setup/SetupStack.h
+++ b/Setup/SetupStack.h
@@ -29,6 +29,12 @@
 
 // definition of stack-data object to store geometry information
 template <typename TEnvType>
+
+/**
+ * @class GeometryData
+ *
+ * definition of stack-data object to store geometry information
+ */
 class GeometryData {
 
 public:
@@ -57,8 +63,12 @@ private:
   std::vector<const BaseNodeType*> fNode;
 };
 
-// defintion of a stack-readout object, the iteractor dereference
-// operator will deliver access to these function
+/**
+ * @class GeometryDataInterface
+ *
+ * corresponding defintion of a stack-readout object, the iteractor
+ * dereference operator will deliver access to these function
+ */
 template <typename T, typename TEnvType>
 class GeometryDataInterface : public T {
 
@@ -120,6 +130,29 @@ namespace corsika::setup {
   // this is the REAL stack we use:
   using Stack = detail::StackWithGeometry;
 
+  /*
+    See Issue 161
+
+    unfortunately clang does not support this in the same way (yet) as
+    gcc, so we have to distinguish here. If clang cataches up, we
+    could remove the clang branch here and also in
+    corsika::Cascade. The gcc code is much more generic and
+    universal. If we could do the gcc version, we won't had to define
+    StackView globally, we could do it with MakeView whereever it is
+    actually needed. Keep an eye on this!
+  */
+#if defined(__clang__)
+  using StackView =
+      corsika::stack::SecondaryView<typename corsika::setup::Stack::StackImpl,
+                                    corsika::setup::detail::StackWithGeometryInterface>;
+#elif defined(__GNUC__) || defined(__GNUG__)
+  template <typename S, template <typename> typename _PIType = S::template PIType>
+  struct MakeView {
+    using type = corsika::stack::SecondaryView<typename S::StackImpl, _PIType>;
+  };
+  using StackView = MakeView<corsika::setup::Stack>::type;
+#endif
+
 } // namespace corsika::setup
 
 #endif
-- 
GitLab