ELVE  1
ELVE Logic Visualization Explorer
/home/travis/build/stdgregwar/elve/Core/Graph.h
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
 All Classes Functions