diff --git a/Setup/SetupStack.h b/Setup/SetupStack.h index 9f42d76c92e960a0a71fcd01854aa2e37fb85de3..7cfe25c090d8fab829a62de17124e51e441bc852 100644 --- a/Setup/SetupStack.h +++ b/Setup/SetupStack.h @@ -25,7 +25,11 @@ #include <tuple> #include <vector> -// definition of stack-data object to store geometry information +/** + * @class GeometryData + * + * definition of stack-data object to store geometry information + */ class GeometryData { public: @@ -54,8 +58,12 @@ private: std::vector<const corsika::environment::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> class GeometryDataInterface : public T { @@ -116,6 +124,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