diff --git a/DDCore/include/DD4hep/detail/Handle.inl b/DDCore/include/DD4hep/detail/Handle.inl index 56d1e2f34eff6c9422d1f64286917b7c9e8b6818..44b1eb03f477f18a46a9d6fc1931c1cd35186eec 100644 --- a/DDCore/include/DD4hep/detail/Handle.inl +++ b/DDCore/include/DD4hep/detail/Handle.inl @@ -99,21 +99,32 @@ namespace dd4hep { #endif -// Predefined cast map for shapes -#define DD4HEP_IMPLEMENT_SAFE_SHAPE_CAST(FROM) \ - DD4HEP_IMPLEMENT_SAFE_CAST(FROM,TGeoShape) \ - DD4HEP_IMPLEMENT_SAFE_CAST(FROM,TGeoBBox) - -#define DD4HEP_INSTANTIATE_HANDLE(X) \ - DD4HEP_IMPLEMENT_SAFE_NAMED_CAST(X) \ - template class dd4hep::Handle<X> - -#define DD4HEP_INSTANTIATE_SHAPE_HANDLE(X) \ - DD4HEP_IMPLEMENT_SAFE_SHAPE_CAST(X) \ - DD4HEP_INSTANTIATE_HANDLE(X) - -#define DD4HEP_INSTANTIATE_HANDLE_NAMED(X) \ - DD4HEP_IMPLEMENT_SAFE_NAMED_CAST(X) \ +// Utility for counting the number of args in the __VA_ARGS__ pack: +#define DD4HEP_HANDLE_PP_NARGS(...) DD4HEP_HANDLE_PP_NARGS2(__VA_ARGS__, DD4HEP_HANDLE_PP_NARGS_COUNT()) +#define DD4HEP_HANDLE_PP_NARGS2(...) DD4HEP_HANDLE_PP_NARGS_IMPL(__VA_ARGS__) +#define DD4HEP_HANDLE_PP_NARGS_IMPL(x1, x2, x3, x4, x5, x6, x7, x8, x9, N, ...) N +#define DD4HEP_HANDLE_PP_NARGS_COUNT() 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, ERROR + +// Macros to delegate to concrete, defined-arity implementations: +#define DD4HEP_HANDLE_XF(count, ...) DD4HEP_HANDLE_XF_IMPL (count, __VA_ARGS__) +#define DD4HEP_HANDLE_XF_IMPL(count, ...) DD4HEP_HANDLE_XF_ ## count (__VA_ARGS__) + +#define DD4HEP_HANDLE_XF_1(CODE,x1) DD4HEP_TEMPLATE_HANDLE(CODE,x1) +#define DD4HEP_HANDLE_XF_2(CODE,x1,x2) DD4HEP_IMPLEMENT_SAFE_CAST(x1,x2) DD4HEP_HANDLE_XF_1(CODE,x1) +#define DD4HEP_HANDLE_XF_3(CODE,x1,x2,x3) DD4HEP_IMPLEMENT_SAFE_CAST(x1,x3) DD4HEP_HANDLE_XF_2(CODE,x1,x2) +#define DD4HEP_HANDLE_XF_4(CODE,x1,x2,x3,x4) DD4HEP_IMPLEMENT_SAFE_CAST(x1,x4) DD4HEP_HANDLE_XF_3(CODE,x1,x2,x3) +#define DD4HEP_HANDLE_XF_5(CODE,x1,x2,x3,x4,x5) DD4HEP_IMPLEMENT_SAFE_CAST(x1,x5) DD4HEP_HANDLE_XF_4(CODE,x1,x2,x3,x4) +#define DD4HEP_HANDLE_XF_6(CODE,x1,x2,x3,x4,x5,x6) DD4HEP_IMPLEMENT_SAFE_CAST(x1,x6) DD4HEP_HANDLE_XF_5(CODE,x1,x2,x3,x4,x5) +#define DD4HEP_HANDLE_XF_7(CODE,x1,x2,x3,x4,x5,x6,x7) DD4HEP_IMPLEMENT_SAFE_CAST(x1,x7) DD4HEP_HANDLE_XF_6(CODE,x1,x2,x3,x4,x5,x6) +#define DD4HEP_HANDLE_XF_8(CODE,x1,x2,x3,x4,x5,x6,x7,x8) DD4HEP_IMPLEMENT_SAFE_CAST(x1,x8) DD4HEP_HANDLE_XF_7(CODE,x1,x2,x3,x4,x5,x6,x7) +#define DD4HEP_HANDLE_XF_9(CODE,x1,x2,x3,x4,x5,x6,x7,x8,x9) DD4HEP_IMPLEMENT_SAFE_CAST(x1,x9) DD4HEP_HANDLE_XF_8(CODE,x1,x2,x3,x4,x5,x6,x7,x8) +#define DD4HEP_HANDLE_XF_10(CODE,x1,x2,x3,x4,x5,x6,x7,x8,x9,x10) DD4HEP_IMPLEMENT_SAFE_CAST(x1,x10) DD4HEP_HANDLE_XF_9(CODE,x1,x2,x3,x4,x5,x6,x7,x8,x9) + + +#define DD4HEP_TEMPLATE_HANDLE(CODE,X) DD4HEP_TEMPLATE_HANDLE_CODE_##CODE(X) template class dd4hep::Handle<X> +#define DD4HEP_TEMPLATE_HANDLE_CODE_NONE(X) +#define DD4HEP_TEMPLATE_HANDLE_CODE_CAST_ONLY(X) DD4HEP_IMPLEMENT_SAFE_NAMED_CAST(X) +#define DD4HEP_TEMPLATE_HANDLE_CODE_NAMED(X) \ namespace dd4hep { \ template <> const char* Handle<X>::name() const \ { return this->m_element ? this->m_element->name.c_str() : ""; } \ @@ -122,32 +133,40 @@ namespace dd4hep { this->m_element = p; \ p->name = n; \ p->type = t; \ - }} \ - template class dd4hep::Handle<X> + }} \ + DD4HEP_IMPLEMENT_SAFE_NAMED_CAST(X) -#define DD4HEP_INSTANTIATE_HANDLE_RAW(X) \ +#define DD4HEP_TEMPLATE_HANDLE_CODE_UNNAMED(X) \ namespace dd4hep { \ template <> void \ Handle<X>::assign(X* n, const std::string&, const std::string&) \ { this->m_element = n;} \ template <> const char* Handle<X>::name() const { return ""; } \ } \ - template class dd4hep::Handle<X> - -#define DD4HEP_INSTANTIATE_HANDLE_UNNAMED(X) \ + DD4HEP_IMPLEMENT_SAFE_NAMED_CAST(X) + +#define DD4HEP_TEMPLATE_HANDLE_CODE_RAW(X) \ namespace dd4hep { \ template <> void \ Handle<X>::assign(X* n, const std::string&, const std::string&) \ { this->m_element = n;} \ template <> const char* Handle<X>::name() const { return ""; } \ } \ - DD4HEP_INSTANTIATE_HANDLE(X) + DD4HEP_SAFE_CAST_IMPLEMENTATION(X,X) + +// Delegation macro; this is the only macro you need to call from elsewhere: +#define DD4HEP_INSTANTIATE_HANDLE_CODE(CODE,...) DD4HEP_HANDLE_XF(DD4HEP_HANDLE_PP_NARGS(__VA_ARGS__),CODE,__VA_ARGS__) +#define DD4HEP_INSTANTIATE_HANDLE(...) DD4HEP_INSTANTIATE_HANDLE_CODE(CAST_ONLY,__VA_ARGS__) +#define DD4HEP_INSTANTIATE_SHAPE_HANDLE(...) DD4HEP_INSTANTIATE_HANDLE_CODE(CAST_ONLY,__VA_ARGS__,TGeoShape,TGeoBBox) +#define DD4HEP_INSTANTIATE_HANDLE_RAW(...) DD4HEP_INSTANTIATE_HANDLE_CODE(RAW,__VA_ARGS__) +#define DD4HEP_INSTANTIATE_HANDLE_NAMED(...) DD4HEP_INSTANTIATE_HANDLE_CODE(NAMED,__VA_ARGS__) +#define DD4HEP_INSTANTIATE_HANDLE_UNNAMED(...) DD4HEP_INSTANTIATE_HANDLE_CODE(UNNAMED,__VA_ARGS__) #define DD4HEP_CONCAT_MACROS(name, serial) name##_##serial -#define DD4HEP_SEGMENTATION_HANDLE_IMPLEMENTATION(X,serial) \ - namespace { \ - typedef dd4hep::SegmentationWrapper<X> DD4HEP_CONCAT_MACROS(Wrapper,serial); } \ - DD4HEP_IMPLEMENT_SAFE_CAST(DD4HEP_CONCAT_MACROS(Wrapper,serial),dd4hep::SegmentationObject) \ - DD4HEP_INSTANTIATE_HANDLE_UNNAMED(DD4HEP_CONCAT_MACROS(Wrapper,serial)) +#define DD4HEP_SEGMENTATION_HANDLE_IMPLEMENTATION(serial,name,...) \ + namespace { \ + typedef dd4hep::SegmentationWrapper<name> DD4HEP_CONCAT_MACROS(Wrapper,serial); } \ + DD4HEP_INSTANTIATE_HANDLE_CODE(UNNAMED,DD4HEP_CONCAT_MACROS(Wrapper,serial),__VA_ARGS__) -#define DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(X) DD4HEP_SEGMENTATION_HANDLE_IMPLEMENTATION(X,__LINE__) +#define DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(...) \ + DD4HEP_SEGMENTATION_HANDLE_IMPLEMENTATION(__LINE__,__VA_ARGS__,dd4hep::SegmentationObject) diff --git a/DDCore/src/AlignmentsInterna.cpp b/DDCore/src/AlignmentsInterna.cpp index afcc54bc259e44a7742a8841bcf682fd717d8ec6..00576ef4fc0cd9a0cdc8764b3379f82ad9d0a321 100644 --- a/DDCore/src/AlignmentsInterna.cpp +++ b/DDCore/src/AlignmentsInterna.cpp @@ -24,9 +24,8 @@ using namespace std; using namespace dd4hep; using namespace dd4hep::detail; -DD4HEP_INSTANTIATE_HANDLE_NAMED(AlignmentObject); +DD4HEP_INSTANTIATE_HANDLE_NAMED(AlignmentObject,ConditionObject); DD4HEP_INSTANTIATE_HANDLE_UNNAMED(AlignmentData); -DD4HEP_IMPLEMENT_SAFE_CAST(AlignmentObject,ConditionObject) /// Default constructor AlignmentObject::AlignmentObject() diff --git a/DDCore/src/DetectorInterna.cpp b/DDCore/src/DetectorInterna.cpp index 3472d154463765eab5828f0226edd2d46d2a1126..feb556357115478ea46e734ea7145813052750bf 100644 --- a/DDCore/src/DetectorInterna.cpp +++ b/DDCore/src/DetectorInterna.cpp @@ -29,11 +29,9 @@ using namespace dd4hep::detail; typedef detail::tools::PlacementPath PlacementPath; typedef detail::tools::ElementPath ElementPath; -DD4HEP_INSTANTIATE_HANDLE_NAMED(WorldObject); DD4HEP_INSTANTIATE_HANDLE_NAMED(DetElementObject); DD4HEP_INSTANTIATE_HANDLE_NAMED(SensitiveDetectorObject); -DD4HEP_IMPLEMENT_SAFE_CAST(WorldObject,DetElementObject) - +DD4HEP_INSTANTIATE_HANDLE_NAMED(WorldObject,DetElementObject); /// Default constructor SensitiveDetectorObject::SensitiveDetectorObject() diff --git a/DDCore/src/Handle.cpp b/DDCore/src/Handle.cpp index 921f91d759ee01515f30c5fdcc888112c45a541a..99202cd8063630865c7097312986752f117298c1 100644 --- a/DDCore/src/Handle.cpp +++ b/DDCore/src/Handle.cpp @@ -255,7 +255,6 @@ namespace dd4hep { #include "DDSegmentation/Segmentation.h" typedef DDSegmentation::Segmentation _Segmentation; -//INSTANTIATE_UNNAMED(_Segmentation); namespace dd4hep { template <> void Handle<_Segmentation>::assign(_Segmentation* s, const std::string& n, const std::string&) { this->m_element = s; @@ -271,15 +270,12 @@ namespace dd4hep { #include "TMap.h" #include "TColor.h" -DD4HEP_INSTANTIATE_HANDLE_UNNAMED(Detector); -DD4HEP_INSTANTIATE_HANDLE_RAW(TObject); -DD4HEP_INSTANTIATE_HANDLE_RAW(TNamed); -DD4HEP_SAFE_CAST_IMPLEMENTATION(TObject,TObject) -DD4HEP_SAFE_CAST_IMPLEMENTATION(TNamed,TNamed) +template class dd4hep::Handle<NamedObject>; DD4HEP_SAFE_CAST_IMPLEMENTATION(NamedObject,NamedObject) -DD4HEP_IMPLEMENT_SAFE_CAST(TObject,TNamed) -DD4HEP_IMPLEMENT_SAFE_CAST(TObject,NamedObject) -DD4HEP_IMPLEMENT_SAFE_CAST(TNamed,NamedObject) + +DD4HEP_INSTANTIATE_HANDLE_UNNAMED(Detector); +DD4HEP_INSTANTIATE_HANDLE_CODE(RAW,TObject,NamedObject); +DD4HEP_INSTANTIATE_HANDLE_CODE(NONE,TNamed,TObject,NamedObject); #include "TGeoMedium.h" #include "TGeoMaterial.h" @@ -317,10 +313,9 @@ DD4HEP_INSTANTIATE_HANDLE(TGeoNodeOffset); #include "TGeoVolume.h" #include "TGeoCompositeShape.h" #include "TGeoShapeAssembly.h" -DD4HEP_INSTANTIATE_HANDLE(TGeoVolume); +DD4HEP_INSTANTIATE_HANDLE(TGeoVolume,TGeoAtt); DD4HEP_INSTANTIATE_HANDLE(TGeoShape); -DD4HEP_INSTANTIATE_HANDLE(TGeoBBox); -DD4HEP_IMPLEMENT_SAFE_CAST(TGeoShape,TGeoBBox) +DD4HEP_INSTANTIATE_HANDLE(TGeoBBox,TGeoShape); DD4HEP_INSTANTIATE_SHAPE_HANDLE(TGeoCone); DD4HEP_INSTANTIATE_SHAPE_HANDLE(TGeoArb8); diff --git a/DDCore/src/NamedObject.cpp b/DDCore/src/NamedObject.cpp index 92f8127bfa12fdc6070e3c1e0bd721b6670b3fe1..80d53634eb0a399dcccd8d5dd598fd6e3c8bd5e5 100644 --- a/DDCore/src/NamedObject.cpp +++ b/DDCore/src/NamedObject.cpp @@ -50,3 +50,4 @@ NamedObject::NamedObject(const std::string& nam, const std::string& typ) : name(nam), type(typ) { } + diff --git a/DDCore/src/Segmentations.cpp b/DDCore/src/Segmentations.cpp index bfd86ba0697edece8e00cb8ce8fcded57485c75e..7b5a807a7fa0c20b21fb5bf04e346307f74ade4f 100644 --- a/DDCore/src/Segmentations.cpp +++ b/DDCore/src/Segmentations.cpp @@ -118,46 +118,46 @@ Handle<SensitiveDetectorObject> Segmentation::sensitive() const { } #include "DDSegmentation/NoSegmentation.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::NoSegmentation); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::NoSegmentation); #include "DDSegmentation/CartesianGrid.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::CartesianGrid); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::CartesianGrid); #include "DDSegmentation/CartesianGridXY.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridXY); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridXY); #include "DDSegmentation/CartesianGridXZ.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridXZ); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridXZ); #include "DDSegmentation/CartesianGridYZ.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridYZ); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridYZ); #include "DDSegmentation/CartesianGridXYZ.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridXYZ); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::CartesianGridXYZ); #include "DDSegmentation/TiledLayerGridXY.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::TiledLayerGridXY); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::TiledLayerGridXY); #include "DDSegmentation/MegatileLayerGridXY.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::MegatileLayerGridXY); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::MegatileLayerGridXY); #include "DDSegmentation/WaferGridXY.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::WaferGridXY); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::WaferGridXY); #include "DDSegmentation/PolarGridRPhi.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::PolarGridRPhi); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::PolarGridRPhi); #include "DDSegmentation/PolarGridRPhi2.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::PolarGridRPhi2); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::PolarGridRPhi2); #include "DDSegmentation/GridPhiEta.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::GridPhiEta); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::GridPhiEta); #include "DDSegmentation/GridRPhiEta.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::GridRPhiEta); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::GridRPhiEta); #include "DDSegmentation/ProjectiveCylinder.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::ProjectiveCylinder); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::ProjectiveCylinder); #include "DDSegmentation/MultiSegmentation.h" -DD4HEP_IMPLEMENT_SEGMENTATION_HANDLE(DDSegmentation::MultiSegmentation); +DD4HEP_INSTANTIATE_SEGMENTATION_HANDLE(DDSegmentation::MultiSegmentation);