data: Added type bitmasking to Node and Edge and check type on Edge creation

This commit is contained in:
Eberhard Graether
2014-07-31 15:07:18 +02:00
parent af9b75348c
commit b110d528dc
6 changed files with 153 additions and 33 deletions
+86 -2
View File
@@ -14,6 +14,8 @@ Edge::Edge(EdgeType type, Node* from, Node* to)
{
m_from->addEdge(this);
m_to->addEdge(this);
checkType();
}
Edge::Edge(const Edge& other, Node* from, Node* to)
@@ -30,6 +32,8 @@ Edge::Edge(const Edge& other, Node* from, Node* to)
{
LOG_ERROR("Nodes are not plain copies.");
}
checkType();
}
Edge::~Edge()
@@ -43,6 +47,11 @@ Edge::EdgeType Edge::getType() const
return m_type;
}
bool Edge::isType(EdgeTypeMask mask) const
{
return (m_type & mask) > 0;
}
Node* Edge::getFrom() const
{
return m_from;
@@ -102,9 +111,9 @@ void Edge::addComponentDataType(std::shared_ptr<TokenComponentDataType> componen
}
}
std::string Edge::getTypeString() const
std::string Edge::getTypeString(EdgeType type) const
{
switch (m_type)
switch (type)
{
case EDGE_MEMBER:
return "child";
@@ -128,6 +137,11 @@ std::string Edge::getTypeString() const
return "";
}
std::string Edge::getTypeString() const
{
return getTypeString(m_type);
}
std::string Edge::getAsString() const
{
std::stringstream str;
@@ -147,3 +161,73 @@ std::ostream& operator<<(std::ostream& ostream, const Edge& edge)
ostream << edge.getAsString();
return ostream;
}
bool Edge::checkType() const
{
Node::NodeTypeMask typeMask = Node::NODE_UNDEFINED | Node::NODE_CLASS | Node::NODE_STRUCT | Node::NODE_ENUM | Node::NODE_TYPEDEF;
Node::NodeTypeMask variableMask = Node::NODE_UNDEFINED | Node::NODE_GLOBAL_VARIABLE | Node::NODE_FIELD;
Node::NodeTypeMask functionMask = Node::NODE_UNDEFINED_FUNCTION | Node::NODE_FUNCTION | Node::NODE_METHOD;
switch (m_type)
{
case EDGE_MEMBER:
if (!m_from->isType(Node::NODE_UNDEFINED | Node::NODE_CLASS | Node::NODE_STRUCT | Node::NODE_NAMESPACE | Node::NODE_ENUM) ||
(m_to->isType(Node::NODE_NAMESPACE) && !m_from->isType(Node::NODE_UNDEFINED | Node::NODE_NAMESPACE)) ||
(m_from->isType(Node::NODE_ENUM) && !m_to->isType(Node::NODE_FIELD)))
{
break;
}
return true;
case EDGE_TYPE_OF:
if (!m_from->isType(variableMask) || !m_to->isType(typeMask))
{
break;
}
return true;
case EDGE_RETURN_TYPE_OF:
case EDGE_PARAMETER_TYPE_OF:
case EDGE_TYPE_USAGE:
if (!m_from->isType(functionMask) || !m_to->isType(typeMask))
{
break;
}
return true;
case EDGE_INHERITANCE:
if (!m_from->isType(Node::NODE_CLASS) || !m_to->isType(Node::NODE_UNDEFINED | Node::NODE_CLASS))
{
break;
}
return true;
case EDGE_CALL:
if (!m_from->isType(variableMask | functionMask) || !m_to->isType(functionMask))
{
break;
}
return true;
case EDGE_USAGE:
if (!m_from->isType(functionMask) || !m_to->isType(variableMask))
{
break;
}
return true;
case EDGE_TYPEDEF_OF:
if (!m_from->isType(Node::NODE_TYPEDEF) || !m_to->isType(typeMask))
{
break;
}
return true;
}
LOG_ERROR_STREAM(
<< "Edge " << getTypeString()
<< " can't go from Node " << m_from->getTypeString()
<< " to Node " << m_to->getTypeString()
);
return false;
}