00001 #ifndef GRAPH_H 00002 #define GRAPH_H 00003 00004 #include "Node.h" 00005 #include <unordered_map> 00006 #include <vector> 00007 #include <set> 00008 00009 #include "GraphData.h" 00010 00011 namespace Elve { 00012 00013 typedef std::vector<Node*> NodePtrs; 00014 typedef std::unordered_map<NodeID,Node> NodesByID; 00015 00019 struct Pin{ 00020 Pin(const NodeID& id); 00021 Pin(const NodeID &id,const Index& index); 00022 NodeID id; 00023 Index index; 00024 }; 00025 00026 bool operator==(const Pin& a,const Pin& b); 00027 00028 struct Pin_hash { 00029 std::size_t operator () (const Pin& p) const { 00030 return p.id; 00031 } 00032 }; 00033 00034 typedef std::unordered_map<Pin,Pin,Pin_hash> AliasesMap; 00035 00036 struct Aliases { 00037 AliasesMap inputs; 00038 AliasesMap outputs; 00039 void reserve(size_t size); 00040 size_t size() const; 00041 }; 00042 00043 typedef std::pair<NodeID,NodeID> Edge; 00044 typedef std::vector<Edge> AdjacencyList; 00045 00064 class Graph : public std::enable_shared_from_this<Graph> 00065 { 00066 public: 00071 Graph(const SharedData& data); 00072 00080 Graph(const SharedData& data, const SparseData &extraData, const Aliases& aliases, const NodeIDSet &excluded = {}); 00081 00086 const NodesByID& nodes() const; 00087 00096 const Pin inputAlias(const Pin& id) const; 00097 00106 const Pin outputAlias(const Pin& id) const; 00107 00112 size_t nodeCount() const; 00113 00119 SharedGraph clusterize(size_t level); 00120 00128 SharedGraph group(const NodeIDSet& toGroup, const NodeID &i, const NodeName &groupName); 00129 00135 SharedGraph ungroup(const NodeID& cluster); 00136 00146 SharedGraph fastGroup(const std::vector<NodeIDSet>& groups, const NodeName& basename); 00147 00153 NodeName uniqueName(const NodeName &base) const; 00154 00159 NodeLevel highestLevel() const; 00160 00165 size_t inputCount() const; 00166 00171 size_t outputCount() const; 00172 00177 size_t maxInputIndex() const; 00178 00183 size_t maxOutputIndex() const; 00184 00189 NodeID newID() const; 00190 00195 const SharedData & datas() const; 00196 00201 const SparseData& extraData() const; 00202 00207 const Aliases& aliases() const; 00208 00213 const NodeIDSet excluded() const; 00214 00220 const NodeData& data(const NodeID& id) const; 00221 00227 const Node& node(const NodeID& id) const; 00228 00233 const NodePtrs& inputs(); 00234 00239 const NodePtrs& outputs(); 00240 00245 QJsonObject json() const; 00246 00252 static SharedGraph fromJson(const QJsonObject &obj); 00253 00258 const QString &filename() const; 00259 private: 00260 Node* addNode(const NodeData &d); 00261 void addEdge(const NodeID& from, Index fi, const NodeID& to, Index ti); 00262 Aliases aliasesWithout(const NodeID& repl) const; 00263 NodeIDSet excludedWithout(const Dependencies &ids) const; 00264 NodePtrs mInputs; 00265 NodePtrs mOutputs; 00266 NodesByID mNodes; 00267 Aliases mAliases; 00268 SharedData mData; 00269 SparseData mExtraData; 00270 NodeIDSet mExcluded; 00271 mutable NodeID mLastId; 00272 }; 00273 00274 } 00275 #endif // GRAPH_H