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