commit a569ee6972208b98e6018ecf153566ee79442322 Author: lexiaoyao Date: Sat Apr 19 23:41:23 2025 +0800 工作流框架搭建 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..46d3947 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/bin +/build +/.vscode +/.cache \ No newline at end of file diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..84a0c73 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,13 @@ +cmake_minimum_required(VERSION 3.10) +project(workflow VERSION 0.1.0 LANGUAGES CXX) +set(EXECUTABLE_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/bin) +set(LIBRARY_OUTPUT_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib) +set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/bin) +set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib) +set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/lib) +add_compile_definitions(-DSWF_EXPORT_DLL) +set(CMAKE_CXX_STANDARD 17) +aux_source_directory(src SRC_LIST) +add_executable(${PROJECT_NAME} ${SRC_LIST}) + +target_include_directories(${PROJECT_NAME} PRIVATE include head) \ No newline at end of file diff --git a/head/SWFNode.h b/head/SWFNode.h new file mode 100644 index 0000000..4cc6bd9 --- /dev/null +++ b/head/SWFNode.h @@ -0,0 +1,16 @@ +#pragma once + +#include "INode.h" +#include "node_view.h" + +class SWF_API SWFNode : public WF::INode +{ + std::vector m_next; + std::vector m_prev; + +public: + SWFNode(); + + // 获取节点类型 + NodeType GetNodeType() const noexcept; +}; \ No newline at end of file diff --git a/head/SWFlow.h b/head/SWFlow.h new file mode 100644 index 0000000..66c2e5f --- /dev/null +++ b/head/SWFlow.h @@ -0,0 +1,30 @@ +#pragma once + +#include "SWFDefine.h" +#include "IFlow.h" +#include "node_view.h" + +namespace WF { class INode; } + +class SWF_API SWFlow : public WF::IFlow +{ + // 工作流状态 + FlowStatus m_nStatus; + // 工作流节点列表 + std::vector> m_vecNodes; + + node_view m_curNode; // 当前节点视图 + +public: + SWFlow(); + ~SWFlow() override; + + // 运行工作流 + void Run() override; + + // 停止工作流 + void Stop() override; + + // 获取工作流状态 + int GetStatus() const noexcept override; +}; \ No newline at end of file diff --git a/head/node_view.h b/head/node_view.h new file mode 100644 index 0000000..7434e15 --- /dev/null +++ b/head/node_view.h @@ -0,0 +1,18 @@ +#pragma once + +#include "INode.h" + +class SWF_API node_view +{ + /* + * @brief 节点视图类 + * @note 不管理节点对象的生命周期 + */ + WF::INode* m_node; +public: + node_view(WF::INode* node) : m_node(node) {} + ~node_view() = default; + + // 获取节点类型 + NodeType GetNodeType() const noexcept; +}; \ No newline at end of file diff --git a/include/IError.h b/include/IError.h new file mode 100644 index 0000000..94073b9 --- /dev/null +++ b/include/IError.h @@ -0,0 +1,28 @@ +#pragma once + +///////////////////////////////////////////////////// +// @file: IError.h +// @brief: Error handling interface +// @author: dyz +// @date: 2025-04-19 +// @version: 1.0 +///////////////////////////////////////////////////// +#include "SWFInc.h" + +namespace WF { + class SWF_API IError + { + public: + virtual ~IError() = default; + + // Get the error code + virtual int GetErrorCode() const = 0; + + // Get the error message + virtual const char* GetErrorMessage() const = 0; + + // Set the error code and message + virtual void SetError(int code, const char* message) = 0; + }; + +} // namespace WF \ No newline at end of file diff --git a/include/IFlow.h b/include/IFlow.h new file mode 100644 index 0000000..66d5959 --- /dev/null +++ b/include/IFlow.h @@ -0,0 +1,30 @@ +#pragma once + +///////////////////////////////////////////////////// +// @file: IFlow.h +// @brief: Interface for the Flow class +// @author: dyz +// @date: 2025-04-19 +// @version: 1.0 +///////////////////////////////////////////////////// + +#include "SWFInc.h" + +namespace WF { + + class SWF_API IFlow + { + public: + virtual ~IFlow() = default; + + // 运行工作流 + virtual void Run() = 0; + + // 停止工作流 + virtual void Stop() = 0; + + // 获取工作流状态 + virtual int GetStatus() const = 0; + }; + +} // namespace WF \ No newline at end of file diff --git a/include/INode.h b/include/INode.h new file mode 100644 index 0000000..3ef5fed --- /dev/null +++ b/include/INode.h @@ -0,0 +1,26 @@ +#pragma once + +///////////////////////////////////////////////////// +// @file: INode.h +// @brief: Interface for the Node class +// @author: dyz +// @date: 2025-04-19 +// @version: 1.0 +///////////////////////////////////////////////////// + +#include "SWFInc.h" +#include "SWFDefine.h" + +namespace WF +{ + class SWF_API INode + { + public: + // 执行节点的操作 + virtual void exec() = 0; + virtual INode* clone() const = 0; + virtual NodeType GetNodeType() const = 0; + virtual ~INode() = default; + }; + +} // namespace WF \ No newline at end of file diff --git a/include/SWFDefine.h b/include/SWFDefine.h new file mode 100644 index 0000000..c2223cf --- /dev/null +++ b/include/SWFDefine.h @@ -0,0 +1,46 @@ +#pragma once + +////////////////////////////////////////////////////// +// @file: SWFDefine.h +// @brief: 工作流类型定义 +// @author: dyz +// @date: 2025-04-19 +// @version: 1.0 +////////////////////////////////////////////////////// + + +/********************************************************** + * @brief 工作流节点类型定义 + * @note 该定义用于工作流节点的类型标识 +**********************************************************/ +#define FOR_MEMORY_NODETYPE(_f) \ + _f(START) \ + _f(END) \ + _f(IF) \ + _f(ACTIVTIY) \ + _f(SEND) \ + _f(RECEIVE) \ + + +#define FOR_MEMORY_FLOWSTATUS(_f) \ + _f(INIT) \ + _f(RUNNING) \ + _f(END) \ + _f(ERROR) \ + + +enum class NodeType +{ +#define _f(_name) _name, + FOR_MEMORY_NODETYPE(_f) +#undef _f + MAX_NODETYPE +}; + +enum class FlowStatus +{ +#define _f(_name) _name, + FOR_MEMORY_FLOWSTATUS(_f) +#undef _f + MAX_FLOWSTATUS +}; \ No newline at end of file diff --git a/include/SWFInc.h b/include/SWFInc.h new file mode 100644 index 0000000..e2e5fc4 --- /dev/null +++ b/include/SWFInc.h @@ -0,0 +1,23 @@ +#pragma once + +#ifdef _WIN32 +# ifdef SWF_EXPORT_DLL +# define SWF_API __declspec(dllexport) +# else +# define SWF_API __declspec(dllimport) +# endif +#else +# ifdef SWF_EXPORT_DLL +# define SWF_API __attribute__((visibility("default"))) +# else +# define SWF_API +# endif +#endif + +// 公共头文件 +#include +#include +#include +#include +#include +#include \ No newline at end of file diff --git a/src/SWFlow.cpp b/src/SWFlow.cpp new file mode 100644 index 0000000..2df7c00 --- /dev/null +++ b/src/SWFlow.cpp @@ -0,0 +1,10 @@ +#include "INode.h" +#include "SWFlow.h" + +void SWFlow::Run() { + + // 按照序列执行节点 + for (auto& node : m_vecNodes) { + node->exec(); + } +} \ No newline at end of file diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..4a31bd1 --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,10 @@ +#include "IFlow.h" +#include "SWFlow.h" + + +int main(){ + WF::IFlow* flow = new SWFlow(); + flow->Run(); + + return 0; +} \ No newline at end of file