[Lemon-commits] [lemon_svn] deba: r2404 - in hugo/trunk: lemon test

Lemon SVN svn at lemon.cs.elte.hu
Mon Nov 6 20:52:23 CET 2006


Author: deba
Date: Sat Dec  3 19:17:29 2005
New Revision: 2404

Modified:
   hugo/trunk/lemon/error.h
   hugo/trunk/lemon/lemon_reader.h
   hugo/trunk/lemon/lemon_writer.h
   hugo/trunk/test/heap_test.cc

Log:
Implementation redesign
Throws exception 



Modified: hugo/trunk/lemon/error.h
==============================================================================
--- hugo/trunk/lemon/error.h	(original)
+++ hugo/trunk/lemon/error.h	Sat Dec  3 19:17:29 2005
@@ -376,7 +376,7 @@
     virtual ~FileOpenError() throw() {}
   };
 
-  class IOParameterError : public LogicError {
+  class IOParameterError : public IOError {
   protected:
     ExceptionMember<std::string> _message;
     ExceptionMember<std::string> _file;
@@ -385,7 +385,7 @@
   public:
 
     IOParameterError(const IOParameterError &ile) : 
-      LogicError(ile), _message(ile._message), _file(ile._file) {}
+      IOError(ile), _message(ile._message), _file(ile._file) {}
 
     ///\e 
     explicit IOParameterError(const char *the_message)

Modified: hugo/trunk/lemon/lemon_reader.h
==============================================================================
--- hugo/trunk/lemon/lemon_reader.h	(original)
+++ hugo/trunk/lemon/lemon_reader.h	Sat Dec  3 19:17:29 2005
@@ -45,6 +45,18 @@
 
   namespace _reader_bits {
 
+    template <typename T>
+    bool operator<(T, T) {
+      throw DataFormatError("Id is not comparable");
+    }
+
+    template <typename T>
+    struct Less {
+      bool operator()(const T& p, const T& q) const {
+	return p < q;
+      }
+    };
+
     template <typename Item>
     class ItemIdReader {
     public:
@@ -83,18 +95,6 @@
       };
 
     };
-  
-    template <typename T>
-    bool operator<(T, T) {
-      throw DataFormatError("Id is not comparable");
-    }
-
-    template <typename T>
-    struct Less {
-      bool operator()(const T& p, const T& q) const {
-	return p < q;
-      }
-    };
 
     template <typename Map>
     struct Ref { typedef Map& Type; };
@@ -198,6 +198,253 @@
       typedef const YMap<Map>& Type;
     };
 
+
+    template <typename _Item>
+    class MapReaderBase;
+    
+    template <typename _Item>
+    class MapInverterBase : public MapReaderBase<_Item> {
+    public:
+      typedef _Item Item;
+      virtual void read(std::istream&, const Item&) = 0;
+      virtual Item read(std::istream&) const = 0;
+
+      virtual MapInverterBase<_Item>* getInverter() {
+	return this;
+      }
+    };
+
+    template <typename _Item, typename _Map, typename _Reader>
+    class MapReaderInverter : public MapInverterBase<_Item> {
+    public:
+      typedef _Item Item;
+      typedef _Reader Reader;
+      typedef typename Reader::Value Value;
+      typedef _Map Map;
+      typedef std::map<Value, Item, _reader_bits::Less<Value> > Inverse;
+
+      typename _reader_bits::Ref<Map>::Type map;
+      Reader reader;
+      Inverse inverse;
+
+      MapReaderInverter(typename _reader_bits::Arg<Map>::Type _map,
+			const Reader& _reader) 
+	: map(_map), reader(_reader) {}
+
+      virtual ~MapReaderInverter() {}
+
+      virtual void read(std::istream& is, const Item& item) {
+	Value value;
+	reader.read(is, value);
+	map.set(item, value);
+	typename Inverse::iterator it = inverse.find(value);
+	if (it == inverse.end()) {
+	  inverse.insert(std::make_pair(value, item));
+	} else {
+	  throw DataFormatError("Multiple ID occurence");
+	}
+      }
+
+      virtual Item read(std::istream& is) const {
+	Value value;
+	reader.read(is, value);	
+	typename Inverse::const_iterator it = inverse.find(value);
+	if (it != inverse.end()) {
+	  return it->second;
+	} else {
+	  throw DataFormatError("Invalid ID error");
+	}
+      }      
+    };
+
+    template <typename _Item, typename _Reader>
+    class SkipReaderInverter : public MapInverterBase<_Item> {
+    public:
+      typedef _Item Item;
+      typedef _Reader Reader;
+      typedef typename Reader::Value Value;
+      typedef std::map<Value, Item, _reader_bits::Less<Value> > Inverse;
+
+      Reader reader;
+
+      SkipReaderInverter(const Reader& _reader) 
+	: reader(_reader) {}
+
+      virtual ~SkipReaderInverter() {}
+
+      virtual void read(std::istream& is, const Item& item) {
+	Value value;
+	reader.read(is, value);
+	typename Inverse::iterator it = inverse.find(value);
+	if (it == inverse.end()) {
+	  inverse.insert(std::make_pair(value, item));
+	} else {
+	  throw DataFormatError("Multiple ID occurence error");
+	}
+      }
+
+      virtual Item read(std::istream& is) const {
+	Value value;
+	reader.read(is, value);	
+	typename Inverse::const_iterator it = inverse.find(value);
+	if (it != inverse.end()) {
+	  return it->second;
+	} else {
+	  throw DataFormatError("Invalid ID error");
+	}
+      }
+
+    private:
+      Inverse inverse;
+    };
+
+    template <typename _Item>    
+    class MapReaderBase {
+    public:
+      typedef _Item Item;
+
+      MapReaderBase() { _touched = false; }
+      
+      void touch() { _touched = true; }
+      bool touched() const { return _touched; }
+
+      virtual ~MapReaderBase() {}
+
+      virtual void read(std::istream& is, const Item& item) = 0;
+      virtual MapInverterBase<_Item>* getInverter() = 0;
+
+    private:      
+      bool _touched;
+
+    };
+
+    template <typename _Item, typename _Map, typename _Reader>
+    class MapReader : public MapReaderBase<_Item> {
+    public:
+      typedef _Map Map;
+      typedef _Reader Reader;
+      typedef typename Reader::Value Value;
+      typedef _Item Item;
+      
+      typename _reader_bits::Ref<Map>::Type map;
+      Reader reader;
+
+      MapReader(typename _reader_bits::Arg<Map>::Type _map, 
+		const Reader& _reader) 
+	: map(_map), reader(_reader) {}
+
+      virtual ~MapReader() {}
+
+      virtual void read(std::istream& is, const Item& item) {
+	Value value;
+	reader.read(is, value);
+	map.set(item, value);
+      }
+
+      virtual MapInverterBase<_Item>* getInverter() {
+	return new MapReaderInverter<Item, Map, Reader>(map, reader);
+      }
+    };
+
+
+    template <typename _Item, typename _Reader>
+    class SkipReader : public MapReaderBase<_Item> {
+    public:
+      typedef _Reader Reader;
+      typedef typename Reader::Value Value;
+      typedef _Item Item;
+
+      Reader reader;
+      SkipReader(const Reader& _reader) : reader(_reader) {}
+
+      virtual ~SkipReader() {}
+
+      virtual void read(std::istream& is, const Item&) {
+	Value value;
+	reader.read(is, value);
+      }      
+
+      virtual MapInverterBase<Item>* getInverter() {
+	return new SkipReaderInverter<Item, Reader>(reader);
+      }
+    };
+
+    template <typename _Item>
+    class IdReaderBase {
+    public:
+      typedef _Item Item;
+      virtual ~IdReaderBase() {}
+      virtual Item read(std::istream& is) const = 0;
+      virtual bool isIdReader() const = 0;
+    };
+
+    template <typename _Item, typename _BoxedIdReader>
+    class IdReader : public IdReaderBase<_Item> {
+    public:
+      typedef _Item Item;
+      typedef _BoxedIdReader BoxedIdReader;
+      
+      const BoxedIdReader& boxedIdReader;
+
+      IdReader(const BoxedIdReader& _boxedIdReader) 
+	: boxedIdReader(_boxedIdReader) {}
+
+      virtual Item read(std::istream& is) const {
+	Item item;
+	boxedIdReader.readId(is, item);
+	return item;
+      }
+
+      virtual bool isIdReader() const {
+	return boxedIdReader.isIdReader();
+      }
+    };
+
+    template <typename _Item>
+    class ItemStore {
+    public:
+
+      typedef _Item Item;
+
+      ItemStore(Item& _item) : item(&_item) { 
+	_touched = false; 
+      }
+      
+      void touch() { _touched = true; }
+      bool touched() const { return _touched; }
+
+      void read(const Item& _item) {
+	*item = _item;
+      }
+      
+    private:
+      Item* item;
+      bool _touched;
+    };
+
+    class ValueReaderBase {
+    public:
+      virtual void read(std::istream&) {};
+      virtual ~ValueReaderBase() {}
+    };
+
+    template <typename _Value, typename _Reader>
+    class ValueReader : public ValueReaderBase {
+    public:
+      typedef _Value Value;
+      typedef _Reader Reader;
+
+      ValueReader(Value& _value, const Reader& _reader)
+ 	: value(_value), reader(_reader) {}
+
+      virtual void read(std::istream& is) {
+	reader.read(is, value);
+      }
+    private:
+      Value& value;
+      Reader reader;
+    };
+
   }
 
   /// \ingroup io_group
