Changeset 2386:81b47fc5c444 in lemon-0.x for lemon/list_graph.h
- Timestamp:
- 03/02/07 19:04:28 (17 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@3217
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/list_graph.h
r2381 r2386 523 523 } 524 524 virtual void erase(const std::vector<Node>& nodes) { 525 for (int i = 0; i < (int)nodes.size(); ++i) {525 for (int i = 0; i < int(nodes.size()); ++i) { 526 526 snapshot.eraseNode(nodes[i]); 527 527 } 528 528 } 529 529 virtual void build() { 530 NodeNotifier* _notifier = notifier();531 530 Node node; 532 531 std::vector<Node> nodes; 533 for ( _notifier->first(node); node != INVALID;534 _notifier->next(node)) {532 for (notifier()->first(node); node != INVALID; 533 notifier()->next(node)) { 535 534 nodes.push_back(node); 536 535 } … … 540 539 } 541 540 virtual void clear() { 542 NodeNotifier* _notifier = notifier();543 541 Node node; 544 for ( _notifier->first(node); node != INVALID;545 _notifier->next(node)) {542 for (notifier()->first(node); node != INVALID; 543 notifier()->next(node)) { 546 544 snapshot.eraseNode(node); 547 545 } … … 575 573 } 576 574 virtual void erase(const std::vector<Edge>& edges) { 577 for (int i = 0; i < (int)edges.size(); ++i) {575 for (int i = 0; i < int(edges.size()); ++i) { 578 576 snapshot.eraseEdge(edges[i]); 579 577 } 580 578 } 581 579 virtual void build() { 582 EdgeNotifier* _notifier = notifier();583 580 Edge edge; 584 581 std::vector<Edge> edges; 585 for ( _notifier->first(edge); edge != INVALID;586 _notifier->next(edge)) {582 for (notifier()->first(edge); edge != INVALID; 583 notifier()->next(edge)) { 587 584 edges.push_back(edge); 588 585 } … … 592 589 } 593 590 virtual void clear() { 594 EdgeNotifier* _notifier = notifier();595 591 Edge edge; 596 for (_notifier->first(edge); edge != INVALID; _notifier->next(edge)) { 592 for (notifier()->first(edge); edge != INVALID; 593 notifier()->next(edge)) { 597 594 snapshot.eraseEdge(edge); 598 595 } … … 1270 1267 } 1271 1268 virtual void erase(const std::vector<Node>& nodes) { 1272 for (int i = 0; i < (int)nodes.size(); ++i) {1269 for (int i = 0; i < int(nodes.size()); ++i) { 1273 1270 snapshot.eraseNode(nodes[i]); 1274 1271 } 1275 1272 } 1276 1273 virtual void build() { 1277 NodeNotifier* _notifier = notifier();1278 1274 Node node; 1279 1275 std::vector<Node> nodes; 1280 for ( _notifier->first(node); node != INVALID;1281 _notifier->next(node)) {1276 for (notifier()->first(node); node != INVALID; 1277 notifier()->next(node)) { 1282 1278 nodes.push_back(node); 1283 1279 } … … 1287 1283 } 1288 1284 virtual void clear() { 1289 NodeNotifier* _notifier = notifier();1290 1285 Node node; 1291 for ( _notifier->first(node); node != INVALID;1292 _notifier->next(node)) {1286 for (notifier()->first(node); node != INVALID; 1287 notifier()->next(node)) { 1293 1288 snapshot.eraseNode(node); 1294 1289 } … … 1322 1317 } 1323 1318 virtual void erase(const std::vector<UEdge>& edges) { 1324 for (int i = 0; i < (int)edges.size(); ++i) {1319 for (int i = 0; i < int(edges.size()); ++i) { 1325 1320 snapshot.eraseUEdge(edges[i]); 1326 1321 } 1327 1322 } 1328 1323 virtual void build() { 1329 UEdgeNotifier* _notifier = notifier();1330 1324 UEdge edge; 1331 1325 std::vector<UEdge> edges; 1332 for ( _notifier->first(edge); edge != INVALID;1333 _notifier->next(edge)) {1326 for (notifier()->first(edge); edge != INVALID; 1327 notifier()->next(edge)) { 1334 1328 edges.push_back(edge); 1335 1329 } … … 1339 1333 } 1340 1334 virtual void clear() { 1341 UEdgeNotifier* _notifier = notifier();1342 1335 UEdge edge; 1343 for ( _notifier->first(edge); edge != INVALID;1344 _notifier->next(edge)) {1336 for (notifier()->first(edge); edge != INVALID; 1337 notifier()->next(edge)) { 1345 1338 snapshot.eraseUEdge(edge); 1346 1339 } … … 1576 1569 1577 1570 void first(UEdge& edge) const { 1578 int a NodeId = first_anode;1579 while (a NodeId != -1 && aNodes[aNodeId].first_edge == -1) {1580 a NodeId = aNodes[aNodeId].next != -1 ?1581 aNodes[a NodeId].next >> 1 : -1;1582 } 1583 if (a NodeId != -1) {1584 edge.id = aNodes[a NodeId].first_edge;1571 int aid = first_anode; 1572 while (aid != -1 && aNodes[aid].first_edge == -1) { 1573 aid = aNodes[aid].next != -1 ? 1574 aNodes[aid].next >> 1 : -1; 1575 } 1576 if (aid != -1) { 1577 edge.id = aNodes[aid].first_edge; 1585 1578 } else { 1586 1579 edge.id = -1; … … 1588 1581 } 1589 1582 void next(UEdge& edge) const { 1590 int a NodeId = edges[edge.id].aNode >> 1;1583 int aid = edges[edge.id].aNode >> 1; 1591 1584 edge.id = edges[edge.id].next_out; 1592 1585 if (edge.id == -1) { 1593 a NodeId = aNodes[aNodeId].next != -1 ?1594 aNodes[a NodeId].next >> 1 : -1;1595 while (a NodeId != -1 && aNodes[aNodeId].first_edge == -1) {1596 a NodeId = aNodes[aNodeId].next != -1 ?1597 aNodes[a NodeId].next >> 1 : -1;1598 } 1599 if (a NodeId != -1) {1600 edge.id = aNodes[a NodeId].first_edge;1586 aid = aNodes[aid].next != -1 ? 1587 aNodes[aid].next >> 1 : -1; 1588 while (aid != -1 && aNodes[aid].first_edge == -1) { 1589 aid = aNodes[aid].next != -1 ? 1590 aNodes[aid].next >> 1 : -1; 1591 } 1592 if (aid != -1) { 1593 edge.id = aNodes[aid].first_edge; 1601 1594 } else { 1602 1595 edge.id = -1; … … 1678 1671 1679 1672 Node addANode() { 1680 int a NodeId;1673 int aid; 1681 1674 if (first_free_anode == -1) { 1682 a NodeId = aNodes.size();1675 aid = aNodes.size(); 1683 1676 aNodes.push_back(NodeT()); 1684 1677 } else { 1685 a NodeId = first_free_anode;1678 aid = first_free_anode; 1686 1679 first_free_anode = aNodes[first_free_anode].next; 1687 1680 } 1688 1681 if (first_anode != -1) { 1689 aNodes[a NodeId].next = first_anode << 1;1690 aNodes[first_anode].prev = a NodeId << 1;1691 } else { 1692 aNodes[a NodeId].next = -1;1693 } 1694 aNodes[a NodeId].prev = -1;1695 first_anode = a NodeId;1696 aNodes[a NodeId].first_edge = -1;1697 return Node(a NodeId << 1);1682 aNodes[aid].next = first_anode << 1; 1683 aNodes[first_anode].prev = aid << 1; 1684 } else { 1685 aNodes[aid].next = -1; 1686 } 1687 aNodes[aid].prev = -1; 1688 first_anode = aid; 1689 aNodes[aid].first_edge = -1; 1690 return Node(aid << 1); 1698 1691 } 1699 1692 1700 1693 Node addBNode() { 1701 int b NodeId;1694 int bid; 1702 1695 if (first_free_bnode == -1) { 1703 b NodeId = bNodes.size();1696 bid = bNodes.size(); 1704 1697 bNodes.push_back(NodeT()); 1705 1698 } else { 1706 b NodeId = first_free_bnode;1699 bid = first_free_bnode; 1707 1700 first_free_bnode = bNodes[first_free_bnode].next; 1708 1701 } 1709 1702 if (first_bnode != -1) { 1710 bNodes[b NodeId].next = (first_bnode << 1) + 1;1711 bNodes[first_bnode].prev = (b NodeId << 1) + 1;1712 } else { 1713 bNodes[b NodeId].next = -1;1714 } 1715 bNodes[b NodeId].prev = -1;1716 first_bnode = b NodeId;1717 bNodes[b NodeId].first_edge = -1;1718 return Node((b NodeId << 1) + 1);1703 bNodes[bid].next = (first_bnode << 1) + 1; 1704 bNodes[first_bnode].prev = (bid << 1) + 1; 1705 } else { 1706 bNodes[bid].next = -1; 1707 } 1708 bNodes[bid].prev = -1; 1709 first_bnode = bid; 1710 bNodes[bid].first_edge = -1; 1711 return Node((bid << 1) + 1); 1719 1712 } 1720 1713 … … 1753 1746 void erase(const Node& node) { 1754 1747 if (aNode(node)) { 1755 int a NodeId = node.id >> 1;1756 if (aNodes[a NodeId].prev != -1) {1757 aNodes[aNodes[a NodeId].prev >> 1].next = aNodes[aNodeId].next;1748 int aid = node.id >> 1; 1749 if (aNodes[aid].prev != -1) { 1750 aNodes[aNodes[aid].prev >> 1].next = aNodes[aid].next; 1758 1751 } else { 1759 1752 first_anode = 1760 aNodes[a NodeId].next != -1 ? aNodes[aNodeId].next >> 1 : -1;1761 } 1762 if (aNodes[a NodeId].next != -1) {1763 aNodes[aNodes[a NodeId].next >> 1].prev = aNodes[aNodeId].prev;1764 } 1765 aNodes[a NodeId].next = first_free_anode;1766 first_free_anode = a NodeId;1767 } else { 1768 int b NodeId = node.id >> 1;1769 if (bNodes[b NodeId].prev != -1) {1770 bNodes[bNodes[b NodeId].prev >> 1].next = bNodes[bNodeId].next;1753 aNodes[aid].next != -1 ? aNodes[aid].next >> 1 : -1; 1754 } 1755 if (aNodes[aid].next != -1) { 1756 aNodes[aNodes[aid].next >> 1].prev = aNodes[aid].prev; 1757 } 1758 aNodes[aid].next = first_free_anode; 1759 first_free_anode = aid; 1760 } else { 1761 int bid = node.id >> 1; 1762 if (bNodes[bid].prev != -1) { 1763 bNodes[bNodes[bid].prev >> 1].next = bNodes[bid].next; 1771 1764 } else { 1772 1765 first_bnode = 1773 bNodes[b NodeId].next != -1 ? bNodes[bNodeId].next >> 1 : -1;1774 } 1775 if (bNodes[b NodeId].next != -1) {1776 bNodes[bNodes[b NodeId].next >> 1].prev = bNodes[bNodeId].prev;1777 } 1778 bNodes[b NodeId].next = first_free_bnode;1779 first_free_bnode = b NodeId;1766 bNodes[bid].next != -1 ? bNodes[bid].next >> 1 : -1; 1767 } 1768 if (bNodes[bid].next != -1) { 1769 bNodes[bNodes[bid].next >> 1].prev = bNodes[bid].prev; 1770 } 1771 bNodes[bid].next = first_free_bnode; 1772 first_free_bnode = bid; 1780 1773 } 1781 1774 } … … 2052 2045 } 2053 2046 virtual void erase(const std::vector<Node>& nodes) { 2054 for (int i = 0; i < (int)nodes.size(); ++i) {2047 for (int i = 0; i < int(nodes.size()); ++i) { 2055 2048 snapshot.eraseNode(nodes[i]); 2056 2049 } 2057 2050 } 2058 2051 virtual void build() { 2059 NodeNotifier* _notifier = notifier();2060 2052 Node node; 2061 2053 std::vector<Node> nodes; 2062 for ( _notifier->first(node); node != INVALID;2063 _notifier->next(node)) {2054 for (notifier()->first(node); node != INVALID; 2055 notifier()->next(node)) { 2064 2056 nodes.push_back(node); 2065 2057 } … … 2069 2061 } 2070 2062 virtual void clear() { 2071 NodeNotifier* _notifier = notifier();2072 2063 Node node; 2073 for ( _notifier->first(node); node != INVALID;2074 _notifier->next(node)) {2064 for (notifier()->first(node); node != INVALID; 2065 notifier()->next(node)) { 2075 2066 snapshot.eraseNode(node); 2076 2067 } … … 2104 2095 } 2105 2096 virtual void erase(const std::vector<UEdge>& edges) { 2106 for (int i = 0; i < (int)edges.size(); ++i) {2097 for (int i = 0; i < int(edges.size()); ++i) { 2107 2098 snapshot.eraseUEdge(edges[i]); 2108 2099 } 2109 2100 } 2110 2101 virtual void build() { 2111 UEdgeNotifier* _notifier = notifier();2112 2102 UEdge edge; 2113 2103 std::vector<UEdge> edges; 2114 for ( _notifier->first(edge); edge != INVALID;2115 _notifier->next(edge)) {2104 for (notifier()->first(edge); edge != INVALID; 2105 notifier()->next(edge)) { 2116 2106 edges.push_back(edge); 2117 2107 } … … 2121 2111 } 2122 2112 virtual void clear() { 2123 UEdgeNotifier* _notifier = notifier();2124 2113 UEdge edge; 2125 for ( _notifier->first(edge); edge != INVALID;2126 _notifier->next(edge)) {2114 for (notifier()->first(edge); edge != INVALID; 2115 notifier()->next(edge)) { 2127 2116 snapshot.eraseUEdge(edge); 2128 2117 }
Note: See TracChangeset
for help on using the changeset viewer.