From 3e666822e536d561eca58da04521bce088158d14 Mon Sep 17 00:00:00 2001
From: ralfulrich <ralf.ulrich@kit.edu>
Date: Wed, 19 Dec 2018 16:33:55 +0100
Subject: [PATCH] converted EProcessReturn to bitwise enum, as it was desinged
 for

---
 Documentation/Examples/cascade_example.cc   |  6 +++---
 Framework/Cascade/Cascade.h                 |  5 ++++-
 Framework/Cascade/testCascade.cc            |  3 ++-
 Framework/ProcessSequence/ProcessReturn.h   | 22 ++++++++++++++++-----
 Framework/ProcessSequence/ProcessSequence.h |  4 ++--
 5 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/Documentation/Examples/cascade_example.cc b/Documentation/Examples/cascade_example.cc
index cc37b2131..ee2d9940b 100644
--- a/Documentation/Examples/cascade_example.cc
+++ b/Documentation/Examples/cascade_example.cc
@@ -141,18 +141,18 @@ public:
       cout << "removing em. particle..." << endl;
       fEmEnergy += p.GetEnergy();
       fEmCount += 1;
-      p.Delete();
+      // p.Delete();
       ret = EProcessReturn::eParticleAbsorbed;
     } else if (isInvisible(pid)) {
       cout << "removing inv. particle..." << endl;
       fInvEnergy += p.GetEnergy();
       fInvCount += 1;
-      p.Delete();
+      // p.Delete();
       ret = EProcessReturn::eParticleAbsorbed;
     } else if (isBelowEnergyCut(p)) {
       cout << "removing low en. particle..." << endl;
       fEnergy += p.GetEnergy();
-      p.Delete();
+      // p.Delete();
       ret = EProcessReturn::eParticleAbsorbed;
     }
     return ret;
diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h
index 31c16e2ea..51d709950 100644
--- a/Framework/Cascade/Cascade.h
+++ b/Framework/Cascade/Cascade.h
@@ -119,7 +119,10 @@ namespace corsika::cascade {
           fProcessSequence.DoContinuous(particle, step, fStack);
 
       if (status == corsika::process::EProcessReturn::eParticleAbsorbed) {
-        // fStack.Delete(particle); // TODO: check if this is really needed
+        std::cout << "Cascade: delete absorbed particle " << particle.GetPID() << " "
+                  << particle.GetEnergy() / 1_GeV << "GeV" << std::endl;
+        particle.Delete();
+        return;
       } else {
 
         std::cout << "sth. happening before geometric limit ?"
diff --git a/Framework/Cascade/testCascade.cc b/Framework/Cascade/testCascade.cc
index 80ebf4b21..081325f96 100644
--- a/Framework/Cascade/testCascade.cc
+++ b/Framework/Cascade/testCascade.cc
@@ -80,7 +80,7 @@ public:
   }
 
   template <typename Particle, typename T, typename Stack>
-  void DoContinuous(Particle& p, T&, Stack& s) const {
+  EProcessReturn DoContinuous(Particle& p, T&, Stack& s) const {
     EnergyType E = p.GetEnergy();
     if (E < 85_MeV) {
       p.Delete();
@@ -95,6 +95,7 @@ public:
       pnew.SetPosition(p.GetPosition());
       pnew.SetMomentum(p.GetMomentum());
     }
+    return EProcessReturn::eOk;
   }
 
   void Init() { fCount = 0; }
diff --git a/Framework/ProcessSequence/ProcessReturn.h b/Framework/ProcessSequence/ProcessReturn.h
index ae4869ea8..215994b42 100644
--- a/Framework/ProcessSequence/ProcessReturn.h
+++ b/Framework/ProcessSequence/ProcessReturn.h
@@ -20,13 +20,25 @@ namespace corsika::process {
      that can be accumulated easily with "|="
    */
 
-  enum class EProcessReturn {
-    eOk = 1,
-    eParticleAbsorbed = 2,
-    eInteracted = 3,
-    eDecayed = 4,
+  enum class EProcessReturn : int {
+    eOk = (1 << 0),
+    eParticleAbsorbed = (1 << 2),
+    eInteracted = (1 << 3),
+    eDecayed = (1 << 4),
   };
 
+  inline EProcessReturn operator|(EProcessReturn a, EProcessReturn b) {
+    return static_cast<EProcessReturn>(static_cast<int>(a) | static_cast<int>(b));
+  }
+
+  inline EProcessReturn& operator|=(EProcessReturn& a, EProcessReturn b) {
+    return a = a | b;
+  }
+
+  inline bool operator==(EProcessReturn a, EProcessReturn b) {
+    return (static_cast<int>(a) & static_cast<int>(b)) != 0;
+  }
+
 } // namespace corsika::process
 
 #endif
diff --git a/Framework/ProcessSequence/ProcessSequence.h b/Framework/ProcessSequence/ProcessSequence.h
index a1b92b0e3..bc4bf679e 100644
--- a/Framework/ProcessSequence/ProcessSequence.h
+++ b/Framework/ProcessSequence/ProcessSequence.h
@@ -60,11 +60,11 @@ namespace corsika::process {
       EProcessReturn ret = EProcessReturn::eOk;
       if constexpr (std::is_base_of<ContinuousProcess<T1>, T1>::value ||
                     is_process_sequence<T1>::value) {
-        A.DoContinuous(p, t, s);
+        ret |= A.DoContinuous(p, t, s);
       }
       if constexpr (std::is_base_of<ContinuousProcess<T2>, T2>::value ||
                     is_process_sequence<T2>::value) {
-        B.DoContinuous(p, t, s);
+        ret |= B.DoContinuous(p, t, s);
       }
       return ret;
     }
-- 
GitLab