00001 #ifndef NODEDATA_H 00002 #define NODEDATA_H 00003 00004 #include <string> 00005 #include <unordered_set> 00006 #include <vector> 00007 #include <unordered_map> 00008 #include <memory> 00009 #include <QJsonObject> 00010 #include <QJsonArray> 00011 00012 namespace Elve { 00013 00021 typedef unsigned NodeID; 00022 typedef std::string Name; 00023 typedef std::vector<std::string> Names; 00024 00028 typedef Name NodeName; 00029 00033 typedef int Index; 00034 00038 typedef std::vector<NodeID> NodeIDs; 00039 00043 typedef Names NodeNames; 00044 00048 typedef std::unordered_set<NodeID> NodeIDSet; 00049 00053 typedef QJsonObject NodeProperties; 00054 00063 struct Dependency { 00064 Dependency(const NodeID& id); 00065 Dependency(const NodeID &id,Index from, Index to); 00066 Dependency(const QJsonArray& v); 00067 QJsonValue json() const; 00068 NodeID id; 00069 Index from; 00070 Index to; 00071 }; 00072 00076 typedef std::vector<Dependency> Dependencies; 00077 00081 enum NodeType{ 00082 NODE, 00083 INPUT, 00084 OUTPUT, 00085 CLUSTER, 00086 INPUT_CLUSTER, 00087 OUTPUT_CLUSTER, 00088 LAST 00089 }; 00090 00091 class Node; 00092 class NodeData 00093 { 00094 friend class Node; 00095 public: 00096 NodeData(const NodeID& id = -1, const NodeName& name = "unnamed",const Dependencies& dependencies = {}, 00097 const NodeType& type = NODE, const NodeProperties& props = {}, const Index& ioindex = 0, 00098 int inputCount = 2, int outputCount = 1, const Names& inputNames = {}, const Names& outputNames = {}); 00099 00100 NodeData(const QJsonObject& obj); 00101 const NodeProperties& properties() const; 00102 NodeProperties& properties(); 00103 const NodeID& id() const; 00104 const Dependencies &dependencies() const; 00105 const NodeType& type() const; 00106 const Index& ioIndex() const; 00107 const QJsonObject json() const; 00108 const NodeName& name() const; 00109 int inputCount() const; 00110 int outputCount() const; 00111 Name inputName(const Index& i) const; 00112 Name outputName(const Index& i) const; 00113 NodeData asInput(const NodeID& newId, const Index &io) const ; 00114 NodeData asOutput(const NodeID& newID, const Index& io) const; 00115 private: 00116 NodeProperties mProperties; 00117 NodeID mId; 00118 NodeName mName; 00119 Names mInputNames; 00120 Names mOutputNames; 00121 size_t mInputCount; 00122 size_t mOutputCount; 00123 Dependencies mDependencies; 00124 NodeType mType; 00125 Index mIOIndex; 00126 }; 00127 00128 typedef std::vector<NodeData> NodeDatas; 00129 typedef std::unordered_map<NodeID,NodeData> SparseData; 00130 00131 } 00132 00133 #endif // NODEDATA_H