diff -r 21aa0195aab9 -r 182da222fceb lemon/lemon_reader.h --- a/lemon/lemon_reader.h Mon Jun 13 16:10:36 2005 +0000 +++ b/lemon/lemon_reader.h Mon Jun 13 17:13:56 2005 +0000 @@ -36,10 +36,33 @@ #include #include +#include +#include namespace lemon { namespace _reader_bits { + + template + class ItemIdReader { + public: + + bool isIdReader() { return true; } + + Item readId(std::istream&, Item) { return Item();} + + template + struct Constraints { + void constraints() { + bool b = reader.isIdReader(); + ignore_unused_variable_warning(b); + Item item = reader.readId(is, Item()); + } + _ItemIdReader& reader; + std::istream& is; + }; + + }; template bool operator<(T, T) { @@ -531,6 +554,7 @@ public: typedef _Item Item; virtual Item read(std::istream& is) const = 0; + virtual bool isIdReader() const = 0; }; template @@ -547,6 +571,10 @@ virtual Item read(std::istream& is) const { return boxedIdReader.readId(is, Item()); } + + virtual bool isIdReader() const { + return boxedIdReader.isIdReader(); + } }; class ValueReaderBase { @@ -817,9 +845,10 @@ const NodeIdReader& _nodeIdReader, const std::string& _id = std::string(), const DefaultSkipper& _skipper = DefaultSkipper()) - : Parent(_reader), graph(_graph), id(_id), skipper(_skipper), - nodeIdReader(new IdReader(_nodeIdReader)) {} - + : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) { + checkConcept<_reader_bits::ItemIdReader, NodeIdReader>(); + nodeIdReader.reset(new IdReader(_nodeIdReader)); + } /// \brief Destructor. /// /// Destructor for EdgeSetReader. @@ -921,6 +950,9 @@ /// /// It reads the content of the section. virtual void read(std::istream& is) { + if (!nodeIdReader->isIdReader()) { + throw DataFormatError("Cannot find nodeset or ID map"); + } std::vector* > index; std::string line; @@ -1033,9 +1065,10 @@ const NodeIdReader& _nodeIdReader, const std::string& _id = std::string(), const DefaultSkipper& _skipper = DefaultSkipper()) - : Parent(_reader), graph(_graph), id(_id), skipper(_skipper), - nodeIdReader(new IdReader(_nodeIdReader)) {} - + : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) { + checkConcept<_reader_bits::ItemIdReader, NodeIdReader>(); + nodeIdReader.reset(new IdReader(_nodeIdReader)); + } /// \brief Destructor. /// /// Destructor for UndirEdgeSetReader. @@ -1197,6 +1230,9 @@ /// /// It reads the content of the section. virtual void read(std::istream& is) { + if (!nodeIdReader->isIdReader()) { + throw DataFormatError("Cannot find nodeset or ID map"); + } std::vector* > index; std::string line; @@ -1302,8 +1338,10 @@ template NodeReader(LemonReader& _reader, const _IdReader& _idReader, const std::string& _id = std::string()) - : Parent(_reader), id(_id), - idReader(new IdReader(_idReader)) {} + : Parent(_reader), id(_id) { + checkConcept<_reader_bits::ItemIdReader, _IdReader>(); + idReader.reset(new IdReader(_idReader)); + } /// \brief Destructor. /// @@ -1347,6 +1385,9 @@ /// /// It reads the content of the section. virtual void read(std::istream& is) { + if (!idReader->isIdReader()) { + throw DataFormatError("Cannot find nodeset or ID map"); + } std::string line; while (getline(is, line)) { std::istringstream ls(line); @@ -1394,8 +1435,10 @@ template EdgeReader(LemonReader& _reader, const _IdReader& _idReader, const std::string& _id = std::string()) - : Parent(_reader), id(_id), - idReader(new IdReader(_idReader)) {} + : Parent(_reader), id(_id) { + checkConcept<_reader_bits::ItemIdReader, _IdReader>(); + idReader.reset(new IdReader(_idReader)); + } /// \brief Destructor. /// @@ -1438,6 +1481,9 @@ /// /// It reads the content of the section. virtual void read(std::istream& is) { + if (!idReader->isIdReader()) { + throw DataFormatError("Cannot find edgeset or ID map"); + } std::string line; while (getline(is, line)) { std::istringstream ls(line); @@ -1487,10 +1533,12 @@ template UndirEdgeReader(LemonReader& _reader, const _IdReader& _idReader, const std::string& _id = std::string()) - : Parent(_reader), id(_id), - undirEdgeIdReader(new IdReader(_idReader)), - edgeIdReader(new IdReader(_idReader)) - {} + : Parent(_reader), id(_id) { + checkConcept<_reader_bits::ItemIdReader, _IdReader>(); + checkConcept<_reader_bits::ItemIdReader, _IdReader>(); + undirEdgeIdReader.reset(new IdReader(_idReader)); + egdeIdReader.reset(new IdReader(_idReader)); + } /// \brief Destructor. /// @@ -1545,6 +1593,12 @@ /// /// It reads the content of the section. virtual void read(std::istream& is) { + if (!edgeIdReader->isIdReader()) { + throw DataFormatError("Cannot find undirected edgeset or ID map"); + } + if (!undirEdgeIdReader->isIdReader()) { + throw DataFormatError("Cannot find undirected edgeset or ID map"); + } std::string line; while (getline(is, line)) { std::istringstream ls(line);