#pragma once #include "includes.h" #include "dynarray.hpp" #include #include #include struct dependency_tree { typedef uint32_t ref_t; typedef ref_t state_t; typedef ref_t state_cmp_t; enum STATE : state_t { FULFILLED = 0, FAILED = 1, WAITING = 2, WORKING = 3 }; enum STATE_CMP : state_cmp_t { CMP_FULFILED = 1, CMP_FAILED = 2, CMP_WAITING = 4, CMP_WORKING = 8 }; struct node { node(const node&) = delete; node& operator =(const node&) = delete; node(node&& other) noexcept; node& operator =(node&& other) noexcept; node(); // What depends on this node std::set m_dependents = {}; // Name of the node const char* m_name = nullptr; // How many other nodes does this node depend on ref_t m_num_pending_dependencies = 0; // A user-controlled u30 ref_t m_userdata : (sizeof(ref_t)-2) = -1; // State of the node state_t m_state : 2; ~node(); }; ~dependency_tree(); // A list that maps a nodes name to its index std::map m_node_name_mapping; // A list of all nodes in the dependency tree dynarray m_nodes; node& operator[](const ref_t idx) noexcept; const node& operator[](const ref_t idx) const noexcept; dynarray get_leaf_nodes(const bool ignore_fulfilled=false) const; dynarray get_leaf_node_names(const bool ignore_fulfilled=false) const; dynarray filter_nodes(const state_cmp_t state_cmp, const ref_t num_dependencies_gt, const bool invert_num_deps) const; void set_node_state(const ref_t node, const state_t new_state); void set_node_state(const char* node, const state_t new_state); ref_t add_node(const char* node_name, const dynarray& dependents); ref_t add_node(const char* node_name, const dynarray& dependents); ref_t add_node(const char* node_name, const std::initializer_list& dependents); ref_t add_node(const char* node_name, const std::initializer_list& dependents); ref_t add_node(const char* node_name); void add_node_dependency(const ref_t node, const ref_t dependency); void add_node_dependency(const ref_t node, const char* dependency); void add_node_dependency(const char* node, const ref_t dependency); void add_node_dependency(const char* node, const char* dependency); void add_node_dependencies(const ref_t node, const std::initializer_list& dependencies); void add_node_dependencies(const ref_t node, const dynarray& dependencies); void add_node_dependencies(const ref_t node, const std::initializer_list& dependencies); void add_node_dependencies(const ref_t node, const dynarray& dependencies); }; int luaopen_dependency_tree(lua_State* L); int lua_dependency_create(lua_State* L); int lua_dependency_destroy(lua_State* L); int lua_dependency_add_node(lua_State* L); int lua_dependency_add_dependency(lua_State* L); int lua_dependency_remove_dependency(lua_State* L); int lua_dependency_add_dependencies(lua_State* L); int lua_dependency_remove_dependencies(lua_State* L); int lua_dependency_get_leafs(lua_State* L); int lua_dependency_match_nodes(lua_State* L); int lua_dependency_get_node_state(lua_State* L); int lua_dependency_set_node_state(lua_State* L); int lua_dependency_get_node_userval(lua_State* L); int lua_dependency_set_node_userval(lua_State* L); int lua_dependency_get_node_name(lua_State* L); int lua_dependency_get_node(lua_State* L); int lua_dependency_index(lua_State* L);