@@ -469,237 +716,6 @@
 
   };
 
-  /// \brief Helper class for implementing the common SectionReaders.
-  ///
-  /// Helper class for implementing the common SectionReaders.
-  class CommonSectionReaderBase : public LemonReader::SectionReader {
-    typedef LemonReader::SectionReader Parent;
-  protected:
-    
-    /// \brief Constructor for CommonSectionReaderBase.
-    ///
-    /// Constructor for CommonSectionReaderBase. It attach this reader to
-    /// the given LemonReader.
-    CommonSectionReaderBase(LemonReader& _reader) 
-      : Parent(_reader) {}
-
-    template <typename _Item>
-    class ReaderBase;
-    
-    template <typename _Item>
-    class InverterBase : public ReaderBase<_Item> {
-    public:
-      typedef _Item Item;
-      virtual void read(std::istream&, const Item&) = 0;
-      virtual Item read(std::istream&) const = 0;
-
-      virtual InverterBase<_Item>* getInverter() {
-	return this;
-      }
-    };
-
-    template <typename _Item, typename _Map, typename _Reader>
-    class MapReaderInverter : public InverterBase<_Item> {
-    public:
-      typedef _Item Item;
-      typedef _Reader Reader;
-      typedef typename Reader::Value Value;
-      typedef _Map Map;
-      typedef std::map<Value, Item, _reader_bits::Less<Value> > Inverse;
-
-      typename _reader_bits::Ref<Map>::Type map;
-      Reader reader;
-      Inverse inverse;
-
-      MapReaderInverter(typename _reader_bits::Arg<Map>::Type _map,
-			const Reader& _reader) 
-	: map(_map), reader(_reader) {}
-
-      virtual ~MapReaderInverter() {}
-
-      virtual void read(std::istream& is, const Item& item) {
-	Value value;
-	reader.read(is, value);
-	map.set(item, value);
-	typename Inverse::iterator it = inverse.find(value);
-	if (it == inverse.end()) {
-	  inverse.insert(std::make_pair(value, item));
-	} else {
-	  throw DataFormatError("Multiple ID occurence");
-	}
-      }
-
-      virtual Item read(std::istream& is) const {
-	Value value;
-	reader.read(is, value);	
-	typename Inverse::const_iterator it = inverse.find(value);
-	if (it != inverse.end()) {
-	  return it->second;
-	} else {
-	  throw DataFormatError("Invalid ID error");
-	}
-      }      
-    };
-
-    template <typename _Item, typename _Reader>
-    class SkipReaderInverter : public InverterBase<_Item> {
-    public:
-      typedef _Item Item;
-      typedef _Reader Reader;
-      typedef typename Reader::Value Value;
-      typedef std::map<Value, Item, _reader_bits::Less<Value> > Inverse;
-
-      Reader reader;
-
-      SkipReaderInverter(const Reader& _reader) 
-	: reader(_reader) {}
-
-      virtual ~SkipReaderInverter() {}
-
-      virtual void read(std::istream& is, const Item& item) {
-	Value value;
-	reader.read(is, value);
-	typename Inverse::iterator it = inverse.find(value);
-	if (it == inverse.end()) {
-	  inverse.insert(std::make_pair(value, item));
-	} else {
-	  throw DataFormatError("Multiple ID occurence error");
-	}
-      }
-
-      virtual Item read(std::istream& is) const {
-	Value value;
-	reader.read(is, value);	
-	typename Inverse::const_iterator it = inverse.find(value);
-	if (it != inverse.end()) {
-	  return it->second;
-	} else {
-	  throw DataFormatError("Invalid ID error");
-	}
-      }
-
-    private:
-      Inverse inverse;
-    };
-
-    template <typename _Item>    
-    class ReaderBase {
-    public:
-      typedef _Item Item;
-
-      virtual ~ReaderBase() {}
-
-      virtual void read(std::istream& is, const Item& item) = 0;
-      virtual InverterBase<_Item>* getInverter() = 0;
-    };
-
-    template <typename _Item, typename _Map, typename _Reader>
-    class MapReader : public ReaderBase<_Item> {
-    public:
-      typedef _Map Map;
-      typedef _Reader Reader;
-      typedef typename Reader::Value Value;
-      typedef _Item Item;
-      
-      typename _reader_bits::Ref<Map>::Type map;
-      Reader reader;
-
-      MapReader(typename _reader_bits::Arg<Map>::Type _map, 
-		const Reader& _reader) 
-	: map(_map), reader(_reader) {}
-
-      virtual ~MapReader() {}
-
-      virtual void read(std::istream& is, const Item& item) {
-	Value value;
-	reader.read(is, value);
-	map.set(item, value);
-      }
-
-      virtual InverterBase<_Item>* getInverter() {
-	return new MapReaderInverter<Item, Map, Reader>(map, reader);
-      }
-    };
-
-
-    template <typename _Item, typename _Reader>
-    class SkipReader : public ReaderBase<_Item> {
-    public:
-      typedef _Reader Reader;
-      typedef typename Reader::Value Value;
-      typedef _Item Item;
-
-      Reader reader;
-      SkipReader(const Reader& _reader) : reader(_reader) {}
-
-      virtual ~SkipReader() {}
-
-      virtual void read(std::istream& is, const Item&) {
-	Value value;
-	reader.read(is, value);
-      }      
-
-      virtual InverterBase<Item>* getInverter() {
-	return new SkipReaderInverter<Item, Reader>(reader);
-      }
-    };
-
-    template <typename _Item>
-    class IdReaderBase {
-    public:
-      typedef _Item Item;
-      virtual ~IdReaderBase() {}
-      virtual Item read(std::istream& is) const = 0;
-      virtual bool isIdReader() const = 0;
-    };
-
-    template <typename _Item, typename _BoxedIdReader>
-    class IdReader : public IdReaderBase<_Item> {
-    public:
-      typedef _Item Item;
-      typedef _BoxedIdReader BoxedIdReader;
-      
-      const BoxedIdReader& boxedIdReader;
-
-      IdReader(const BoxedIdReader& _boxedIdReader) 
-	: boxedIdReader(_boxedIdReader) {}
-
-      virtual Item read(std::istream& is) const {
-	Item item;
-	boxedIdReader.readId(is, item);
-	return item;
-      }
-
-      virtual bool isIdReader() const {
-	return boxedIdReader.isIdReader();
-      }
-    };
-
-    class ValueReaderBase {
-    public:
-      virtual void read(std::istream&) {};
-      virtual ~ValueReaderBase() {}
-    };
-
-    template <typename _Value, typename _Reader>
-    class ValueReader : public ValueReaderBase {
-    public:
-      typedef _Value Value;
-      typedef _Reader Reader;
-
-      ValueReader(Value& _value, const Reader& _reader)
- 	: value(_value), reader(_reader) {}
-
-      virtual void read(std::istream& is) {
-	reader.read(is, value);
-      }
-    private:
-      Value& value;
-      Reader reader;
-    };
-    
-  };
-
   /// \ingroup io_group
   /// \brief SectionReader for reading a graph's nodeset.
   ///
