Index: lemon/full_graph.h
===================================================================
--- lemon/full_graph.h	(revision 1555)
+++ lemon/full_graph.h	(revision 1566)
@@ -25,4 +25,6 @@
 #include <lemon/bits/default_map.h>
 
+#include <lemon/bits/undir_graph_extender.h>
+
 #include <lemon/invalid.h>
 #include <lemon/utility.h>
@@ -37,6 +39,6 @@
 
   class FullGraphBase {
-    int NodeNum;
-    int EdgeNum;
+    int _nodeNum;
+    int _edgeNum;
   public:
 
@@ -52,8 +54,8 @@
 
     ///Creates a full graph with \c n nodes.
-    void construct(int n) { NodeNum = n; EdgeNum = n * n; }
+    void construct(int n) { _nodeNum = n; _edgeNum = n * n; }
     ///
     //    FullGraphBase(const FullGraphBase &_g)
-    //      : NodeNum(_g.nodeNum()), EdgeNum(NodeNum*NodeNum) { }
+    //      : _nodeNum(_g.nodeNum()), _edgeNum(_nodeNum*_nodeNum) { }
     
     typedef True NodeNumTag;
@@ -61,7 +63,7 @@
 
     ///Number of nodes.
-    int nodeNum() const { return NodeNum; }
+    int nodeNum() const { return _nodeNum; }
     ///Number of edges.
-    int edgeNum() const { return EdgeNum; }
+    int edgeNum() const { return _edgeNum; }
 
     /// Maximum node ID.
@@ -69,13 +71,13 @@
     /// Maximum node ID.
     ///\sa id(Node)
-    int maxId(Node = INVALID) const { return NodeNum-1; }
+    int maxId(Node = INVALID) const { return _nodeNum-1; }
     /// Maximum edge ID.
     
     /// Maximum edge ID.
     ///\sa id(Edge)
-    int maxId(Edge = INVALID) const { return EdgeNum-1; }
-
-    Node source(Edge e) const { return e.id % NodeNum; }
-    Node target(Edge e) const { return e.id / NodeNum; }
+    int maxId(Edge = INVALID) const { return _edgeNum-1; }
+
+    Node source(Edge e) const { return e.id % _nodeNum; }
+    Node target(Edge e) const { return e.id / _nodeNum; }
 
 
@@ -103,4 +105,6 @@
     
     static Edge fromId(int id, Edge) { return Edge(id);}
+
+    typedef True FindEdgeTag;
 
     /// Finds an edge between two nodes.
@@ -112,6 +116,5 @@
     /// the next edge from \c u to \c v after \c prev.
     /// \return The found edge or INVALID if there is no such an edge.
-    Edge findEdge(Node u,Node v, Edge prev = INVALID) 
-    {
+    Edge findEdge(Node u,Node v, Edge prev = INVALID) const {
       return prev.id == -1 ? Edge(*this, u.id, v.id) : INVALID;
     }
@@ -138,10 +141,10 @@
       
     protected:
-      int id;  // NodeNum * target + source;
+      int id;  // _nodeNum * target + source;
 
       Edge(int _id) : id(_id) {}
 
       Edge(const FullGraphBase& _graph, int source, int target) 
-	: id(_graph.NodeNum * target+source) {}
+	: id(_graph._nodeNum * target+source) {}
     public:
       Edge() { }
@@ -153,5 +156,5 @@
 
     void first(Node& node) const {
-      node.id = NodeNum-1;
+      node.id = _nodeNum-1;
     }
 
@@ -161,5 +164,5 @@
 
     void first(Edge& edge) const {
-      edge.id = EdgeNum-1;
+      edge.id = _edgeNum-1;
     }
 
@@ -169,19 +172,19 @@
 
     void firstOut(Edge& edge, const Node& node) const {
-      edge.id = EdgeNum + node.id - NodeNum;
+      edge.id = _edgeNum + node.id - _nodeNum;
     }
 
     void nextOut(Edge& edge) const {
-      edge.id -= NodeNum;
+      edge.id -= _nodeNum;
       if (edge.id < 0) edge.id = -1;
     }
 
     void firstIn(Edge& edge, const Node& node) const {
-      edge.id = node.id * NodeNum;
+      edge.id = node.id * _nodeNum;
     }
     
     void nextIn(Edge& edge) const {
       ++edge.id;
-      if (edge.id % NodeNum == 0) edge.id = -1;
+      if (edge.id % _nodeNum == 0) edge.id = -1;
     }
 
@@ -189,21 +192,23 @@
 
 
-  typedef AlterableGraphExtender<FullGraphBase> AlterableFullGraphBase;
-  typedef IterableGraphExtender<AlterableFullGraphBase> IterableFullGraphBase;
-  typedef DefaultMappableGraphExtender<IterableFullGraphBase> MappableFullGraphBase;
-
-  /// \addtogroup graphs
-  /// @{
-
-  ///A full graph class.
-
-  ///This is a simple and fast directed full graph implementation.
-  ///It is completely static, so you can neither add nor delete either
-  ///edges or nodes.
-  ///Thus it conforms to
-  ///the \ref concept::StaticGraph "StaticGraph" concept
-  ///\sa concept::StaticGraph.
-  ///
-  ///\author Alpar Juttner
+  typedef AlterableGraphExtender<FullGraphBase> 
+  AlterableFullGraphBase;
+  typedef IterableGraphExtender<AlterableFullGraphBase> 
+  IterableFullGraphBase;
+  typedef DefaultMappableGraphExtender<IterableFullGraphBase> 
+  MappableFullGraphBase;
+
+  /// \ingroup graphs
+  ///
+  /// \brief A full graph class.
+  ///
+  /// This is a simple and fast directed full graph implementation.
+  /// It is completely static, so you can neither add nor delete either
+  /// edges or nodes.
+  /// Thus it conforms to
+  /// the \ref concept::StaticGraph "StaticGraph" concept
+  /// \sa concept::StaticGraph.
+  ///
+  /// \author Alpar Juttner
   class FullGraph : public MappableFullGraphBase {
   public:
@@ -214,8 +219,7 @@
   ///@}
 
-  // Base graph class for UndirFullGraph.
   class UndirFullGraphBase {
-    int NodeNum;
-    int EdgeNum;
+    int _nodeNum;
+    int _edgeNum;
   public:
 
@@ -231,8 +235,8 @@
 
     ///Creates a full graph with \c n nodes.
-    void construct(int n) { NodeNum = n; EdgeNum = n * (n - 1) / 2; }
+    void construct(int n) { _nodeNum = n; _edgeNum = n * (n - 1) / 2; }
     ///
     //    FullGraphBase(const FullGraphBase &_g)
-    //      : NodeNum(_g.nodeNum()), EdgeNum(NodeNum*NodeNum) { }
+    //      : _nodeNum(_g.nodeNum()), _edgeNum(_nodeNum*_nodeNum) { }
     
     typedef True NodeNumTag;
@@ -240,7 +244,7 @@
 
     ///Number of nodes.
-    int nodeNum() const { return NodeNum; }
+    int nodeNum() const { return _nodeNum; }
     ///Number of edges.
-    int edgeNum() const { return EdgeNum; }
+    int edgeNum() const { return _edgeNum; }
 
     /// Maximum node ID.
@@ -248,10 +252,10 @@
     /// Maximum node ID.
     ///\sa id(Node)
-    int maxId(Node = INVALID) const { return NodeNum-1; }
+    int maxId(Node = INVALID) const { return _nodeNum-1; }
     /// Maximum edge ID.
     
     /// Maximum edge ID.
     ///\sa id(Edge)
-    int maxId(Edge = INVALID) const { return EdgeNum-1; }
+    int maxId(Edge = INVALID) const { return _edgeNum-1; }
 
     Node source(Edge e) const { 
@@ -320,10 +324,10 @@
       
     protected:
-      int id;  // NodeNum * target + source;
+      int id;  // _nodeNum * target + source;
 
       Edge(int _id) : id(_id) {}
 
       Edge(const UndirFullGraphBase& _graph, int source, int target) 
-	: id(_graph.NodeNum * target+source) {}
+	: id(_graph._nodeNum * target+source) {}
     public:
       Edge() { }
@@ -335,5 +339,5 @@
 
     void first(Node& node) const {
-      node.id = NodeNum-1;
+      node.id = _nodeNum-1;
     }
 
@@ -343,5 +347,5 @@
 
     void first(Edge& edge) const {
-      edge.id = EdgeNum-1;
+      edge.id = _edgeNum-1;
     }
 
@@ -370,17 +374,37 @@
       int target = e.id - (source) * (source - 1) / 2; ++target;
       ++source;
-      e.id = source < NodeNum ? source * (source - 1) / 2 + target : -1;
+      e.id = source < _nodeNum ? source * (source - 1) / 2 + target : -1;
     }
 
   };
 
-  /// \addtogroup graphs
-  /// @{
-
-  
-  /// \todo UndirFullGraph from the UndirFullGraphBase
-
-
-  /// @}  
+  typedef UndirGraphExtender<UndirFullGraphBase>
+  UndirUndirFullGraphBase;
+  typedef AlterableUndirGraphExtender<UndirUndirFullGraphBase> 
+  AlterableUndirFullGraphBase;
+  typedef IterableUndirGraphExtender<AlterableUndirFullGraphBase> 
+  IterableUndirFullGraphBase;
+  typedef MappableUndirGraphExtender<IterableUndirFullGraphBase> 
+  MappableUndirFullGraphBase;
+
+  /// \ingroup graphs
+  ///
+  /// \brief An undirected full graph class.
+  ///
+  /// This is a simple and fast directed full graph implementation.
+  /// It is completely static, so you can neither add nor delete either
+  /// edges or nodes.
+  ///
+  /// The main difference beetween the \e FullGraph and \e UndirFullGraph class
+  /// is that this class conforms to the undirected graph concept and
+  /// it does not contain the hook edges.
+  ///
+  /// \sa FullGraph
+  ///
+  /// \author Balazs Dezso
+  class UndirFullGraph : public MappableUndirFullGraphBase {
+  public:
+    UndirFullGraph(int n) { construct(n); }
+  };
 
 } //namespace lemon
