diff options
author | Aleks Kissinger <aleks0@gmail.com> | 2017-12-22 16:19:28 +0000 |
---|---|---|
committer | Aleks Kissinger <aleks0@gmail.com> | 2017-12-22 16:19:28 +0000 |
commit | fcc0fc080370c0c8e97a0c07043b83240d973cab (patch) | |
tree | 21493478f225955a75c9f7aa207db3a86a9db2cd /tikzit/src/data | |
parent | d8db367f6a4e49776834c82b092700dbda56cecc (diff) |
graphs no longer allocate edges and nodes (but they do still own them)
Diffstat (limited to 'tikzit/src/data')
-rw-r--r-- | tikzit/src/data/graph.cpp | 15 | ||||
-rw-r--r-- | tikzit/src/data/graph.h | 4 | ||||
-rw-r--r-- | tikzit/src/data/tikzparser.parser.cpp | 32 | ||||
-rw-r--r-- | tikzit/src/data/tikzparser.y | 8 |
4 files changed, 35 insertions, 24 deletions
diff --git a/tikzit/src/data/graph.cpp b/tikzit/src/data/graph.cpp index de3eb08..4329928 100644 --- a/tikzit/src/data/graph.cpp +++ b/tikzit/src/data/graph.cpp @@ -20,17 +20,19 @@ void Graph::removeNode(Node *n) { outEdges.remove(n); } -Edge *Graph::addEdge(Node *s, Node *t) +Edge *Graph::addEdge(Edge *e) { - Edge *e = new Edge(s, t, this); + e->setParent(this); _edges << e; - outEdges.insert(s, e); - inEdges.insert(t, e); + outEdges.insert(e->source(), e); + inEdges.insert(e->target(), e); return e; } void Graph::removeEdge(Edge *e) { + // the edge itself is not deleted, as it may still be referenced in an undo command. It will + // be deleted when graph is, via QObject memory management. _edges.removeAll(e); outEdges.remove(e->source(), e); inEdges.remove(e->target(), e); @@ -151,8 +153,9 @@ void Graph::setBbox(const QRectF &bbox) _bbox = bbox; } -Node *Graph::addNode() { - Node *n = new Node(this); +// add a node. The graph claims ownership. +Node *Graph::addNode(Node *n) { + n->setParent(this); _nodes << n; return n; } diff --git a/tikzit/src/data/graph.h b/tikzit/src/data/graph.h index 3f4e8d3..963def8 100644 --- a/tikzit/src/data/graph.h +++ b/tikzit/src/data/graph.h @@ -21,9 +21,9 @@ class Graph : public QObject public: explicit Graph(QObject *parent = 0); ~Graph(); - Node *addNode(); + Node *addNode(Node *n); void removeNode(Node *n); - Edge *addEdge(Node *s, Node*t); + Edge *addEdge(Edge *e); void removeEdge(Edge *e); GraphElementData *data() const; diff --git a/tikzit/src/data/tikzparser.parser.cpp b/tikzit/src/data/tikzparser.parser.cpp index 3dadb45..7d77d0c 100644 --- a/tikzit/src/data/tikzparser.parser.cpp +++ b/tikzit/src/data/tikzparser.parser.cpp @@ -531,8 +531,8 @@ static const yytype_uint8 yyrline[] = { 0, 124, 124, 130, 130, 131, 131, 131, 131, 133, 133, 136, 138, 140, 141, 148, 154, 156, 163, 169, - 169, 171, 172, 190, 190, 191, 198, 199, 201, 202, - 210, 246, 246, 247, 247, 248, 250 + 169, 171, 172, 192, 192, 193, 200, 201, 203, 204, + 212, 250, 250, 251, 251, 252, 254 }; #endif @@ -1600,7 +1600,8 @@ yyreduce: case 22: #line 173 "../tikzit/src/data/tikzparser.y" { - Node *node = assembler->graph()->addNode(); + Node *node = new Node(); + if ((yyvsp[(2) - (7)].data)) { node->setData((yyvsp[(2) - (7)].data)); } @@ -1613,22 +1614,23 @@ yyreduce: node->setPoint(*(yyvsp[(5) - (7)].pt)); delete (yyvsp[(5) - (7)].pt); + assembler->graph()->addNode(node); assembler->addNodeToMap(node); ;} break; case 23: -#line 190 "../tikzit/src/data/tikzparser.y" +#line 192 "../tikzit/src/data/tikzparser.y" { (yyval.str) = 0; ;} break; case 24: -#line 190 "../tikzit/src/data/tikzparser.y" +#line 192 "../tikzit/src/data/tikzparser.y" { (yyval.str) = (yyvsp[(2) - (2)].str); ;} break; case 25: -#line 192 "../tikzit/src/data/tikzparser.y" +#line 194 "../tikzit/src/data/tikzparser.y" { (yyval.noderef).node = assembler->nodeWithName(QString((yyvsp[(2) - (4)].str))); free((yyvsp[(2) - (4)].str)); @@ -1637,22 +1639,22 @@ yyreduce: break; case 26: -#line 198 "../tikzit/src/data/tikzparser.y" +#line 200 "../tikzit/src/data/tikzparser.y" { (yyval.noderef) = (yyvsp[(1) - (1)].noderef); ;} break; case 27: -#line 199 "../tikzit/src/data/tikzparser.y" +#line 201 "../tikzit/src/data/tikzparser.y" { (yyval.noderef).node = 0; (yyval.noderef).anchor = 0; ;} break; case 28: -#line 201 "../tikzit/src/data/tikzparser.y" +#line 203 "../tikzit/src/data/tikzparser.y" { (yyval.node) = 0; ;} break; case 29: -#line 203 "../tikzit/src/data/tikzparser.y" +#line 205 "../tikzit/src/data/tikzparser.y" { (yyval.node) = new Node(); if ((yyvsp[(2) - (3)].data)) @@ -1663,7 +1665,7 @@ yyreduce: break; case 30: -#line 211 "../tikzit/src/data/tikzparser.y" +#line 213 "../tikzit/src/data/tikzparser.y" { Node *s; Node *t; @@ -1676,7 +1678,7 @@ yyreduce: t = s; } - Edge *edge = assembler->graph()->addEdge(s, t); + Edge *edge = new Edge(s, t); if ((yyvsp[(2) - (7)].data)) { edge->setData((yyvsp[(2) - (7)].data)); edge->setAttributesFromData(); @@ -1697,11 +1699,13 @@ yyreduce: } else { edge->setTargetAnchor(edge->sourceAnchor()); } + + assembler->graph()->addEdge(edge); ;} break; case 36: -#line 251 "../tikzit/src/data/tikzparser.y" +#line 255 "../tikzit/src/data/tikzparser.y" { assembler->graph()->setBbox(QRectF(*(yyvsp[(3) - (6)].pt), *(yyvsp[(5) - (6)].pt))); delete (yyvsp[(3) - (6)].pt); @@ -1711,7 +1715,7 @@ yyreduce: /* Line 1267 of yacc.c. */ -#line 1715 "../tikzit/src/data/tikzparser.parser.cpp" +#line 1719 "../tikzit/src/data/tikzparser.parser.cpp" default: break; } YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); diff --git a/tikzit/src/data/tikzparser.y b/tikzit/src/data/tikzparser.y index eaf09eb..420b8a0 100644 --- a/tikzit/src/data/tikzparser.y +++ b/tikzit/src/data/tikzparser.y @@ -171,7 +171,8 @@ val: PROPSTRING { $$ = $1; } | DELIMITEDSTRING { $$ = $1; }; nodename: "(" REFSTRING ")" { $$ = $2; }; node: "\\node" optproperties nodename "at" COORD DELIMITEDSTRING ";" { - Node *node = assembler->graph()->addNode(); + Node *node = new Node(); + if ($2) { node->setData($2); } @@ -184,6 +185,7 @@ node: "\\node" optproperties nodename "at" COORD DELIMITEDSTRING ";" node->setPoint(*$5); delete $5; + assembler->graph()->addNode(node); assembler->addNodeToMap(node); }; @@ -220,7 +222,7 @@ edge: "\\draw" optproperties noderef "to" optedgenode optnoderef ";" t = s; } - Edge *edge = assembler->graph()->addEdge(s, t); + Edge *edge = new Edge(s, t); if ($2) { edge->setData($2); edge->setAttributesFromData(); @@ -241,6 +243,8 @@ edge: "\\draw" optproperties noderef "to" optedgenode optnoderef ";" } else { edge->setTargetAnchor(edge->sourceAnchor()); } + + assembler->graph()->addEdge(edge); }; ignoreprop: val | val "=" val; |