150 lines
4.2 KiB
C++
150 lines
4.2 KiB
C++
#pragma once
|
|
|
|
#include "global.h"
|
|
|
|
#include <QJsonObject>
|
|
|
|
#include <iostream>
|
|
#include <string>
|
|
|
|
|
|
inline PortIndex getNodeId(PortType portType, ConnectionId connectionId)
|
|
{
|
|
NodeId id = InvalidNodeId;
|
|
|
|
if (portType == PortType::Out) {
|
|
id = connectionId.outNodeId;
|
|
} else if (portType == PortType::In) {
|
|
id = connectionId.inNodeId;
|
|
}
|
|
|
|
return id;
|
|
}
|
|
|
|
inline PortIndex getPortIndex(PortType portType, ConnectionId connectionId)
|
|
{
|
|
PortIndex index = InvalidPortIndex;
|
|
|
|
if (portType == PortType::Out) {
|
|
index = connectionId.outPortIndex;
|
|
} else if (portType == PortType::In) {
|
|
index = connectionId.inPortIndex;
|
|
}
|
|
|
|
return index;
|
|
}
|
|
|
|
inline PortType oppositePort(PortType port)
|
|
{
|
|
PortType result = PortType::None;
|
|
|
|
switch (port) {
|
|
case PortType::In:
|
|
result = PortType::Out;
|
|
break;
|
|
|
|
case PortType::Out:
|
|
result = PortType::In;
|
|
break;
|
|
|
|
case PortType::None:
|
|
result = PortType::None;
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
return result;
|
|
}
|
|
|
|
inline bool isPortIndexValid(PortIndex index)
|
|
{
|
|
return index != InvalidPortIndex;
|
|
}
|
|
|
|
inline bool isPortTypeValid(PortType portType)
|
|
{
|
|
return portType != PortType::None;
|
|
}
|
|
|
|
/**
|
|
* Creates a connection Id instance filled just on one side.
|
|
*/
|
|
inline ConnectionId makeIncompleteConnectionId(NodeId const connectedNodeId,
|
|
PortType const connectedPort,
|
|
PortIndex const connectedPortIndex)
|
|
{
|
|
return (connectedPort == PortType::In)
|
|
? ConnectionId{InvalidNodeId, InvalidPortIndex, connectedNodeId, connectedPortIndex}
|
|
: ConnectionId{connectedNodeId, connectedPortIndex, InvalidNodeId, InvalidPortIndex};
|
|
}
|
|
|
|
/**
|
|
* Turns a full connection Id into an incomplete one by removing the
|
|
* data on the given side
|
|
*/
|
|
inline ConnectionId makeIncompleteConnectionId(ConnectionId connectionId,
|
|
PortType const portToDisconnect)
|
|
{
|
|
if (portToDisconnect == PortType::Out) {
|
|
connectionId.outNodeId = InvalidNodeId;
|
|
connectionId.outPortIndex = InvalidPortIndex;
|
|
} else {
|
|
connectionId.inNodeId = InvalidNodeId;
|
|
connectionId.inPortIndex = InvalidPortIndex;
|
|
}
|
|
|
|
return connectionId;
|
|
}
|
|
|
|
inline ConnectionId makeCompleteConnectionId(ConnectionId incompleteConnectionId,
|
|
NodeId const nodeId,
|
|
PortIndex const portIndex)
|
|
{
|
|
if (incompleteConnectionId.outNodeId == InvalidNodeId) {
|
|
incompleteConnectionId.outNodeId = nodeId;
|
|
incompleteConnectionId.outPortIndex = portIndex;
|
|
} else {
|
|
incompleteConnectionId.inNodeId = nodeId;
|
|
incompleteConnectionId.inPortIndex = portIndex;
|
|
}
|
|
|
|
return incompleteConnectionId;
|
|
}
|
|
|
|
inline std::ostream &operator<<(std::ostream &ostr, ConnectionId const connectionId)
|
|
{
|
|
ostr << "(" << connectionId.outNodeId << ", "
|
|
<< (isPortIndexValid(connectionId.outPortIndex) ? std::to_string(connectionId.outPortIndex)
|
|
: "INVALID")
|
|
<< ", " << connectionId.inNodeId << ", "
|
|
<< (isPortIndexValid(connectionId.inPortIndex) ? std::to_string(connectionId.inPortIndex)
|
|
: "INVALID")
|
|
<< ")" << std::endl;
|
|
|
|
return ostr;
|
|
}
|
|
|
|
inline QJsonObject toJson(ConnectionId const &connId)
|
|
{
|
|
QJsonObject connJson;
|
|
|
|
connJson["outNodeId"] = static_cast<qint64>(connId.outNodeId);
|
|
connJson["outPortIndex"] = static_cast<qint64>(connId.outPortIndex);
|
|
connJson["intNodeId"] = static_cast<qint64>(connId.inNodeId);
|
|
connJson["inPortIndex"] = static_cast<qint64>(connId.inPortIndex);
|
|
|
|
return connJson;
|
|
}
|
|
|
|
inline ConnectionId fromJson(QJsonObject const &connJson)
|
|
{
|
|
ConnectionId connId{static_cast<NodeId>(connJson["outNodeId"].toInt(InvalidNodeId)),
|
|
static_cast<PortIndex>(connJson["outPortIndex"].toInt(InvalidPortIndex)),
|
|
static_cast<NodeId>(connJson["intNodeId"].toInt(InvalidNodeId)),
|
|
static_cast<PortIndex>(connJson["inPortIndex"].toInt(InvalidPortIndex))};
|
|
|
|
return connId;
|
|
}
|
|
|