1.1 --- a/lemon/lemon_reader.h Mon Jun 13 16:10:36 2005 +0000
1.2 +++ b/lemon/lemon_reader.h Mon Jun 13 17:13:56 2005 +0000
1.3 @@ -36,10 +36,33 @@
1.4 #include <lemon/utility.h>
1.5 #include <lemon/bits/item_reader.h>
1.6
1.7 +#include <lemon/concept_check.h>
1.8 +#include <lemon/concept/maps.h>
1.9
1.10 namespace lemon {
1.11
1.12 namespace _reader_bits {
1.13 +
1.14 + template <typename Item>
1.15 + class ItemIdReader {
1.16 + public:
1.17 +
1.18 + bool isIdReader() { return true; }
1.19 +
1.20 + Item readId(std::istream&, Item) { return Item();}
1.21 +
1.22 + template <class _ItemIdReader>
1.23 + struct Constraints {
1.24 + void constraints() {
1.25 + bool b = reader.isIdReader();
1.26 + ignore_unused_variable_warning(b);
1.27 + Item item = reader.readId(is, Item());
1.28 + }
1.29 + _ItemIdReader& reader;
1.30 + std::istream& is;
1.31 + };
1.32 +
1.33 + };
1.34
1.35 template <typename T>
1.36 bool operator<(T, T) {
1.37 @@ -531,6 +554,7 @@
1.38 public:
1.39 typedef _Item Item;
1.40 virtual Item read(std::istream& is) const = 0;
1.41 + virtual bool isIdReader() const = 0;
1.42 };
1.43
1.44 template <typename _Item, typename _BoxedIdReader>
1.45 @@ -547,6 +571,10 @@
1.46 virtual Item read(std::istream& is) const {
1.47 return boxedIdReader.readId(is, Item());
1.48 }
1.49 +
1.50 + virtual bool isIdReader() const {
1.51 + return boxedIdReader.isIdReader();
1.52 + }
1.53 };
1.54
1.55 class ValueReaderBase {
1.56 @@ -817,9 +845,10 @@
1.57 const NodeIdReader& _nodeIdReader,
1.58 const std::string& _id = std::string(),
1.59 const DefaultSkipper& _skipper = DefaultSkipper())
1.60 - : Parent(_reader), graph(_graph), id(_id), skipper(_skipper),
1.61 - nodeIdReader(new IdReader<Node, NodeIdReader>(_nodeIdReader)) {}
1.62 -
1.63 + : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {
1.64 + checkConcept<_reader_bits::ItemIdReader<Node>, NodeIdReader>();
1.65 + nodeIdReader.reset(new IdReader<Node, NodeIdReader>(_nodeIdReader));
1.66 + }
1.67 /// \brief Destructor.
1.68 ///
1.69 /// Destructor for EdgeSetReader.
1.70 @@ -921,6 +950,9 @@
1.71 ///
1.72 /// It reads the content of the section.
1.73 virtual void read(std::istream& is) {
1.74 + if (!nodeIdReader->isIdReader()) {
1.75 + throw DataFormatError("Cannot find nodeset or ID map");
1.76 + }
1.77 std::vector<ReaderBase<Edge>* > index;
1.78 std::string line;
1.79
1.80 @@ -1033,9 +1065,10 @@
1.81 const NodeIdReader& _nodeIdReader,
1.82 const std::string& _id = std::string(),
1.83 const DefaultSkipper& _skipper = DefaultSkipper())
1.84 - : Parent(_reader), graph(_graph), id(_id), skipper(_skipper),
1.85 - nodeIdReader(new IdReader<Node, NodeIdReader>(_nodeIdReader)) {}
1.86 -
1.87 + : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {
1.88 + checkConcept<_reader_bits::ItemIdReader<Node>, NodeIdReader>();
1.89 + nodeIdReader.reset(new IdReader<Node, NodeIdReader>(_nodeIdReader));
1.90 + }
1.91 /// \brief Destructor.
1.92 ///
1.93 /// Destructor for UndirEdgeSetReader.
1.94 @@ -1197,6 +1230,9 @@
1.95 ///
1.96 /// It reads the content of the section.
1.97 virtual void read(std::istream& is) {
1.98 + if (!nodeIdReader->isIdReader()) {
1.99 + throw DataFormatError("Cannot find nodeset or ID map");
1.100 + }
1.101 std::vector<ReaderBase<UndirEdge>* > index;
1.102 std::string line;
1.103
1.104 @@ -1302,8 +1338,10 @@
1.105 template <typename _IdReader>
1.106 NodeReader(LemonReader& _reader, const _IdReader& _idReader,
1.107 const std::string& _id = std::string())
1.108 - : Parent(_reader), id(_id),
1.109 - idReader(new IdReader<typename Graph::Node, _IdReader>(_idReader)) {}
1.110 + : Parent(_reader), id(_id) {
1.111 + checkConcept<_reader_bits::ItemIdReader<Node>, _IdReader>();
1.112 + idReader.reset(new IdReader<Node, _IdReader>(_idReader));
1.113 + }
1.114
1.115 /// \brief Destructor.
1.116 ///
1.117 @@ -1347,6 +1385,9 @@
1.118 ///
1.119 /// It reads the content of the section.
1.120 virtual void read(std::istream& is) {
1.121 + if (!idReader->isIdReader()) {
1.122 + throw DataFormatError("Cannot find nodeset or ID map");
1.123 + }
1.124 std::string line;
1.125 while (getline(is, line)) {
1.126 std::istringstream ls(line);
1.127 @@ -1394,8 +1435,10 @@
1.128 template <typename _IdReader>
1.129 EdgeReader(LemonReader& _reader, const _IdReader& _idReader,
1.130 const std::string& _id = std::string())
1.131 - : Parent(_reader), id(_id),
1.132 - idReader(new IdReader<typename Graph::Edge, _IdReader>(_idReader)) {}
1.133 + : Parent(_reader), id(_id) {
1.134 + checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
1.135 + idReader.reset(new IdReader<Edge, _IdReader>(_idReader));
1.136 + }
1.137
1.138 /// \brief Destructor.
1.139 ///
1.140 @@ -1438,6 +1481,9 @@
1.141 ///
1.142 /// It reads the content of the section.
1.143 virtual void read(std::istream& is) {
1.144 + if (!idReader->isIdReader()) {
1.145 + throw DataFormatError("Cannot find edgeset or ID map");
1.146 + }
1.147 std::string line;
1.148 while (getline(is, line)) {
1.149 std::istringstream ls(line);
1.150 @@ -1487,10 +1533,12 @@
1.151 template <typename _IdReader>
1.152 UndirEdgeReader(LemonReader& _reader, const _IdReader& _idReader,
1.153 const std::string& _id = std::string())
1.154 - : Parent(_reader), id(_id),
1.155 - undirEdgeIdReader(new IdReader<UndirEdge, _IdReader>(_idReader)),
1.156 - edgeIdReader(new IdReader<Edge, _IdReader>(_idReader))
1.157 - {}
1.158 + : Parent(_reader), id(_id) {
1.159 + checkConcept<_reader_bits::ItemIdReader<UndirEdge>, _IdReader>();
1.160 + checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
1.161 + undirEdgeIdReader.reset(new IdReader<UndirEdge, _IdReader>(_idReader));
1.162 + egdeIdReader.reset(new IdReader<Edge, _IdReader>(_idReader));
1.163 + }
1.164
1.165 /// \brief Destructor.
1.166 ///
1.167 @@ -1545,6 +1593,12 @@
1.168 ///
1.169 /// It reads the content of the section.
1.170 virtual void read(std::istream& is) {
1.171 + if (!edgeIdReader->isIdReader()) {
1.172 + throw DataFormatError("Cannot find undirected edgeset or ID map");
1.173 + }
1.174 + if (!undirEdgeIdReader->isIdReader()) {
1.175 + throw DataFormatError("Cannot find undirected edgeset or ID map");
1.176 + }
1.177 std::string line;
1.178 while (getline(is, line)) {
1.179 std::istringstream ls(line);