@@ -718,8 +734,8 @@
   ///
   /// \relates LemonReader
   template <typename _Graph, typename _Traits = DefaultReaderTraits>
-  class NodeSetReader : public CommonSectionReaderBase {
-    typedef CommonSectionReaderBase Parent;
+  class NodeSetReader : public LemonReader::SectionReader {
+    typedef LemonReader::SectionReader Parent;
   public:
 
     typedef _Graph Graph;
@@ -801,9 +817,10 @@
 	ErrorMessage msg;
 	msg << "Multiple read rule for node map: " << name;
 	throw IOParameterError(msg.message());
-      }
+      }      
       readers.insert(
-	make_pair(name, new MapReader<Node, Map, Reader>(map, reader)));
+        make_pair(name, new _reader_bits::
+		  MapReader<Node, Map, Reader>(map, reader)));
       return *this;
     }
 
@@ -820,7 +837,8 @@
 	msg << "Multiple read rule for node map: " << name;
 	throw IOParameterError(msg.message());
       }
-      readers.insert(make_pair(name, new SkipReader<Node, Reader>(reader)));
+      readers.insert(make_pair(name, new _reader_bits::
+			       SkipReader<Node, Reader>(reader)));
       return *this;
     }
 
@@ -843,7 +861,7 @@
     ///
     /// It reads the content of the section.
     virtual void read(std::istream& is) {
-      std::vector<ReaderBase<Node>* > index;
+      std::vector<_reader_bits::MapReaderBase<Node>* > index;
       std::string line;
 
       getline(is, line);
@@ -851,6 +869,7 @@
       while (ls >> id) {
 	typename MapReaders::iterator it = readers.find(id);
 	if (it != readers.end()) {
+	  it->second->touch();
 	  index.push_back(it->second);
 	} else {
 	  index.push_back(&skipper);
@@ -860,6 +879,14 @@
 	  index.back() = inverter.get();
 	}
       }
+      for (typename MapReaders::iterator it = readers.begin();
+	   it != readers.end(); ++it) {
+	if (!it->second->touched()) {
+	  ErrorMessage msg;
+	  msg << "Map not found in file: " << it->first;
+	  throw IOParameterError(msg.message());
+	}
+      }
       while (getline(is, line)) {	
 	Node node = graph.addNode();
 	std::istringstream ls(line);
@@ -889,14 +916,14 @@
 
   private:
 
-    typedef std::map<std::string, ReaderBase<Node>*> MapReaders;
+    typedef std::map<std::string, _reader_bits::MapReaderBase<Node>*> MapReaders;
     MapReaders readers;
    
     Graph& graph;   
     std::string id;
-    SkipReader<Node, DefaultSkipper> skipper;
+    _reader_bits::SkipReader<Node, DefaultSkipper> skipper;
 
-    std::auto_ptr<InverterBase<Node> > inverter;
+    std::auto_ptr<_reader_bits::MapInverterBase<Node> > inverter;
   };
 
   /// \ingroup io_group
@@ -922,8 +949,8 @@
   ///
   /// \relates LemonReader
   template <typename _Graph, typename _Traits = DefaultReaderTraits>
-  class EdgeSetReader : public CommonSectionReaderBase {
-    typedef CommonSectionReaderBase Parent;
+  class EdgeSetReader : public LemonReader::SectionReader {
+    typedef LemonReader::SectionReader Parent;
   public:
 
     typedef _Graph Graph;
@@ -948,7 +975,8 @@
 		  const DefaultSkipper& _skipper = DefaultSkipper()) 
       : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {
       checkConcept<_reader_bits::ItemIdReader<Node>, NodeIdReader>();
-      nodeIdReader.reset(new IdReader<Node, NodeIdReader>(_nodeIdReader));
+      nodeIdReader.reset(new _reader_bits::
+			 IdReader<Node, NodeIdReader>(_nodeIdReader));
     }
     /// \brief Destructor.
     ///
@@ -1013,7 +1041,8 @@
 	throw IOParameterError(msg.message());
       }
       readers.insert(
-	make_pair(name, new MapReader<Edge, Map, Reader>(map, reader)));
+	make_pair(name, new _reader_bits::
+		  MapReader<Edge, Map, Reader>(map, reader)));
       return *this;
     }
 
