File indexing completed on 2025-04-26 09:01:13
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011 #pragma once
0012
0013 #include <Gaudi/Interfaces/IFSMCallbackHolder.h>
0014 #include <GaudiKernel/StateMachine.h>
0015 #include <GaudiKernel/extends.h>
0016
0017 #include <map>
0018 #include <vector>
0019
0020 namespace Gaudi {
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036 template <class BASE>
0037 class FSMCallbackHolder : public extends<BASE, IFSMCallbackHolder> {
0038
0039 public:
0040 using Parent = extends<BASE, IFSMCallbackHolder>;
0041 using extends<BASE, IFSMCallbackHolder>::extends;
0042
0043 void registerCallBack( StateMachine::Transition s, IFSMCallbackHolder::CallBack c ) override {
0044 m_callbacks[s].push_back( std::move( c ) );
0045 }
0046
0047 StatusCode sysInitialize() override {
0048 return Parent::sysInitialize().andThen( [&]() { handleCallBacks( StateMachine::INITIALIZE ); } );
0049 }
0050 StatusCode sysStart() override {
0051 return Parent::sysStart().andThen( [&]() { handleCallBacks( StateMachine::START ); } );
0052 }
0053 StatusCode sysStop() override {
0054 return Parent::sysStop().andThen( [&]() { handleCallBacks( StateMachine::STOP ); } );
0055 }
0056 StatusCode sysFinalize() override {
0057 return Parent::sysFinalize().andThen( [&]() { handleCallBacks( StateMachine::FINALIZE ); } );
0058 }
0059
0060 private:
0061 void handleCallBacks( StateMachine::Transition state ) {
0062 std::for_each( m_callbacks[state].begin(), m_callbacks[state].end(),
0063 []( IFSMCallbackHolder::CallBack const& c ) { c(); } );
0064 }
0065
0066 std::map<StateMachine::Transition, std::vector<IFSMCallbackHolder::CallBack>> m_callbacks;
0067 };
0068
0069 }