[Lemon-commits] [lemon_svn] deba: r1973 - hugo/trunk/lemon
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:49:11 CET 2006
Author: deba
Date: Wed Jun 15 12:10:59 2005
New Revision: 1973
Modified:
hugo/trunk/lemon/lemon_reader.h
hugo/trunk/lemon/lemon_writer.h
Log:
Correcting concept checks.
Modified: hugo/trunk/lemon/lemon_reader.h
==============================================================================
--- hugo/trunk/lemon/lemon_reader.h (original)
+++ hugo/trunk/lemon/lemon_reader.h Wed Jun 15 12:10:59 2005
@@ -49,20 +49,38 @@
bool isIdReader() { return true; }
- Item readId(std::istream&, Item) { return Item();}
+ void readId(std::istream&, Item&) {}
template <class _ItemIdReader>
struct Constraints {
void constraints() {
bool b = reader.isIdReader();
ignore_unused_variable_warning(b);
- Item item = reader.readId(is, Item());
+ Item item;
+ reader.readId(is, item);
}
_ItemIdReader& reader;
std::istream& is;
};
};
+
+ template <typename Item>
+ class ItemReader {
+ public:
+ void read(std::istream&, Item&) {}
+
+ template <class _ItemReader>
+ struct Constraints {
+ void constraints() {
+ Item item;
+ reader.read(is, item);
+ }
+ _ItemReader& reader;
+ std::istream& is;
+ };
+
+ };
template <typename T>
bool operator<(T, T) {
@@ -569,7 +587,9 @@
: boxedIdReader(_boxedIdReader) {}
virtual Item read(std::istream& is) const {
- return boxedIdReader.readId(is, Item());
+ Item item;
+ boxedIdReader.readId(is, item);
+ return item;
}
virtual bool isIdReader() const {
@@ -696,6 +716,8 @@
template <typename Reader, typename Map, typename MapParameter>
NodeSetReader& _readMap(std::string name, MapParameter map,
const Reader& reader = Reader()) {
+ checkConcept<concept::WriteMap<Node, typename Map::Value>, Map>();
+ checkConcept<_reader_bits::ItemReader<typename Map::Value>, Reader>();
if (readers.find(name) != readers.end()) {
ErrorMessage msg;
msg << "Multiple read rule for node map: " << name;
@@ -782,8 +804,8 @@
///
/// It reads an id from the stream and gives back which node belongs to
/// it. It is possible only if there was read an "id" named map.
- Node readId(std::istream& is, Node = Node()) const {
- return inverter->read(is);
+ void readId(std::istream& is, Node& node) const {
+ node = inverter->read(is);
}
private:
@@ -904,6 +926,8 @@
template <typename Reader, typename Map, typename MapParameter>
EdgeSetReader& _readMap(std::string name, MapParameter map,
const Reader& reader = Reader()) {
+ checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
+ checkConcept<_reader_bits::ItemReader<typename Map::Value>, Reader>();
if (readers.find(name) != readers.end()) {
ErrorMessage msg;
msg << "Multiple read rule for edge map: " << name;
@@ -995,8 +1019,8 @@
///
/// It reads an id from the stream and gives back which edge belongs to
/// it. It is possible only if there was read an "id" named map.
- Edge readId(std::istream& is, Edge = Edge()) const {
- return inverter->read(is);
+ void readId(std::istream& is, Edge& edge) const {
+ edge = inverter->read(is);
}
private:
@@ -1124,6 +1148,8 @@
template <typename Reader, typename Map, typename MapParameter>
UndirEdgeSetReader& _readMap(std::string name, MapParameter map,
const Reader& reader = Reader()) {
+ checkConcept<concept::WriteMap<UndirEdge, typename Map::Value>, Map>();
+ checkConcept<_reader_bits::ItemReader<typename Map::Value>, Reader>();
if (readers.find(name) != readers.end()) {
ErrorMessage msg;
msg << "Multiple read rule for edge map: " << name;
@@ -1190,7 +1216,9 @@
template <typename Reader, typename Map, typename MapParameter>
UndirEdgeSetReader& _readDirMap(std::string name, MapParameter map,
- const Reader& reader = Reader()) {
+ const Reader& reader = Reader()) {
+ checkConcept<_reader_bits::ItemReader<typename Map::Value>, Reader>();
+ checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
readMap("+" + name,
_reader_bits::writeComposeMap(map, forwardMap(graph)), reader);
readMap("-" + name,
@@ -1275,8 +1303,8 @@
///
/// It reads an id from the stream and gives back which undirected edge
/// belongs to it. It is possible only if there was read an "id" named map.
- UndirEdge readId(std::istream& is, UndirEdge = UndirEdge()) const {
- return inverter->read(is);
+ void readId(std::istream& is, UndirEdge& undirEdge) const {
+ undirEdge = inverter->read(is);
}
/// \brief Gives back the directed edge by its id.
@@ -1285,14 +1313,14 @@
/// belongs to it. The directed edge id is the \c '+' or \c '-' character
/// and the undirected edge id. It is possible only if there was read
/// an "id" named map.
- Edge readId(std::istream& is, Edge = Edge()) const {
+ void readId(std::istream& is, Edge& edge) const {
char c;
is >> c;
UndirEdge undirEdge = inverter->read(is);
if (c == '+') {
- return graph.edgeWithSource(undirEdge, graph.source(undirEdge));
+ edge = graph.edgeWithSource(undirEdge, graph.source(undirEdge));
} else if (c == '-') {
- return graph.edgeWithSource(undirEdge, graph.target(undirEdge));
+ edge = graph.edgeWithSource(undirEdge, graph.target(undirEdge));
} else {
throw DataFormatError("Wrong id format for edge "
"in undirected edgeset");
@@ -1340,7 +1368,7 @@
const std::string& _id = std::string())
: Parent(_reader), id(_id) {
checkConcept<_reader_bits::ItemIdReader<Node>, _IdReader>();
- idReader.reset(new IdReader<Node, _IdReader>(_idReader));
+ nodeIdReader.reset(new IdReader<Node, _IdReader>(_idReader));
}
/// \brief Destructor.
@@ -1385,7 +1413,7 @@
///
/// It reads the content of the section.
virtual void read(std::istream& is) {
- if (!idReader->isIdReader()) {
+ if (!nodeIdReader->isIdReader()) {
throw DataFormatError("Cannot find nodeset or ID map");
}
std::string line;
@@ -1395,7 +1423,7 @@
ls >> id;
typename NodeReaders::iterator it = readers.find(id);
if (it != readers.end()) {
- *(it->second) = idReader->read(ls);
+ *(it->second) = nodeIdReader->read(ls);
}
}
}
@@ -1406,7 +1434,7 @@
typedef std::map<std::string, Node*> NodeReaders;
NodeReaders readers;
- std::auto_ptr<IdReaderBase<Node> > idReader;
+ std::auto_ptr<IdReaderBase<Node> > nodeIdReader;
};
/// \ingroup io_group
@@ -1437,7 +1465,7 @@
const std::string& _id = std::string())
: Parent(_reader), id(_id) {
checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
- idReader.reset(new IdReader<Edge, _IdReader>(_idReader));
+ edgeIdReader.reset(new IdReader<Edge, _IdReader>(_idReader));
}
/// \brief Destructor.
@@ -1481,7 +1509,7 @@
///
/// It reads the content of the section.
virtual void read(std::istream& is) {
- if (!idReader->isIdReader()) {
+ if (!edgeIdReader->isIdReader()) {
throw DataFormatError("Cannot find edgeset or ID map");
}
std::string line;
@@ -1491,7 +1519,7 @@
ls >> id;
typename EdgeReaders::iterator it = readers.find(id);
if (it != readers.end()) {
- *(it->second) = idReader->read(ls);
+ *(it->second) = edgeIdReader->read(ls);
}
}
}
@@ -1502,7 +1530,7 @@
typedef std::map<std::string, Edge*> EdgeReaders;
EdgeReaders readers;
- std::auto_ptr<IdReaderBase<Edge> > idReader;
+ std::auto_ptr<IdReaderBase<Edge> > edgeIdReader;
};
/// \ingroup io_group
@@ -1688,6 +1716,7 @@
template <typename Reader, typename Value>
AttributeReader& readAttribute(const std::string& name, Value& value,
const Reader& reader = Reader()) {
+ checkConcept<_reader_bits::ItemReader<Value>, Reader>();
if (readers.find(name) != readers.end()) {
ErrorMessage msg;
msg << "Multiple read rule for attribute: " << name;
Modified: hugo/trunk/lemon/lemon_writer.h
==============================================================================
--- hugo/trunk/lemon/lemon_writer.h (original)
+++ hugo/trunk/lemon/lemon_writer.h Wed Jun 15 12:10:59 2005
@@ -55,13 +55,31 @@
template <class _ItemIdWriter>
struct Constraints {
void constraints() {
- const Item item;
bool b = writer.isIdWriter();
ignore_unused_variable_warning(b);
writer.writeId(os, item);
}
_ItemIdWriter& writer;
std::ostream& os;
+ const Item& item;
+ };
+
+ };
+
+ template <typename Item>
+ class ItemWriter {
+ public:
+
+ void write(std::ostream&, const Item&) {}
+
+ template <class _ItemWriter>
+ struct Constraints {
+ void constraints() {
+ writer.write(os, item);
+ }
+ _ItemWriter& writer;
+ std::ostream& os;
+ const Item& item;
};
};
@@ -352,7 +370,8 @@
template <typename Writer, typename Map>
NodeSetWriter& writeNodeMap(std::string name, const Map& map,
const Writer& writer = Writer()) {
- checkConcept<concept::WriteMap<Node, typename Map::Value>, Map>();
+ 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)));
return *this;
@@ -517,7 +536,8 @@
template <typename Writer, typename Map>
EdgeSetWriter& writeEdgeMap(std::string name, const Map& map,
const Writer& writer = Writer()) {
- checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
+ 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)));
return *this;
@@ -698,7 +718,8 @@
template <typename Writer, typename Map>
UndirEdgeSetWriter& writeUndirEdgeMap(std::string name, const Map& map,
const Writer& writer = Writer()) {
- checkConcept<concept::WriteMap<UndirEdge, typename Map::Value>, Map>();
+ 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)));
return *this;
@@ -709,10 +730,8 @@
/// Add a new directed map writer command for the writer.
template <typename Map>
UndirEdgeSetWriter& writeEdgeMap(std::string name, const Map& map) {
- checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
- writeUndirEdgeMap("+" + name, composeMap(forwardMap(graph), map));
- writeUndirEdgeMap("-" + name, composeMap(backwardMap(graph), map));
- return *this;
+ return writeEdgeMap<typename Traits::
+ template Writer<typename Map::Value>, Map>(name, map);
}
/// \brief Add a new directed map writer command for the writer.
@@ -721,7 +740,8 @@
template <typename Writer, typename Map>
UndirEdgeSetWriter& writeEdgeMap(std::string name, const Map& map,
const Writer& writer = Writer()) {
- checkConcept<concept::WriteMap<Edge, typename Map::Value>, Map>();
+ checkConcept<concept::ReadMap<Edge, typename Map::Value>, Map>();
+ checkConcept<_writer_bits::ItemWriter<typename Map::Value>, Writer>();
writeUndirEdge("+" + name, composeMap(forwardMap(graph), map), writer);
writeUndirEdge("-" + name, composeMap(backwardMap(graph), map), writer);
return *this;
@@ -1160,6 +1180,7 @@
AttributeWriter& writeAttribute(const std::string& name,
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)));
return *this;
More information about the Lemon-commits
mailing list