@@ -1030,7 +1059,8 @@
 	msg << "Multiple read rule for edge map: " << name;
 	throw IOParameterError(msg.message());
       }
-      readers.insert(make_pair(name, new SkipReader<Edge, Reader>(reader)));
+      readers.insert(make_pair(name, new _reader_bits::
+			       SkipReader<Edge, Reader>(reader)));
       return *this;
     }
 
@@ -1056,7 +1086,7 @@
       if (!nodeIdReader->isIdReader()) {
 	throw DataFormatError("Cannot find nodeset or ID map");
       }
-      std::vector<ReaderBase<Edge>* > index;
+      std::vector<_reader_bits::MapReaderBase<Edge>* > index;
       std::string line;
 
       getline(is, line);
@@ -1065,6 +1095,7 @@
 	typename MapReaders::iterator it = readers.find(id);
 	if (it != readers.end()) {
 	  index.push_back(it->second);
+	  it->second->touch();
 	} else {
 	  index.push_back(&skipper);
 	}
@@ -1073,6 +1104,14 @@
 	  index.back() = inverter.get();
 	}
       }
+      for (typename MapReaders::iterator it = readers.begin();
+	   it != readers.end(); ++it) {
+	if (!it->second->touched()) {
+	  ErrorMessage msg;
+	  msg << "Map not found in file: " << it->first;
+	  throw IOParameterError(msg.message());
+	}
+      }
       while (getline(is, line)) {	
 	std::istringstream ls(line);
 	Node from = nodeIdReader->read(ls);
@@ -1104,15 +1143,15 @@
 
   private:
 
-    typedef std::map<std::string, ReaderBase<Edge>*> MapReaders;
+    typedef std::map<std::string, _reader_bits::MapReaderBase<Edge>*> MapReaders;
     MapReaders readers;
    
     Graph& graph;   
     std::string id;
-    SkipReader<Edge, DefaultSkipper> skipper;
+    _reader_bits::SkipReader<Edge, DefaultSkipper> skipper;
 
-    std::auto_ptr<InverterBase<Edge> > inverter;
-    std::auto_ptr<IdReaderBase<Node> > nodeIdReader;
+    std::auto_ptr<_reader_bits::MapInverterBase<Edge> > inverter;
+    std::auto_ptr<_reader_bits::IdReaderBase<Node> > nodeIdReader;
   };
 
   /// \ingroup io_group
@@ -1143,8 +1182,8 @@
   ///
   /// \relates LemonReader
   template <typename _Graph, typename _Traits = DefaultReaderTraits>
-  class UndirEdgeSetReader : public CommonSectionReaderBase {
-    typedef CommonSectionReaderBase Parent;
+  class UndirEdgeSetReader : public LemonReader::SectionReader {
+    typedef LemonReader::SectionReader Parent;
   public:
 
     typedef _Graph Graph;
@@ -1170,7 +1209,8 @@
 		       const DefaultSkipper& _skipper = DefaultSkipper()) 
       : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {
       checkConcept<_reader_bits::ItemIdReader<Node>, NodeIdReader>();
-      nodeIdReader.reset(new IdReader<Node, NodeIdReader>(_nodeIdReader));
+      nodeIdReader.reset(new _reader_bits::
+			 IdReader<Node, NodeIdReader>(_nodeIdReader));
     }
     /// \brief Destructor.
     ///
@@ -1235,7 +1275,8 @@
 	throw IOParameterError(msg.message());
       }
       readers.insert(
-	make_pair(name, new MapReader<UndirEdge, Map, Reader>(map, reader)));
+	make_pair(name, new _reader_bits::
+		  MapReader<UndirEdge, Map, Reader>(map, reader)));
       return *this;
     }
 
@@ -1252,8 +1293,8 @@
 	msg << "Multiple read rule for node map: " << name;
 	throw IOParameterError(msg.message());
       }
-      readers.insert(make_pair(name, 
-			       new SkipReader<UndirEdge, Reader>(reader)));
+      readers.insert(make_pair(name, new _reader_bits::
+			       SkipReader<UndirEdge, Reader>(reader)));
       return *this;
     }
 
@@ -1340,7 +1381,7 @@
       if (!nodeIdReader->isIdReader()) {
 	throw DataFormatError("Cannot find nodeset or ID map");
       }
-      std::vector<ReaderBase<UndirEdge>* > index;
+      std::vector<_reader_bits::MapReaderBase<UndirEdge>* > index;
       std::string line;
 
       getline(is, line);
@@ -1349,6 +1390,7 @@
 	typename MapReaders::iterator it = readers.find(id);
 	if (it != readers.end()) {
 	  index.push_back(it->second);
+	  it->second->touch();
 	} else {
 	  index.push_back(&skipper);
 	}
@@ -1357,6 +1399,14 @@
 	  index.back() = inverter.get();
 	}
       }
+      for (typename MapReaders::iterator it = readers.begin();
+	   it != readers.end(); ++it) {
+	if (!it->second->touched()) {
+	  ErrorMessage msg;
+	  msg << "Map not found in file: " << it->first;
+	  throw IOParameterError(msg.message());
+	}
+      }
       while (getline(is, line)) {	
 	std::istringstream ls(line);
 	Node from = nodeIdReader->read(ls);
@@ -1408,15 +1458,16 @@
 
   private:
 
-    typedef std::map<std::string, ReaderBase<UndirEdge>*> MapReaders;
+    typedef std::map<std::string, 
+		     _reader_bits::MapReaderBase<UndirEdge>*> MapReaders;
     MapReaders readers;
    
     Graph& graph;   
     std::string id;
-    SkipReader<UndirEdge, DefaultSkipper> skipper;
+    _reader_bits::SkipReader<UndirEdge, DefaultSkipper> skipper;
 
-    std::auto_ptr<InverterBase<UndirEdge> > inverter;
-    std::auto_ptr<IdReaderBase<Node> > nodeIdReader;
+    std::auto_ptr<_reader_bits::MapInverterBase<UndirEdge> > inverter;
+    std::auto_ptr<_reader_bits::IdReaderBase<Node> > nodeIdReader;
   };
 
   /// \ingroup io_group
@@ -1430,8 +1481,8 @@
   ///
   /// \relates LemonReader
   template <typename _Graph>
-  class NodeReader : public CommonSectionReaderBase {
-    typedef CommonSectionReaderBase Parent;
+  class NodeReader : public LemonReader::SectionReader {
+    typedef LemonReader::SectionReader Parent;
     typedef _Graph Graph;
     typedef typename Graph::Node Node;
   public:
@@ -1447,7 +1498,8 @@
 	       const std::string& _id = std::string()) 
       : Parent(_reader), id(_id) {
       checkConcept<_reader_bits::ItemIdReader<Node>, _IdReader>();
-      nodeIdReader.reset(new IdReader<Node, _IdReader>(_idReader));
+      nodeIdReader.reset(new _reader_bits::
+			 IdReader<Node, _IdReader>(_idReader));
     }
 
     /// \brief Destructor.
@@ -1470,7 +1522,7 @@
 	msg << "Multiple read rule for node: " << name;
 	throw IOParameterError(msg.message());
       }
-      readers.insert(make_pair(name, &item));
+      readers.insert(make_pair(name, _reader_bits::ItemStore<Node>(item)));
     }
 
   protected:
@@ -1502,18 +1554,27 @@
 	ls >> id;
 	typename NodeReaders::iterator it = readers.find(id);
 	if (it != readers.end()) {
-	  *(it->second) = nodeIdReader->read(ls); 
+	  it->second.read(nodeIdReader->read(ls));
+	  it->second.touch();
 	}	
       }
+      for (typename NodeReaders::iterator it = readers.begin();
+	   it != readers.end(); ++it) {
+	if (!it->second.touched()) {
+	  ErrorMessage msg;
+	  msg << "Node not found in file: " << it->first;
+	  throw IOParameterError(msg.message());
+	}
+      }
     }
     
   private:
 
     std::string id;
 
-    typedef std::map<std::string, Node*> NodeReaders;
+    typedef std::map<std::string, _reader_bits::ItemStore<Node> > NodeReaders;
     NodeReaders readers;
-    std::auto_ptr<IdReaderBase<Node> > nodeIdReader;
+    std::auto_ptr<_reader_bits::IdReaderBase<Node> > nodeIdReader;
   };
 
   /// \ingroup io_group
@@ -1527,8 +1588,8 @@
   ///
   /// \relates LemonReader
   template <typename _Graph>
-  class EdgeReader : public CommonSectionReaderBase {
-    typedef CommonSectionReaderBase Parent;
+  class EdgeReader : public LemonReader::SectionReader {
+    typedef LemonReader::SectionReader Parent;
     typedef _Graph Graph;
     typedef typename Graph::Edge Edge;
   public:
@@ -1544,7 +1605,8 @@
 	       const std::string& _id = std::string()) 
       : Parent(_reader), id(_id) {
       checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
-      edgeIdReader.reset(new IdReader<Edge, _IdReader>(_idReader));
+      edgeIdReader.reset(new _reader_bits::
+			 IdReader<Edge, _IdReader>(_idReader));
     }
 
     /// \brief Destructor.
@@ -1566,7 +1628,7 @@
 	msg << "Multiple read rule for edge: " << name;
 	throw IOParameterError(msg.message());
       }
-      readers.insert(make_pair(name, &item));
+      readers.insert(make_pair(name, _reader_bits::ItemStore<Edge>(item)));
     }
 
   protected:
@@ -1598,18 +1660,27 @@
 	ls >> id;
 	typename EdgeReaders::iterator it = readers.find(id);
 	if (it != readers.end()) {
-	  *(it->second) = edgeIdReader->read(ls); 
+	  it->second.read(edgeIdReader->read(ls));
+	  it->second.touch();
 	}	
       }
+      for (typename EdgeReaders::iterator it = readers.begin();
+	   it != readers.end(); ++it) {
+	if (!it->second.touched()) {
+	  ErrorMessage msg;
+	  msg << "Edge not found in file: " << it->first;
+	  throw IOParameterError(msg.message());
+	}
+      }
     }
     
   private:
 
     std::string id;
 
-    typedef std::map<std::string, Edge*> EdgeReaders;
+    typedef std::map<std::string, _reader_bits::ItemStore<Edge> > EdgeReaders;
     EdgeReaders readers;
-    std::auto_ptr<IdReaderBase<Edge> > edgeIdReader;
+    std::auto_ptr<_reader_bits::IdReaderBase<Edge> > edgeIdReader;
   };
 
   /// \ingroup io_group
@@ -1623,8 +1694,8 @@
   ///
   /// \relates LemonReader
   template <typename _Graph>
-  class UndirEdgeReader : public CommonSectionReaderBase {
-    typedef CommonSectionReaderBase Parent;
+  class UndirEdgeReader : public LemonReader::SectionReader {
+    typedef LemonReader::SectionReader Parent;
     typedef _Graph Graph;
     typedef typename Graph::Edge Edge;
     typedef typename Graph::UndirEdge UndirEdge;
@@ -1643,8 +1714,10 @@
       : Parent(_reader), id(_id) {
       checkConcept<_reader_bits::ItemIdReader<UndirEdge>, _IdReader>();
       checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
-      undirEdgeIdReader.reset(new IdReader<UndirEdge, _IdReader>(_idReader));
-      edgeIdReader.reset(new IdReader<Edge, _IdReader>(_idReader));
+      undirEdgeIdReader.reset(new _reader_bits::
+			      IdReader<UndirEdge, _IdReader>(_idReader));
+      edgeIdReader.reset(new _reader_bits::
+			 IdReader<Edge, _IdReader>(_idReader));
     }
 
     /// \brief Destructor.
@@ -1666,7 +1739,8 @@
 	msg << "Multiple read rule for undirected edge: " << name;
 	throw IOParameterError(msg.message());
       }
-      undirEdgeReaders.insert(make_pair(name, &item));
+      undirEdgeReaders.insert(make_pair(name, _reader_bits::
+					ItemStore<UndirEdge>(item)));
     }
 
     /// \brief Add an edge reader command for the UndirEdgeReader.
@@ -1678,7 +1752,7 @@
 	msg << "Multiple read rule for edge: " << name;
 	throw IOParameterError(msg.message());
       }
-      edgeReaders.insert(make_pair(name, &item));
+      edgeReaders.insert(make_pair(name, _reader_bits::ItemStore<Edge>(item)));
     }
 
   protected:
@@ -1714,30 +1788,49 @@
 	{
 	  typename UndirEdgeReaders::iterator it = undirEdgeReaders.find(id);
 	  if (it != undirEdgeReaders.end()) {
-	    *(it->second) = undirEdgeIdReader->read(ls); 
-	    break;
+	    it->second.read(undirEdgeIdReader->read(ls));
+	    it->second.touch();
+	    continue;
 	  }	
 	} {
 	  typename EdgeReaders::iterator it = edgeReaders.find(id);
 	  if (it != edgeReaders.end()) {
-	    *(it->second) = edgeIdReader->read(ls); 
-	    break;
+	    it->second.read(edgeIdReader->read(ls));
+	    it->second.touch();
+	    continue;
 	  }	
 	}
       }
+      for (typename EdgeReaders::iterator it = edgeReaders.begin();
+	   it != edgeReaders.end(); ++it) {
+	if (!it->second.touched()) {
+	  ErrorMessage msg;
+	  msg << "Edge not found in file: " << it->first;
+	  throw IOParameterError(msg.message());
+	}
+      }
+      for (typename UndirEdgeReaders::iterator it = undirEdgeReaders.begin();
+	   it != undirEdgeReaders.end(); ++it) {
+	if (!it->second.touched()) {
+	  ErrorMessage msg;
+	  msg << "UndirEdge not found in file: " << it->first;
+	  throw IOParameterError(msg.message());
+	}
+      }
     }
     
   private:
 
     std::string id;
 
-    typedef std::map<std::string, UndirEdge*> UndirEdgeReaders;
+    typedef std::map<std::string, 
+		     _reader_bits::ItemStore<UndirEdge> > UndirEdgeReaders;
     UndirEdgeReaders undirEdgeReaders;
-    std::auto_ptr<IdReaderBase<UndirEdge> > undirEdgeIdReader;
+    std::auto_ptr<_reader_bits::IdReaderBase<UndirEdge> > undirEdgeIdReader;
 
-    typedef std::map<std::string, Edge*> EdgeReaders;
+    typedef std::map<std::string, _reader_bits::ItemStore<Edge> > EdgeReaders;
     EdgeReaders edgeReaders;
-    std::auto_ptr<IdReaderBase<Edge> > edgeIdReader;
+    std::auto_ptr<_reader_bits::IdReaderBase<Edge> > edgeIdReader;
   };
 
   /// \ingroup io_group
@@ -1752,8 +1845,8 @@
   ///
   /// \relates LemonReader
   template <typename _Traits = DefaultReaderTraits>
-  class AttributeReader : public CommonSectionReaderBase {
-    typedef CommonSectionReaderBase Parent;
+  class AttributeReader : public LemonReader::SectionReader {
+    typedef LemonReader::SectionReader Parent;
     typedef _Traits Traits; 
   public:
     /// \brief Constructor.
@@ -1801,8 +1894,8 @@
 	msg << "Multiple read rule for attribute: " << name;
 	throw IOParameterError(msg.message());
       }
-      readers.insert(make_pair(name, new ValueReader<Value, Reader>
-      			       (value, reader)));
+      readers.insert(make_pair(name, new _reader_bits::
+			       ValueReader<Value, Reader>(value, reader)));
       return *this;
     }
 
@@ -1840,7 +1933,7 @@
   private:
     std::string id;
 
-    typedef std::map<std::string, ValueReaderBase*> Readers;
+    typedef std::map<std::string, _reader_bits::ValueReaderBase*> Readers;
     Readers readers;  
   };
 

Modified: hugo/trunk/lemon/lemon_writer.h
==============================================================================
--- hugo/trunk/lemon/lemon_writer.h	(original)
+++ hugo/trunk/lemon/lemon_writer.h	Sat Dec  3 19:17:29 2005
@@ -164,6 +164,95 @@
       typedef ConstYMap<Map> Type;
     };
 
+
+    template <typename _Item>    
+    class MapWriterBase {
+    public:
+      typedef _Item Item;
+
+      virtual ~MapWriterBase() {}
+
+      virtual void write(std::ostream& os, const Item& item) = 0;
+    };
+
+
+    template <typename _Item, typename _Map, typename _Writer>
+    class MapWriter : public MapWriterBase<_Item> {
+    public:
+      typedef _Map Map;
+      typedef _Writer Writer;
+      typedef typename Writer::Value Value;
+      typedef _Item Item;
+      
+      typename _writer_bits::Ref<Map>::Type map;
+      Writer writer;
+
+      MapWriter(const Map& _map, const Writer& _writer) 
+	: map(_map), writer(_writer) {}
+
+      virtual ~MapWriter() {}
+
+      virtual void write(std::ostream& os, const Item& item) {
+	Value value = map[item];
+	writer.write(os, value);
+      }
+
+    };
+
+
+    class ValueWriterBase {
+    public:
+      virtual ~ValueWriterBase() {}
+      virtual void write(std::ostream&) = 0;
+    };
+
+    template <typename _Value, typename _Writer>
+    class ValueWriter : public ValueWriterBase {
+    public:
+      typedef _Value Value;
+      typedef _Writer Writer;
+
+      ValueWriter(const Value& _value, const Writer& _writer)
+ 	: value(_value), writer(_writer) {}
+
+      virtual void write(std::ostream& os) {
+	writer.write(os, value);
+      }
+    private:
+      const Value& value;
+      Writer writer;
+    };
+    
+
+    template <typename _Item>
+    class IdWriterBase {
+    public:
+      typedef _Item Item;
+      virtual ~IdWriterBase() {}
+      virtual void write(std::ostream&, const Item&) const = 0;
+      virtual bool isIdWriter() const = 0;
+    };
+
+    template <typename _Item, typename _BoxedIdWriter>
+    class IdWriter : public IdWriterBase<_Item> {
+    public:
+      typedef _Item Item;
+      typedef _BoxedIdWriter BoxedIdWriter;
+
+      const BoxedIdWriter& idWriter;
+
+      IdWriter(const BoxedIdWriter& _idWriter) 
+	: idWriter(_idWriter) {}
+
+      virtual void write(std::ostream& os, const Item& item) const {
+	idWriter.writeId(os, item);
+      }
+
+      virtual bool isIdWriter() const {
+	return idWriter.isIdWriter();
+      }
+    };
+
   }
 
   /// \ingroup io_group
@@ -281,109 +370,6 @@
 
   };
 
-  /// \brief Helper class for implementing the common SectionWriters.
-  ///
-  /// Helper class for implementing the common SectionWriters.
-  class CommonSectionWriterBase : public LemonWriter::SectionWriter {
-    typedef LemonWriter::SectionWriter Parent;
-  protected:
-    
-    /// \brief Constructor for CommonSectionWriterBase.
-    ///
-    /// Constructor for CommonSectionWriterBase. It attach this writer to
-    /// the given LemonWriter.
-    CommonSectionWriterBase(LemonWriter& _writer) 
-      : Parent(_writer) {}
-
-    template <typename _Item>    
-    class WriterBase {
-    public:
-      typedef _Item Item;
-
-      virtual ~WriterBase() {}
-
-      virtual void write(std::ostream& os, const Item& item) = 0;
-    };
-
-
-    template <typename _Item, typename _Map, typename _Writer>
-    class MapWriter : public WriterBase<_Item> {
-    public:
-      typedef _Map Map;
-      typedef _Writer Writer;
-      typedef typename Writer::Value Value;
-      typedef _Item Item;
-      
-      typename _writer_bits::Ref<Map>::Type map;
-      Writer writer;
-
-      MapWriter(const Map& _map, const Writer& _writer) 
-	: map(_map), writer(_writer) {}
-
-      virtual ~MapWriter() {}
-
-      virtual void write(std::ostream& os, const Item& item) {
-	Value value = map[item];
-	writer.write(os, value);
-      }
-
-    };
-
-
-    class ValueWriterBase {
-    public:
-      virtual ~ValueWriterBase() {}
-      virtual void write(std::ostream&) = 0;
-    };
-
-    template <typename _Value, typename _Writer>
-    class ValueWriter : public ValueWriterBase {
-    public:
-      typedef _Value Value;
-      typedef _Writer Writer;
-
-      ValueWriter(const Value& _value, const Writer& _writer)
- 	: value(_value), writer(_writer) {}
-
-      virtual void write(std::ostream& os) {
-	writer.write(os, value);
-      }
-    private:
-      const Value& value;
-      Writer writer;
-    };
-    
-
-    template <typename _Item>
-    class IdWriterBase {
-    public:
-      typedef _Item Item;
-      virtual ~IdWriterBase() {}
-      virtual void write(std::ostream&, const Item&) const = 0;
-      virtual bool isIdWriter() const = 0;
-    };
-
-    template <typename _Item, typename _BoxedIdWriter>
-    class IdWriter : public IdWriterBase<_Item> {
-    public:
-      typedef _Item Item;
-      typedef _BoxedIdWriter BoxedIdWriter;
-
-      const BoxedIdWriter& idWriter;
-
-      IdWriter(const BoxedIdWriter& _idWriter) 
-	: idWriter(_idWriter) {}
-
-      virtual void write(std::ostream& os, const Item& item) const {
-	idWriter.writeId(os, item);
-      }
-
-      virtual bool isIdWriter() const {
-	return idWriter.isIdWriter();
-      }
-    };
-  };
-
   /// \ingroup io_group
   /// \brief SectionWriter for writing a graph's nodeset.
   ///
@@ -403,8 +389,8 @@
   ///
   /// \relates LemonWriter
   template <typename _Graph, typename _Traits = DefaultWriterTraits>
-  class NodeSetWriter : public CommonSectionWriterBase {
-    typedef CommonSectionWriterBase Parent;
+  class NodeSetWriter : public LemonWriter::SectionWriter {
+    typedef LemonWriter::SectionWriter Parent;
   public:
 
     typedef _Graph Graph;
@@ -457,7 +443,8 @@
       checkConcept<concept::ReadMap<Node, typename Map::Value>, Map>();
       checkConcept<_writer_bits::ItemWriter<typename Map::Value>, Writer>();
       writers.push_back(
-	make_pair(name, new MapWriter<Node, Map, Writer>(map, writer)));
+	make_pair(name, new _writer_bits::
+		  MapWriter<Node, Map, Writer>(map, writer)));
       return *this;
     }
 
@@ -527,10 +514,11 @@
 
   private:
 
-    typedef std::vector<std::pair<std::string, WriterBase<Node>*> > MapWriters;
+    typedef std::vector<std::pair<std::string, _writer_bits::
+				  MapWriterBase<Node>*> > MapWriters;
     MapWriters writers;
 
-    WriterBase<Node>* idMap;
+    _writer_bits::MapWriterBase<Node>* idMap;
     bool forceIdMap;
    
     const Graph& graph;   
@@ -562,8 +550,8 @@
   ///
   /// \relates LemonWriter
   template <typename _Graph, typename _Traits = DefaultWriterTraits>
-  class EdgeSetWriter : public CommonSectionWriterBase {
-    typedef CommonSectionWriterBase Parent;
+  class EdgeSetWriter : public LemonWriter::SectionWriter {
+    typedef LemonWriter::SectionWriter Parent;
   public:
 
     typedef _Graph Graph;
@@ -586,7 +574,8 @@
       : Parent(_writer), idMap(0), forceIdMap(_forceIdMap),
 	graph(_graph), id(_id) {
       checkConcept<_writer_bits::ItemIdWriter<Node>, NodeIdWriter>();
-      nodeIdWriter.reset(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter));
+      nodeIdWriter.reset(new _writer_bits::
+			 IdWriter<Node, NodeIdWriter>(_nodeIdWriter));
     } 
 
     /// \brief Destructor.
@@ -623,7 +612,8 @@
       checkConcept<concept::ReadMap<Edge, typename Map::Value>, Map>();
       checkConcept<_writer_bits::ItemWriter<typename Map::Value>, Writer>();
       writers.push_back(
-	make_pair(name, new MapWriter<Edge, Map, Writer>(map, writer)));
+	make_pair(name, new _writer_bits::
+		  MapWriter<Edge, Map, Writer>(map, writer)));
       return *this;
     }
 
@@ -701,16 +691,17 @@
 
   private:
 
-    typedef std::vector<std::pair<std::string, WriterBase<Edge>*> > MapWriters;
+    typedef std::vector<std::pair<std::string, _writer_bits::
+				  MapWriterBase<Edge>*> > MapWriters;
     MapWriters writers;
 
-    WriterBase<Edge>* idMap;
+    _writer_bits::MapWriterBase<Edge>* idMap;
     bool forceIdMap;
    
     const Graph& graph;   
     std::string id;
 
-    std::auto_ptr<IdWriterBase<Node> > nodeIdWriter;
+    std::auto_ptr<_writer_bits::IdWriterBase<Node> > nodeIdWriter;
   };
 
   /// \ingroup io_group
@@ -743,8 +734,8 @@
   ///
   /// \relates LemonWriter
   template <typename _Graph, typename _Traits = DefaultWriterTraits>
-  class UndirEdgeSetWriter : public CommonSectionWriterBase {
-    typedef CommonSectionWriterBase Parent;
+  class UndirEdgeSetWriter : public LemonWriter::SectionWriter {
+    typedef LemonWriter::SectionWriter Parent;
   public:
 
     typedef _Graph Graph;
@@ -768,7 +759,8 @@
       : Parent(_writer), idMap(0), forceIdMap(_forceIdMap),
 	graph(_graph), id(_id) {
       checkConcept<_writer_bits::ItemIdWriter<Node>, NodeIdWriter>();
-      nodeIdWriter.reset(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter));
+      nodeIdWriter.reset(new _writer_bits::
+			 IdWriter<Node, NodeIdWriter>(_nodeIdWriter));
     } 
 
     /// \brief Destructor.
@@ -805,7 +797,8 @@
       checkConcept<concept::ReadMap<UndirEdge, typename Map::Value>, Map>();
       checkConcept<_writer_bits::ItemWriter<typename Map::Value>, Writer>();
       writers.push_back(
-	make_pair(name, new MapWriter<UndirEdge, Map, Writer>(map, writer)));
+	make_pair(name, new _writer_bits::
+		  MapWriter<UndirEdge, Map, Writer>(map, writer)));
       return *this;
     }
 
@@ -928,17 +921,17 @@
 
   private:
 
-    typedef std::vector<std::pair<std::string, 
-				  WriterBase<UndirEdge>*> > MapWriters;
+    typedef std::vector<std::pair<std::string, _writer_bits::
+				  MapWriterBase<UndirEdge>*> > MapWriters;
     MapWriters writers;
 
