#pragma once #include #include #include #include #include #include #include #include #include using function = std::string; struct group { std::set members; }; using group_ptr = std::unique_ptr; class function_graph { using group_id = size_t; struct group_data { std::set functions; std::set adjacency_list; size_t indegree; }; using data_ptr = std::shared_ptr; using edge = std::pair; using group_edge = std::pair; std::map> adjacency_lists; std::set edges; std::set compute_transitive_edges(); void create_groups( const std::set&, std::map&, std::map&); void create_edges( std::map&, std::map&); std::vector generate_order( std::map&, std::map&); public: std::set& add_function(const function& f); void add_edge(const function& from, const function& to); std::vector compute_order(); };