# HG changeset patch
# User Peter Kovacs <kpeter@inf.elte.hu>
# Date 1226058174 -3600
# Node ID 3fe3c838a89e4cbaf1168b4f0720839bde2f44ce
# Parent  164fe3abc0249a97d773f6cfa7fd0d3c623b88a9
Constant time item counting for ListDigraph and ListGraph (#3)

diff --git a/lemon/list_graph.h b/lemon/list_graph.h
--- a/lemon/list_graph.h
+++ b/lemon/list_graph.h
@@ -56,6 +56,8 @@
 
     int first_free_arc;
 
+    int node_num, arc_num;
+
   public:
 
     typedef ListDigraphBase Digraph;
@@ -91,11 +93,17 @@
     };
 
 
+    ListDigraphBase()
+      : nodes(), first_node(-1), first_free_node(-1),
+        arcs(), first_free_arc(-1),
+        node_num(0), arc_num(0) {}
 
-    ListDigraphBase()
-      : nodes(), first_node(-1),
-        first_free_node(-1), arcs(), first_free_arc(-1) {}
 
+    typedef True NodeNumTag;
+    typedef True ArcNumTag;
+
+    int nodeNum() const { return node_num; }
+    int arcNum() const { return arc_num; }
 
     int maxNodeId() const { return nodes.size()-1; }
     int maxArcId() const { return arcs.size()-1; }
@@ -182,6 +190,8 @@
 
       nodes[n].first_in = nodes[n].first_out = -1;
 
+      ++node_num;
+
       return Node(n);
     }
 
@@ -213,6 +223,8 @@
 
       nodes[u.id].first_out = nodes[v.id].first_in = n;
 
+      ++arc_num;
+
       return Arc(n);
     }
 
@@ -233,6 +245,7 @@
       first_free_node = n;
       nodes[n].prev = -2;
 
+      --node_num;
     }
 
     void erase(const Arc& arc) {
@@ -262,12 +275,15 @@
       arcs[n].next_in = first_free_arc;
       first_free_arc = n;
       arcs[n].prev_in = -2;
+
+      --arc_num;
     }
 
     void clear() {
       arcs.clear();
       nodes.clear();
       first_node = first_free_node = first_free_arc = -1;
+      node_num = arc_num = 0;
     }
 
   protected:
@@ -794,6 +810,8 @@
 
     int first_free_arc;
 
+    int node_num, edge_num;
+
   public:
 
     typedef ListGraphBase Digraph;
@@ -855,8 +873,17 @@
 
     ListGraphBase()
       : nodes(), first_node(-1),
-        first_free_node(-1), arcs(), first_free_arc(-1) {}
+        first_free_node(-1), arcs(), first_free_arc(-1),
+        node_num(0), edge_num(0) {}
 
+
+    typedef True NodeNumTag;
+    typedef True EdgeNumTag;
+    typedef True ArcNumTag;
+
+    int nodeNum() const { return node_num; }
+    int edgeNum() const { return edge_num; }
+    int arcNum() const { return edge_num * 2; }
 
     int maxNodeId() const { return nodes.size()-1; }
     int maxEdgeId() const { return arcs.size() / 2 - 1; }
@@ -1023,6 +1050,8 @@
 
       nodes[n].first_out = -1;
 
+      ++node_num;
+
       return Node(n);
     }
 
@@ -1055,6 +1084,8 @@
       arcs[n | 1].prev_out = -1;
       nodes[u.id].first_out = (n | 1);
 
+      ++edge_num;
+
       return Edge(n / 2);
     }
 
@@ -1074,6 +1105,8 @@
       nodes[n].next = first_free_node;
       first_free_node = n;
       nodes[n].prev = -2;
+
+      --node_num;
     }
 
     void erase(const Edge& edge) {
@@ -1104,12 +1137,14 @@
       arcs[n].prev_out = -2;
       arcs[n | 1].prev_out = -2;
 
+      --edge_num;
     }
 
     void clear() {
       arcs.clear();
       nodes.clear();
       first_node = first_free_node = first_free_arc = -1;
+      node_num = edge_num = 0;
     }
 
   protected:
