116 lines
4.3 KiB
C++
116 lines
4.3 KiB
C++
#pragma once
|
|
#include "data_type.h"
|
|
#include <QString>
|
|
#include <memory>
|
|
#include <QHash>
|
|
|
|
namespace dags {
|
|
/// <summary>
|
|
/// 节点分层辅助数据
|
|
/// </summary>
|
|
class DAGLayerHelper {
|
|
private:
|
|
graph_data::Node bind_node;
|
|
int input_count = 0;
|
|
QList<std::shared_ptr<DAGLayerHelper>> next_points;
|
|
int layer_v = 0;
|
|
|
|
public:
|
|
explicit DAGLayerHelper(const graph_data::Node& bind);
|
|
|
|
graph_data::Node bindPoint() const;
|
|
int& inputCount();
|
|
int layerValue() const;
|
|
void setLayerValue(int v);
|
|
void nextAppend(std::shared_ptr<DAGLayerHelper> inst);
|
|
QList<std::shared_ptr<DAGLayerHelper>> nextNodes() const;
|
|
};
|
|
|
|
/// <summary>
|
|
/// 节点排序辅助节点
|
|
/// </summary>
|
|
class DAGOrderHelper {
|
|
private:
|
|
std::shared_ptr<DAGLayerHelper> layer_bind = nullptr;
|
|
std::shared_ptr<DAGLayerHelper> relate_bind = nullptr;
|
|
std::shared_ptr<DAGLayerHelper> towards_to = nullptr;
|
|
int layer_number = 0;
|
|
QVariant sort_number;
|
|
QList<std::shared_ptr<DAGOrderHelper>> __prev_layer_nodes;
|
|
|
|
public:
|
|
/// <summary>
|
|
/// 构建一个可视图形节点
|
|
/// </summary>
|
|
/// <param name="bind">图形节点</param>
|
|
DAGOrderHelper(std::shared_ptr<DAGLayerHelper> bind);
|
|
/// <summary>
|
|
/// 构建一个辅助的不可视图形节点
|
|
/// </summary>
|
|
/// <param name="f">起始节点</param>
|
|
/// <param name="t">终止节点</param>
|
|
DAGOrderHelper(std::shared_ptr<DAGLayerHelper> f, std::shared_ptr<DAGLayerHelper> t);
|
|
|
|
bool isFakeNode() const;
|
|
|
|
std::shared_ptr<DAGLayerHelper> layerNode() const;
|
|
std::shared_ptr<DAGLayerHelper> tailsNode() const;
|
|
std::shared_ptr<DAGLayerHelper> headsNode() const;
|
|
|
|
int layerNumber() const;
|
|
void setLayerNumber(int v);
|
|
|
|
QVariant sortNumber() const;
|
|
void setSortNumber(double v);
|
|
|
|
QList<std::shared_ptr<DAGOrderHelper>> getUpstreamNodes() const;
|
|
|
|
void appendUpstreamNode(std::shared_ptr<DAGOrderHelper> inst);
|
|
};
|
|
|
|
class DAGGraph {
|
|
private:
|
|
QHash<QString, std::shared_ptr<DAGLayerHelper>> graph_inst;
|
|
QList<std::shared_ptr<DAGOrderHelper>> node_with_layout;
|
|
int max_layer_count = 0;
|
|
|
|
public:
|
|
void rebuildFromEdges(const QList<graph_data::Arrow>& arrow_list);
|
|
void primitiveGraphLayout();
|
|
void forwardsLayoutImpls();
|
|
void backwardsLayoutImpls();
|
|
void adjustLayoutImpls();
|
|
|
|
QList<std::shared_ptr<DAGOrderHelper>> nodeWithLayout() const;
|
|
int maxLayerCount() const;
|
|
|
|
private:
|
|
std::shared_ptr<DAGLayerHelper> spawns_peak(QList<std::shared_ptr<DAGLayerHelper>>& ref_set);
|
|
void graph_recovery(const QList<std::shared_ptr<DAGLayerHelper>> &sort_seqs);
|
|
int node_layering(const std::shared_ptr<DAGLayerHelper> &inst, int layer_current);
|
|
int node_layering_adj(std::shared_ptr<DAGLayerHelper> inst);
|
|
QList<std::shared_ptr<DAGOrderHelper>> tidy_graph_nodes();
|
|
|
|
void graph_layout_layers_forward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
void nodes_sort_forward_within_layer(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>> &nodes);
|
|
|
|
void graph_adjust_layers_backward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
QList<std::shared_ptr<DAGOrderHelper>> layer_adjust_via_next_sibling(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
void node_adjust_via_next_sibling(std::shared_ptr<DAGOrderHelper> curr_node, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
|
|
bool current_nodelist_filling_indi(const QList<std::shared_ptr<DAGOrderHelper>>& ordered_nodes);
|
|
void nodes_sort_with_above(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
void nodes_sort_with_belows(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
|
|
void node_adjust_ingraph_forward(const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
bool nodes_revise_forward_within_layer(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& nodes);
|
|
bool node_adjust_inlayer_partition_indi(int layer_index, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
|
|
|
|
//bool node_adjust_inlayer_forward(int curr_layer, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
//std::pair<qlonglong, qlonglong> node_evaluate_with_downstream(std::shared_ptr<DAGOrderHelper> node, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
//std::pair<qlonglong, qlonglong> node_evaluate_with_upstream(std::shared_ptr<DAGOrderHelper> node, const QList<std::shared_ptr<DAGOrderHelper>>& total_nodes);
|
|
|
|
};
|
|
}
|