-    WriterBase<UndirEdge>* idMap;
+    _writer_bits::MapWriterBase<UndirEdge>* idMap;
     bool forceIdMap;
    
     const Graph& graph;   
     std::string id;
 
-    std::auto_ptr<IdWriterBase<Node> > nodeIdWriter;
+    std::auto_ptr<_writer_bits::IdWriterBase<Node> > nodeIdWriter;
   };
 
   /// \ingroup io_group
@@ -952,8 +945,8 @@
   ///
   /// \relates LemonWriter
   template <typename _Graph>
-  class NodeWriter : public CommonSectionWriterBase {
-    typedef CommonSectionWriterBase Parent;
+  class NodeWriter : public LemonWriter::SectionWriter {
+    typedef LemonWriter::SectionWriter Parent;
     typedef _Graph Graph;
     typedef typename Graph::Node Node;
   public:
@@ -968,7 +961,7 @@
 	       const std::string& _id = std::string()) 
       : Parent(_writer), id(_id) {
       checkConcept<_writer_bits::ItemIdWriter<Node>, _IdWriter>();
-      idWriter.reset(new IdWriter<Node, _IdWriter>(_idWriter));
+      idWriter.reset(new _writer_bits::IdWriter<Node, _IdWriter>(_idWriter));
     }
 
 
@@ -1020,7 +1013,7 @@
 
     typedef std::vector<std::pair<std::string, const Node*> > NodeWriters;
     NodeWriters writers;
-    std::auto_ptr<IdWriterBase<Node> > idWriter;
+    std::auto_ptr<_writer_bits::IdWriterBase<Node> > idWriter;
   };
 
   /// \ingroup io_group
@@ -1034,8 +1027,8 @@
   ///
   /// \relates LemonWriter
   template <typename _Graph>
-  class EdgeWriter : public CommonSectionWriterBase {
-    typedef CommonSectionWriterBase Parent;
+  class EdgeWriter : public LemonWriter::SectionWriter {
+    typedef LemonWriter::SectionWriter Parent;
     typedef _Graph Graph;
     typedef typename Graph::Edge Edge;
   public:
@@ -1050,7 +1043,7 @@
 	       const std::string& _id = std::string()) 
       : Parent(_writer), id(_id) {
       checkConcept<_writer_bits::ItemIdWriter<Edge>, _IdWriter>();
-      idWriter.reset(new IdWriter<Edge, _IdWriter>(_idWriter));
+      idWriter.reset(new _writer_bits::IdWriter<Edge, _IdWriter>(_idWriter));
     }
 
     /// \brief Destructor.
@@ -1101,7 +1094,7 @@
     typedef std::vector<std::pair<std::string, const Edge*> > EdgeWriters;
     EdgeWriters writers;
 
-    std::auto_ptr<IdWriterBase<Edge> > idWriter;
+    std::auto_ptr<_writer_bits::IdWriterBase<Edge> > idWriter;
   };
 
   /// \ingroup io_group
@@ -1115,8 +1108,8 @@
   ///
   /// \relates LemonWriter
   template <typename _Graph>
-  class UndirEdgeWriter : public CommonSectionWriterBase {
-    typedef CommonSectionWriterBase Parent;
+  class UndirEdgeWriter : public LemonWriter::SectionWriter {
+    typedef LemonWriter::SectionWriter Parent;
     typedef _Graph Graph;
     typedef typename Graph::Node Node;
     typedef typename Graph::Edge Edge;
@@ -1135,8 +1128,10 @@
       : Parent(_writer), id(_id) {
       checkConcept<_writer_bits::ItemIdWriter<Edge>, _IdWriter>();
       checkConcept<_writer_bits::ItemIdWriter<UndirEdge>, _IdWriter>();
-      undirEdgeIdWriter.reset(new IdWriter<UndirEdge, _IdWriter>(_idWriter));
-      edgeIdWriter.reset(new IdWriter<Edge, _IdWriter>(_idWriter));
+      undirEdgeIdWriter.reset(new _writer_bits::
+			      IdWriter<UndirEdge, _IdWriter>(_idWriter));
+      edgeIdWriter.reset(new _writer_bits::
+			 IdWriter<Edge, _IdWriter>(_idWriter));
     }
 
     /// \brief Destructor.
@@ -1202,11 +1197,11 @@
     typedef std::vector<std::pair<std::string, 
 				  const UndirEdge*> > UndirEdgeWriters;
     UndirEdgeWriters undirEdgeWriters;
-    std::auto_ptr<IdWriterBase<UndirEdge> > undirEdgeIdWriter;
+    std::auto_ptr<_writer_bits::IdWriterBase<UndirEdge> > undirEdgeIdWriter;
 
     typedef std::vector<std::pair<std::string, const Edge*> > EdgeWriters;
     EdgeWriters edgeWriters;
-    std::auto_ptr<IdWriterBase<Edge> > edgeIdWriter;
+    std::auto_ptr<_writer_bits::IdWriterBase<Edge> > edgeIdWriter;
 
   };
 
@@ -1222,8 +1217,8 @@
   ///
   /// \relates LemonWriter
   template <typename _Traits = DefaultWriterTraits>
-  class AttributeWriter : public CommonSectionWriterBase {
-    typedef CommonSectionWriterBase Parent;
+  class AttributeWriter : public LemonWriter::SectionWriter {
+    typedef LemonWriter::SectionWriter Parent;
     typedef _Traits Traits; 
   public:
     /// \brief Constructor.
@@ -1267,8 +1262,8 @@
 				    const Value& value,
 				    const Writer& writer = Writer()) {
       checkConcept<_writer_bits::ItemWriter<Value>, Writer>();
-      writers.push_back(make_pair(name, new ValueWriter<Value, Writer>
-      			       (value, writer)));
+      writers.push_back(make_pair(name, new _writer_bits::
+				  ValueWriter<Value, Writer>(value, writer)));
       return *this;
     }
 
@@ -1296,7 +1291,8 @@
   private:
     std::string id;
 
-    typedef std::vector<std::pair<std::string, ValueWriterBase*> > Writers;
+    typedef std::vector<std::pair<std::string, 
+				  _writer_bits::ValueWriterBase*> > Writers;
     Writers writers;  
   };
 

Modified: hugo/trunk/test/heap_test.cc
==============================================================================
--- hugo/trunk/test/heap_test.cc	(original)
+++ hugo/trunk/test/heap_test.cc	Sat Dec  3 19:17:29 2005
@@ -56,7 +56,7 @@
   std::ifstream input(f_name.c_str());
   check(input, "Input file '" << f_name << "' not found.");
   GraphReader<Graph>(input, graph).
-    readEdgeMap("length", length).
+    readEdgeMap("capacity", length).
     readNode("source", start).
     run();  
  



More information about the Lemon-commits mailing list