Files
2022-10-26 12:25:11 +08:00

194 lines
6.1 KiB
C++

#pragma once
#include "Logic.Internal.h"
#define LF_ACTIVE_HANDLER_DECL(name) LF_RESULT ACTIVE_HANDLER_##name(LogicFlowDelegator* pDelegator, PASSING_ARG IN arguments)
#define LF_ACTIVE_HANDLER_IMPL(name) LF_RESULT ACTIVE_HANDLER_##name(LogicFlowDelegator* pDelegator, PASSING_ARG IN arguments)
#define LF_ACTIVE_HANDLER_IMPL_NULL(name) LF_RESULT ACTIVE_HANDLER_##name(LogicFlowDelegator* pDelegator, PASSING_ARG IN arguments) { DEBUGGING_CODE_L1(""); return LFRET_SUCCESS_DEFAULT; }
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
//
class WiseUser;
struct sLINKEDLIST_NODE;
class ActiveLogic;
class PassiveLogic;
typedef WorkLoadContainer<DWORD> WORK_LOAD_CONTAINER_LF_WORK;
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <sSIGNAL_FORWARD_BUFFER>
struct sSIGNAL_FORWARD_BUFFER
{
typedef MSG_BUFFER<4096> sSIGNAL_FORWARD_BUFFER_DATA;
template<typename _TY>
inline _TY& InstanceOf()
{ return BUFFER.InstanceOf<_TY>(); }
template<typename _TY>
inline _TY& TypeOf()
{ return BUFFER.TypeOf<_TY>(); }
BOOL MSG_EXIST;
sSIGNAL_FORWARD_BUFFER_DATA BUFFER;
};
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <LogicFlowController>
class LogicFlowController : public IWorkNode
{
public: typedef LF_RESULT (LogicFlowController::*ProcessHandler)(PASSING_ARG IN arguments);
public: LogicFlowController();
~LogicFlowController();
static void CreateTable();
static void ReleaseTable();
public: inline LF_GROUP_DEFINE GetGroupOfLF() { return m_eGROUPofLF; }
inline LF_DEFINE GetCurrentSTEP() { return m_eSTEP; }
inline void SetWiseUser(WiseUser* pUser) { m_pWiseUser = pUser; }
inline WiseUser* GetWiseUser() { return m_pWiseUser; }
inline void SetParentContainer(sLINKEDLIST_NODE* pContainer) { m_pContainer = pContainer; }
inline sLINKEDLIST_NODE* GetParentContainer() { return m_pContainer; }
inline
WORK_LOAD_CONTAINER_LF_WORK& WORK_LOAD() { return m_WorkLoad; }
//inline sSIGNAL_FORWARD_BUFFER& SIGNAL_BUFFER() { return m_SignalBuffer; }
virtual BOOL DoInit();
virtual BOOL DoProcess(); // Active Handler 처리
virtual BOOL IsComplete();
virtual BOOL DoRelease();
virtual void OnMsg(sSIG_MSG* pSIG_MSG); // Passive Handler 처리
public: void ChangeNextStep();
BOOL GotoStep(LF_DEFINE step, PASSING_ARG IN arguments);
private:
//typedef list< -- 넘겨줄 인수 목록... list_map?
private: LF_GROUP_DEFINE m_eGROUPofLF;
LF_DEFINE m_eSTEP;
LF_RESULT m_eCONTROL; // DoProcess 수행시 처리 여부
sLINKEDLIST_NODE* m_pContainer;
WiseUser* m_pWiseUser;
WORK_LOAD_CONTAINER_LF_WORK m_WorkLoad;
//sSIGNAL_FORWARD_BUFFER m_SignalBuffer;
};
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <LogicFlowBase>
class LogicFlowBase : public IWorkNode
{
public: LogicFlowBase(LogicFlowController& rLFC);
virtual ~LogicFlowBase();
public: inline LF_GROUP_DEFINE GetGroupOfLF() { return m_eGROUPofLF; }
inline LF_DEFINE GetCurrentSTEP() { return m_eSTEP; }
inline LogicFlowController& LF_CONTROLLER() { return m_rLFC; }
virtual BOOL DoInit() = 0;
virtual BOOL DoProcess();
virtual BOOL IsComplete();
virtual BOOL DoRelease() = 0;
virtual void OnMsg(sSIG_MSG* pSIG_MSG);
inline WORK_LOAD_CONTAINER_LF_WORK& WORK_LOAD() { return m_rLFC.WORK_LOAD(); }
protected: virtual void ChangeNextStep();
virtual BOOL GotoStep(LF_DEFINE step, PASSING_ARG IN arguments);
protected: inline LF_DEFINE& STEP() { return m_eSTEP; }
inline LF_DEFINE& ENDofSTEP() { return m_eENDofSTEP; }
inline LF_RESULT& CONTROL() { return m_eCONTROL; }
inline LF_GROUP_DEFINE& GROUPofLF() { return m_eGROUPofLF; }
protected: LogicFlowController& m_rLFC;
LF_GROUP_DEFINE m_eGROUPofLF;
protected: LF_DEFINE m_eSTEP;
LF_DEFINE m_eENDofSTEP;
protected: LF_RESULT m_eCONTROL; // DoProcess 수행시 처리 여부
};
//━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
// <LogicFlowDelegator><EXPORTS>
class LogicFlowDelegator
{
public: LogicFlowDelegator() : m_pLogicFlow(NULL) {}
LogicFlowDelegator(LogicFlowBase* pLogicFlow) : m_pLogicFlow(pLogicFlow)
{
}
inline LF_GROUP_DEFINE GetGroupOfLF()
{
if(m_pLogicFlow)
{
LogicFlowController& rCONTROL = m_pLogicFlow->LF_CONTROLLER();
return m_pLogicFlow->GetGroupOfLF();
}
return LFG_MAX;
}
inline LF_DEFINE GetCurrentSTEP()
{
if(m_pLogicFlow)
{
LogicFlowController& rCONTROL = m_pLogicFlow->LF_CONTROLLER();
return m_pLogicFlow->GetCurrentSTEP();
}
return S_999999_LF_EOL_MARK_LF;
}
inline void SetWiseUser(WiseUser* pUser)
{
if(m_pLogicFlow)
{
LogicFlowController& rCONTROL = m_pLogicFlow->LF_CONTROLLER();
rCONTROL.SetWiseUser(pUser);
}
}
inline WiseUser* GetWiseUser()
{
if(m_pLogicFlow)
{
LogicFlowController& rCONTROL = m_pLogicFlow->LF_CONTROLLER();
return rCONTROL.GetWiseUser();
}
return NULL;
}
//inline sSIG_MSG* GetSignalMsg()
//{
// sSIGNAL_FORWARD_BUFFER& rSIG_BUFFER = m_pLogicFlow->SIGNAL_BUFFER();
// //if(m_pLogicFlow && (rSIG_BUFFER.MSG_EXIST == TRUE))
// // return &rSIG_BUFFER.TypeOf<sSIG_MSG>();
// return NULL;
//}
inline void OnMsg(sSIG_MSG* pSIG_MSG)
{
if(m_pLogicFlow)
{
LogicFlowController& rCONTROL = m_pLogicFlow->LF_CONTROLLER();
rCONTROL.OnMsg(pSIG_MSG);
}
}
inline LogicFlowBase* REF() { return m_pLogicFlow; }
private: LogicFlowBase* m_pLogicFlow;
};
typedef LF_RESULT (*ActiveLogicHandler)(LogicFlowDelegator* pDelegator, PASSING_ARG IN arguments);
typedef LF_RESULT (*ConditionLogicHandler)(LogicFlowDelegator* pDelegator, PASSING_ARG IN arguments);
typedef LF_RESULT (*PassiveLogicHandler)(LogicFlowDelegator* pDelegator, PASSING_ARG IN arguments);
#include "Logic.Internal.Tail.h"
// 세부 타입들은 여기서 포함시켜 사용할 것
#include "LogicFlowIncludeList.h"
//