00001 #include "NodeData.h" 00002 #include <QJsonArray> 00003 #include <QJsonValue> 00004 #include <QHash> 00005 namespace Elve { 00006 Dependency::Dependency(const NodeID& id) : id(id),from(0), to(0) {} 00007 00008 Dependency::Dependency(const NodeID &id,Index from, Index to) : 00009 id(id), 00010 from(from), 00011 to(to) {} 00012 Dependency::Dependency(const QJsonArray& v) : 00013 id(v.at(0).toInt()), 00014 from(v.at(1).toInt()), 00015 to(v.at(2).toInt()) {} 00016 QJsonValue Dependency::json() const { 00017 QJsonArray a; 00018 a.append((int)id); 00019 a.append((int)from); 00020 a.append((int)to); 00021 return a; 00022 } 00023 00024 NodeData::NodeData(const NodeID& id, const NodeName &name, const Dependencies &dependencies, const NodeType& type, const NodeProperties& props, const Index& ioindex, int inputCount, int outputCount, const Names &inputNames, const Names &outputNames) 00025 : mId(id), 00026 mName(name), 00027 mDependencies(dependencies), 00028 mType(type), 00029 mProperties(props), 00030 mIOIndex(ioindex), 00031 mInputCount(inputCount), 00032 mOutputCount(outputCount), 00033 mInputNames(inputNames), 00034 mOutputNames(outputNames) 00035 { 00036 } 00037 00038 NodeData NodeData::asInput(const NodeID& newId, const Index& io) const { 00039 return NodeData(newId,mName,{},INPUT,mProperties,io,0,mOutputCount,{},mOutputNames); 00040 } 00041 00042 NodeData NodeData::asOutput(const NodeID& newId, const Index &io) const { 00043 return NodeData(newId,mName,mDependencies,OUTPUT,mProperties,io,mInputCount,0,mInputNames,{}); 00044 } 00045 00046 const NodeName& NodeData::name() const { 00047 return mName; 00048 } 00049 00050 NodeData::NodeData(const QJsonObject& obj) 00051 { 00052 static QHash<QString,NodeType> stringToType{{"node",NODE}, 00053 {"input",INPUT}, 00054 {"output",OUTPUT}, 00055 {"cluster",CLUSTER}}; 00056 00057 00058 mProperties = obj.value("properties").toObject(); 00059 mId = obj.value("id").toInt(-1); 00060 mName = obj.value("name").toString("unnamed").toStdString(); 00061 mType = stringToType.value(obj.value("type").toString("node")); 00062 mIOIndex = obj.value("io_index").toInt(0); 00063 QJsonArray arr = obj.value("dependencies").toArray(); 00064 for(const QJsonValue& j : arr) { 00065 mDependencies.push_back(j.toArray()); 00066 } 00067 QJsonArray inputs = obj.value("inputs").toArray(); 00068 for(const QJsonValue& j : inputs) { 00069 mInputNames.push_back(j.toString().toStdString()); 00070 } 00071 mInputCount = mInputNames.size(); 00072 QJsonArray outputs = obj.value("outputs").toArray(); 00073 for(const QJsonValue& j : outputs) { 00074 mOutputNames.push_back(j.toString().toStdString()); 00075 } 00076 mOutputCount = mOutputNames.size(); 00077 } 00078 00079 const QJsonObject NodeData::json() const { 00080 static std::unordered_map<int,QString> typeToString{{NODE,"node"}, 00081 {INPUT,"input"}, 00082 {OUTPUT,"output"}, 00083 {CLUSTER,"cluster"}}; 00084 QJsonObject obj; 00085 obj.insert("properties",properties()); 00086 obj.insert("id",(int)id()); 00087 obj.insert("name",QString::fromStdString(name())); 00088 obj.insert("type",typeToString.at(type())); 00089 obj.insert("io_index",(int)ioIndex()); 00090 00091 00092 QJsonArray array; 00093 for(const Dependency& dep : mDependencies) { 00094 array.append(dep.json()); 00095 } 00096 obj.insert("dependencies",array); 00097 00098 QJsonArray inputs; 00099 for(int i = 0; i < mInputCount; i++) { 00100 Name name = inputName(i); 00101 inputs.append(name.c_str()); 00102 } 00103 obj.insert("inputs",inputs); 00104 00105 QJsonArray outputs; 00106 for(int i = 0; i < mOutputCount; i++) { 00107 Name name = outputName(i); 00108 outputs.append(name.c_str()); 00109 } 00110 obj.insert("outputs",outputs); 00111 00112 return obj; 00113 } 00114 00115 int NodeData::inputCount() const { 00116 return mInputCount; 00117 } 00118 00119 int NodeData::outputCount() const { 00120 return mOutputCount; 00121 } 00122 00123 inline Name base26(int i) { 00124 static Name alph = "abcdefghijklmnopqrstuvwxyz"; 00125 Name n = i==0 ? "a" : ""; 00126 while(i != 0) { 00127 n += alph.at(i%26); 00128 i/=26; 00129 } 00130 return n; 00131 } 00132 00133 Name NodeData::inputName(const Index& i) const { 00134 if(mInputNames.size() > i) { 00135 return mInputNames.at(i); 00136 } 00137 return base26(i); 00138 } 00139 00140 Name NodeData::outputName(const Index& i) const { 00141 if(mOutputNames.size() > i) { 00142 return mOutputNames.at(i); 00143 } 00144 return base26(i); 00145 } 00146 00147 00148 NodeProperties &NodeData::properties() { 00149 return mProperties; 00150 } 00151 00152 const NodeProperties &NodeData::properties() const { 00153 return mProperties; 00154 } 00155 00156 const NodeID& NodeData::id() const { 00157 return mId; 00158 } 00159 00160 const Dependencies& NodeData::dependencies() const { 00161 return mDependencies; 00162 } 00163 00164 const NodeType& NodeData::type() const { 00165 return mType; 00166 } 00167 00168 const Index& NodeData::ioIndex() const { 00169 return mIOIndex; 00170 } 00171 }