diff --git a/Framework/Cascade/History.h b/Framework/Cascade/History.h new file mode 100644 index 0000000000000000000000000000000000000000..235767cb9a6338ed638f82d1a39e374cd4a8e589 --- /dev/null +++ b/Framework/Cascade/History.h @@ -0,0 +1,62 @@ +#include <memory> +#include <utility> +#include <variant> + +using ParticleCode = std::variant<corsika::particles::ParticleCode, std::pair<int, int>>; + +class SecondaryParticle { + corsika::units::si::HEPEnergyType const energy_; + corsika::geometry::Vector<corsika::units::si::hepmomentum_d> const momentum_; + ParticleCode const pid_; + + // what else...? + // - polarization + +public: + SecondaryParticle(energy, momentum, pid) + : energy_{energy} + , momentum_{momentum} + , pid_{pid} {} +}; + +class Event; // forward declaration +using EventPtr = std::shared_ptr<Event>; + +struct ProjectileParticle { + std::pair<EventPtr, size_t> origin; + corsika::geometry::Point position; + coriska::units::si::TimeType time; + corsika::geometry::Vector<corsika::units::si::hepmomentum_d> momentum; + corsika::units::si::HEPEnergyType energy; + + // weight +}; + +struct Event { + corsika::particles::ParticleCode targetCode; // cannot be const... + ProjectileParticle projectile; + + std::vector<SecondaryParticle> secondaries; +}; + +template <typename TStackView> +class EventBuilder { + TStackView& stackView_; + EventPtr event_; + +public: + EventBuilder(TStackView& view) + : stackView_{stackView} + , event_{std::make_shared<Event>()} {} + + template <typename... Args> + void AddSecondary(Args&&... args) { + auto const s = stackView.AddSecondary(std::forward<Args>(args), event); + event->secondaries.emplace_back(s.GetEnergy(), s.GetMomentum(), s.GetParticleID()); + } + + void SetProjectile() {} + void SetTarget(corsika::particles::ParticleCode targetCode) { + event_->targetCode = targetCode; + } +}; diff --git a/Framework/ProcessSequence/testProcessSequence.cc b/Framework/ProcessSequence/testProcessSequence.cc index 0b2855f4ebc6f343ca10ff01b9ec066f5d4865da..552eb01a1a012b68cad7ce864476f74d64f3564a 100644 --- a/Framework/ProcessSequence/testProcessSequence.cc +++ b/Framework/ProcessSequence/testProcessSequence.cc @@ -287,5 +287,5 @@ TEST_CASE("SwitchProcess") { Process1 p1(0); Process2 p2(1); switch_process::SwitchProcess s(p1, p2, 10_GeV); - REQUIRE(is_switch_process_v<decltype(s)>); + CHECK(is_switch_process_v<decltype(s)>); } diff --git a/Stack/CMakeLists.txt b/Stack/CMakeLists.txt index 6171bb71b9616abffee047a5a1525f4743bd4612..ae5ee2acaabd768f8ac536e95a5706cdaae629cd 100644 --- a/Stack/CMakeLists.txt +++ b/Stack/CMakeLists.txt @@ -2,4 +2,4 @@ add_subdirectory (DummyStack) add_subdirectory (SuperStupidStack) add_subdirectory (NuclearStackExtension) add_subdirectory (GeometryNodeStackExtension) -#add_subdirectory (History) +add_subdirectory (History) diff --git a/Stack/GeometryNodeStackExtension/GeometryNodeStackExtension.h b/Stack/GeometryNodeStackExtension/GeometryNodeStackExtension.h index 492bd3a74c9eadbe2dde8b3e3331850c7c189a7c..16b9e02d69bb3b6cc6a424f7d87afcaead9734de 100644 --- a/Stack/GeometryNodeStackExtension/GeometryNodeStackExtension.h +++ b/Stack/GeometryNodeStackExtension/GeometryNodeStackExtension.h @@ -36,6 +36,7 @@ namespace corsika::stack::node { using T::GetIndex; using BaseNodeType = typename TEnvType::BaseNodeType; + public: // default version for particle-creation from input data void SetParticleData(const std::tuple<BaseNodeType const*> v) { SetNode(std::get<0>(v)); @@ -55,6 +56,8 @@ namespace corsika::stack::node { BaseNodeType const* GetNode() const { return GetStackData().GetNode(GetIndex()); } }; + + // definition of stack-data object to store geometry information template <typename TEnvType> diff --git a/Stack/GeometryNodeStackExtension/testGeometryNodeStackExtension.cc b/Stack/GeometryNodeStackExtension/testGeometryNodeStackExtension.cc index 9b7a3b60b83080c0813d3c3152d32b6c0b254492..f637540b6c7d6a6fc3e9c4c587a239cf7d3b620b 100644 --- a/Stack/GeometryNodeStackExtension/testGeometryNodeStackExtension.cc +++ b/Stack/GeometryNodeStackExtension/testGeometryNodeStackExtension.cc @@ -28,7 +28,6 @@ public: template <typename TStackIter> using DummyGeometryDataInterface = typename corsika::stack::node::MakeGeometryDataInterface<TStackIter, DummyEnv>::type; - // combine dummy stack with geometry information for tracking template <typename TStackIter> using StackWithGeometryInterface = corsika::stack::CombinedParticleInterface< diff --git a/Stack/History/CMakeLists.txt b/Stack/History/CMakeLists.txt index 2312bf22208a9b258952769201ff17611d1864a9..5bf3be2b074b3886151ffe3c4127b7ec7bef1423 100644 --- a/Stack/History/CMakeLists.txt +++ b/Stack/History/CMakeLists.txt @@ -35,9 +35,6 @@ install ( CORSIKA_ADD_TEST(testHistory) target_link_libraries ( testHistory - SuperStupidStack CORSIKAhistory - CORSIKAparticles - CORSIKAunits CORSIKAtesting ) diff --git a/Stack/History/HistoryStackExtension.h b/Stack/History/HistoryStackExtension.h index 00151f9019be3855f423b8cd573e562573b7b3cd..cfd5515d6b58e9e909ffe559f086d43bd95d2161 100644 --- a/Stack/History/HistoryStackExtension.h +++ b/Stack/History/HistoryStackExtension.h @@ -8,29 +8,22 @@ #pragma once -// the basic particle data stack: -#include <corsika/stack/super_stupid/SuperStupidStack.h> +#include <corsika/stack/Stack.h> -// extension with nuclear data for Code::Nucleus -#include <corsika/stack/nuclear_extension/NuclearStackExtension.h> - -// extension with nuclear data AND volume node ref -#include <corsika/setup/GeometryNodeStackExtension.h> - -#include <memory> #include <tuple> -#include <utility> - -class Event {}; +#include <vector> +#include <memory> namespace corsika::history { /** * @class HistoryData * - * definition of stack-data object to store history information - * this is vector with shared_ptr<Event> + * definition of stack-data object to store history information this + * is vector with shared_ptr<TEvent>, where TEvent is a free + * template parameter for customization. */ + template <typename TEvent> class HistoryData { public: @@ -42,8 +35,8 @@ namespace corsika::history { void Swap(const int i1, const int i2) { std::swap(fEvent[i1], fEvent[i2]); } // custom data access function - void SetEvent(const int i, std::shared_ptr<Event> v) { fEvent[i] = v; } - std::shared_ptr<Event> GetEvent(const int i) const { return fEvent[i]; } + void SetEvent(const int i, std::shared_ptr<TEvent> v) { fEvent[i] = v; } + std::shared_ptr<TEvent> GetEvent(const int i) const { return fEvent[i]; } // these functions are also needed by the Stack interface void IncrementSize() { fEvent.push_back(nullptr); } @@ -53,7 +46,7 @@ namespace corsika::history { // custom private data section private: - std::vector<std::shared_ptr<Event>> fEvent; + std::vector<std::shared_ptr<TEvent>> fEvent; }; /** @@ -64,62 +57,36 @@ namespace corsika::history { // defintion of a stack-readout object, the iteractor dereference // operator will deliver access to these function */ - template <typename T> + template <typename T, typename TEvent> class HistoryDataInterface : public T { + protected: + using T::GetStack; + using T::GetStackData; - public: - using T::GetIndex; - using T::GetStackData; - using T::SetParticleData; + public: + using T::GetIndex; + public: // default version for particle-creation from input data - void SetParticleData(const std::tuple<Event const*> v) { SetEvent(std::get<0>(v)); } + void SetParticleData(const std::tuple<TEvent const*> v) { SetEvent(std::get<0>(v)); } void SetParticleData(HistoryDataInterface& parent, - const std::tuple<std::shared_ptr<Event>>) { + const std::tuple<std::shared_ptr<TEvent>>) { SetEvent(parent.GetEvent()); // copy Event from parent particle! } void SetParticleData() { SetEvent(nullptr); } void SetParticleData(HistoryDataInterface& parent) { SetEvent(parent.GetEvent()); // copy Event from parent particle! } - void SetEvent(std::shared_ptr<Event> v) { GetStackData().SetEvent(GetIndex(), v); } - std::shared_ptr<Event> GetEvent() const { + void SetEvent(std::shared_ptr<TEvent> v) { GetStackData().SetEvent(GetIndex(), v); } + std::shared_ptr<TEvent> GetEvent() const { return GetStackData().GetEvent(GetIndex()); } }; - - namespace detail { - - // - // this is an auxiliary help typedef, which I don't know how to put - // into NuclearStackExtension.h where it belongs... - template <typename StackIter> - using ExtendedParticleInterfaceType = - corsika::stack::nuclear_extension::NuclearParticleInterface< - corsika::stack::super_stupid::SuperStupidStack::PIType, StackIter>; - // - - // the particle data stack with extra nuclear information: - using ParticleDataStack = corsika::stack::nuclear_extension::NuclearStackExtension< - corsika::stack::super_stupid::SuperStupidStack, ExtendedParticleInterfaceType>; - - template <typename T> - using SetupHistoryDataInterface = HistoryDataInterface<T>; - - // combine particle data stack with history information for tracking - template <typename StackIter> - using StackWithHistoryInterface = - corsika::stack::CombinedParticleInterface<ParticleDataStack::PIType, - SetupHistoryDataInterface, StackIter>; - - using StackWithHistory = - corsika::stack::CombinedStack<typename ParticleDataStack::StackImpl, HistoryData, - StackWithHistoryInterface>; - - } // namespace detail - - template <typename InnerStack, template <typename> typename _PI> - using NuclearStackExtension = - Stack<NuclearStackExtensionImpl<typename InnerStack::StackImpl>, _PI>; - + + template <typename T, typename TEvent> + struct MakeHistoryDataInterface { + typedef HistoryDataInterface<T, TEvent> type; + }; + + } // namespace corsika::history diff --git a/Stack/History/testHistory.cc b/Stack/History/testHistory.cc index 6aed02e0483938765de49977b3e105c27031d006..5dd6faf2bcd2179a2348b37c6f758ce72782d7ee 100644 --- a/Stack/History/testHistory.cc +++ b/Stack/History/testHistory.cc @@ -6,236 +6,51 @@ * the license. */ -#include <corsika/geometry/RootCoordinateSystem.h> #include <corsika/history/HistoryStackExtension.h> -#include <corsika/stack/super_stupid/SuperStupidStack.h> +#include <corsika/stack/dummy/DummyStack.h> +#include <corsika/stack/CombinedStack.h> using namespace corsika; -using namespace corsika::history; -using namespace corsika::stack::nuclear_extension; -using namespace corsika::geometry; -using namespace corsika::units::si; +using namespace corsika::stack; #include <catch2/catch.hpp> -// this is an auxiliary help typedef, which I don't know how to put -// into NuclearStackExtension.h where it belongs... -template <typename StackIter> -using ExtendedParticleInterfaceType = - corsika::stack::nuclear_extension::NuclearParticleInterface< - corsika::stack::super_stupid::SuperStupidStack::template PIType, StackIter>; - -using ExtStack = NuclearStackExtension<corsika::stack::super_stupid::SuperStupidStack, - ExtendedParticleInterfaceType>; - #include <iostream> using namespace std; -TEST_CASE("HistoryStackExtension", "[stack]") { +// this is our dummy environment, it only knows its trivial BaseNodeType +class DummyEvent { +public: + int id; +}; - geometry::CoordinateSystem& dummyCS = - geometry::RootCoordinateSystem::GetInstance().GetRootCoordinateSystem(); +// the GeometryNode stack needs to know the type of geometry-nodes from the DummyEnv: +template <typename TStackIter> +using DummyHistoryDataInterface = typename history::MakeHistoryDataInterface<TStackIter, DummyEvent>::type; - SECTION("write non nucleus") { - HistoryStackExtension<corsika::stack::super_stupid::SuperStupidStack, - ExtendedParticleInterfaceType> - s; - s.AddParticle( - std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{ - particles::Code::Electron, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); - REQUIRE(s.GetSize() == 1); - } - SECTION("write nucleus") { - HistoryStackExtension<corsika::stack::super_stupid::SuperStupidStack, - ExtendedParticleInterfaceType> - s; - s.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, - units::si::TimeType, unsigned short, unsigned short>{ - particles::Code::Nucleus, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 10, 10}); - REQUIRE(s.GetSize() == 1); - } +// combine dummy stack with geometry information for tracking +template <typename TStackIter> +using StackWithHistoryInterface = corsika::stack::CombinedParticleInterface< + dummy::DummyStack::PIType, + DummyHistoryDataInterface, TStackIter>; - SECTION("write invalid nucleus") { - ExtStack s; - REQUIRE_THROWS( - s.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, - units::si::TimeType, unsigned short, unsigned short>{ - particles::Code::Nucleus, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 0, 0})); - } +using TestStack = corsika::stack::CombinedStack< + typename stack::dummy::DummyStack::StackImpl, + history::HistoryData<DummyEvent>, + StackWithHistoryInterface>; - SECTION("read non nucleus") { - ExtStack s; - s.AddParticle( - std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{ - particles::Code::Electron, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); - const auto pout = s.GetNextParticle(); - REQUIRE(pout.GetPID() == particles::Code::Electron); - REQUIRE(pout.GetEnergy() == 1.5_GeV); - REQUIRE(pout.GetTime() == 100_s); - } - - SECTION("read nucleus") { - ExtStack s; - s.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, - units::si::TimeType, unsigned short, unsigned short>{ - particles::Code::Nucleus, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, 10, 9}); - const auto pout = s.GetNextParticle(); - REQUIRE(pout.GetPID() == particles::Code::Nucleus); - REQUIRE(pout.GetEnergy() == 1.5_GeV); - REQUIRE(pout.GetTime() == 100_s); - REQUIRE(pout.GetHistoryA() == 10); - REQUIRE(pout.GetNuclearZ() == 9); - } - SECTION("read invalid nucleus") { - ExtStack s; - s.AddParticle( - std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, units::si::TimeType>{ - particles::Code::Electron, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); - const auto pout = s.GetNextParticle(); - REQUIRE_THROWS(pout.GetNuclearA()); - REQUIRE_THROWS(pout.GetNuclearZ()); - } - - SECTION("stack fill and cleanup") { +TEST_CASE("HistoryStackExtension", "[stack]") { - ExtStack s; - // add 99 particles, each 10th particle is a nucleus with A=i and Z=A/2! - for (int i = 0; i < 99; ++i) { - if ((i + 1) % 10 == 0) { - s.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, - units::si::TimeType, unsigned short, unsigned short>{ - particles::Code::Nucleus, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, i, i / 2}); - } else { - s.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, - units::si::TimeType>{ - particles::Code::Electron, 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); - } - } + const dummy::NoData noData; + + SECTION("write event") { - REQUIRE(s.GetSize() == 99); - for (int i = 0; i < 99; ++i) s.GetNextParticle().Delete(); - REQUIRE(s.GetSize() == 0); + TestStack s; + s.AddParticle(std::tuple<dummy::NoData>{noData}); + REQUIRE(s.GetSize() == 1); } - SECTION("stack operations") { - - ExtStack s; - // add 99 particles, each 10th particle is a nucleus with A=i and Z=A/2! - for (int i = 0; i < 99; ++i) { - if ((i + 1) % 10 == 0) { - s.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, - units::si::TimeType, unsigned short, unsigned short>{ - particles::Code::Nucleus, i * 15_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s, i, i / 2}); - } else { - s.AddParticle(std::tuple<particles::Code, units::si::HEPEnergyType, - corsika::stack::MomentumVector, geometry::Point, - units::si::TimeType>{ - particles::Code::Electron, i * 1.5_GeV, - corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), - Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); - } - } - - // copy - { - s.Copy(s.begin() + 9, s.begin() + 10); // nuclei to non-nuclei - const auto& p9 = s.cbegin() + 9; - const auto& p10 = s.cbegin() + 10; - - REQUIRE(p9.GetPID() == particles::Code::Nucleus); - REQUIRE(p9.GetEnergy() == 9 * 15_GeV); - REQUIRE(p9.GetTime() == 100_s); - REQUIRE(p9.GetNuclearA() == 9); - REQUIRE(p9.GetNuclearZ() == 9 / 2); - - REQUIRE(p10.GetPID() == particles::Code::Nucleus); - REQUIRE(p10.GetEnergy() == 9 * 15_GeV); - REQUIRE(p10.GetTime() == 100_s); - REQUIRE(p10.GetNuclearA() == 9); - REQUIRE(p10.GetNuclearZ() == 9 / 2); - } - - // copy - { - s.Copy(s.begin() + 93, s.begin() + 9); // non-nuclei to nuclei - const auto& p93 = s.cbegin() + 93; - const auto& p9 = s.cbegin() + 9; - - REQUIRE(p9.GetPID() == particles::Code::Electron); - REQUIRE(p9.GetEnergy() == 93 * 1.5_GeV); - REQUIRE(p9.GetTime() == 100_s); - - REQUIRE(p93.GetPID() == particles::Code::Electron); - REQUIRE(p93.GetEnergy() == 93 * 1.5_GeV); - REQUIRE(p93.GetTime() == 100_s); - } - - // swap - { - s.Swap(s.begin() + 11, s.begin() + 10); - const auto& p11 = s.cbegin() + 11; // now: nucleus - const auto& p10 = s.cbegin() + 10; // now: electron - - REQUIRE(p11.GetPID() == particles::Code::Nucleus); - REQUIRE(p11.GetEnergy() == 9 * 15_GeV); - REQUIRE(p11.GetTime() == 100_s); - REQUIRE(p11.GetNuclearA() == 9); - REQUIRE(p11.GetNuclearZ() == 9 / 2); - - REQUIRE(p10.GetPID() == particles::Code::Electron); - REQUIRE(p10.GetEnergy() == 11 * 1.5_GeV); - REQUIRE(p10.GetTime() == 100_s); - } - - // swap two nuclei - { - s.Swap(s.begin() + 29, s.begin() + 59); - const auto& p29 = s.cbegin() + 29; - const auto& p59 = s.cbegin() + 59; - - REQUIRE(p29.GetPID() == particles::Code::Nucleus); - REQUIRE(p29.GetEnergy() == 59 * 15_GeV); - REQUIRE(p29.GetTime() == 100_s); - REQUIRE(p29.GetNuclearA() == 59); - REQUIRE(p29.GetNuclearZ() == 59 / 2); - - REQUIRE(p59.GetPID() == particles::Code::Nucleus); - REQUIRE(p59.GetEnergy() == 29 * 15_GeV); - REQUIRE(p59.GetTime() == 100_s); - REQUIRE(p59.GetNuclearA() == 29); - REQUIRE(p59.GetNuclearZ() == 29 / 2); - } - - for (int i = 0; i < 99; ++i) s.DeleteLast(); - REQUIRE(s.GetSize() == 0); - } + //REQUIRE(pout.GetPID() == particles::Code::Electron); } diff --git a/Stack/SuperStupidStack/testSuperStupidStack.cc b/Stack/SuperStupidStack/testSuperStupidStack.cc index 04a892b50747d92c5e5e0d14e3da5eca984a0d75..da419ed792342ec7c7485caa57d7ee04c5455578 100644 --- a/Stack/SuperStupidStack/testSuperStupidStack.cc +++ b/Stack/SuperStupidStack/testSuperStupidStack.cc @@ -37,14 +37,14 @@ TEST_CASE("SuperStupidStack", "[stack]") { Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); // read - REQUIRE(s.GetSize() == 1); + CHECK(s.GetSize() == 1); auto pout = s.GetNextParticle(); - REQUIRE(pout.GetPID() == particles::Code::Electron); - REQUIRE(pout.GetEnergy() == 1.5_GeV); - // REQUIRE(pout.GetMomentum() == stack::MomentumVector(dummyCS, {1_GeV, - // 1_GeV, 1_GeV})); REQUIRE(pout.GetPosition() == Point(dummyCS, {1 * meter, 1 * + CHECK(pout.GetPID() == particles::Code::Electron); + CHECK(pout.GetEnergy() == 1.5_GeV); + // CHECK(pout.GetMomentum() == stack::MomentumVector(dummyCS, {1_GeV, + // 1_GeV, 1_GeV})); CHECK(pout.GetPosition() == Point(dummyCS, {1 * meter, 1 * // meter, 1 * meter})); - REQUIRE(pout.GetTime() == 100_s); + CHECK(pout.GetTime() == 100_s); } SECTION("write+delete") { @@ -59,10 +59,10 @@ TEST_CASE("SuperStupidStack", "[stack]") { corsika::stack::MomentumVector(dummyCS, {1_GeV, 1_GeV, 1_GeV}), Point(dummyCS, {1 * meter, 1 * meter, 1 * meter}), 100_s}); - REQUIRE(s.GetSize() == 99); + CHECK(s.GetSize() == 99); for (int i = 0; i < 99; ++i) s.GetNextParticle().Delete(); - REQUIRE(s.GetSize() == 0); + CHECK(s.GetSize() == 0); } }