[Lemon-commits] [lemon_svn] deba: r1956 - hugo/trunk/lemon
Lemon SVN
svn at lemon.cs.elte.hu
Mon Nov 6 20:49:03 CET 2006
Author: deba
Date: Mon Jun 13 19:13:56 2005
New Revision: 1956
Modified:
hugo/trunk/lemon/graph_reader.h
hugo/trunk/lemon/lemon_reader.h
hugo/trunk/lemon/lemon_writer.h
Log:
Some bug fix.
Added: Concept check for maps and IdReader/Writer classes
Some runtime check
Modified: hugo/trunk/lemon/graph_reader.h
==============================================================================
--- hugo/trunk/lemon/graph_reader.h (original)
+++ hugo/trunk/lemon/graph_reader.h Mon Jun 13 19:13:56 2005
@@ -261,6 +261,7 @@
/// Add a new labeled edge reader for the reader.
GraphReader& readEdge(std::string name, Edge& edge) {
edge_reader.readEdge(name, edge);
+ return *this;
}
/// \brief Add a new attribute reader command.
Modified: hugo/trunk/lemon/lemon_reader.h
==============================================================================
--- hugo/trunk/lemon/lemon_reader.h (original)
+++ hugo/trunk/lemon/lemon_reader.h Mon Jun 13 19:13:56 2005
@@ -36,10 +36,33 @@
#include <lemon/utility.h>
#include <lemon/bits/item_reader.h>
+#include <lemon/concept_check.h>
+#include <lemon/concept/maps.h>
namespace lemon {
namespace _reader_bits {
+
+ template <typename Item>
+ class ItemIdReader {
+ public:
+
+ bool isIdReader() { return true; }
+
+ Item readId(std::istream&, Item) { return Item();}
+
+ template <class _ItemIdReader>
+ 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 <typename T>
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 <typename _Item, typename _BoxedIdReader>
@@ -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<Node, NodeIdReader>(_nodeIdReader)) {}
-
+ : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {
+ checkConcept<_reader_bits::ItemIdReader<Node>, NodeIdReader>();
+ nodeIdReader.reset(new IdReader<Node, NodeIdReader>(_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<ReaderBase<Edge>* > 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<Node, NodeIdReader>(_nodeIdReader)) {}
-
+ : Parent(_reader), graph(_graph), id(_id), skipper(_skipper) {
+ checkConcept<_reader_bits::ItemIdReader<Node>, NodeIdReader>();
+ nodeIdReader.reset(new IdReader<Node, NodeIdReader>(_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<ReaderBase<UndirEdge>* > index;
std::string line;
@@ -1302,8 +1338,10 @@
template <typename _IdReader>
NodeReader(LemonReader& _reader, const _IdReader& _idReader,
const std::string& _id = std::string())
- : Parent(_reader), id(_id),
- idReader(new IdReader<typename Graph::Node, _IdReader>(_idReader)) {}
+ : Parent(_reader), id(_id) {
+ checkConcept<_reader_bits::ItemIdReader<Node>, _IdReader>();
+ idReader.reset(new IdReader<Node, _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 <typename _IdReader>
EdgeReader(LemonReader& _reader, const _IdReader& _idReader,
const std::string& _id = std::string())
- : Parent(_reader), id(_id),
- idReader(new IdReader<typename Graph::Edge, _IdReader>(_idReader)) {}
+ : Parent(_reader), id(_id) {
+ checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
+ idReader.reset(new IdReader<Edge, _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 <typename _IdReader>
UndirEdgeReader(LemonReader& _reader, const _IdReader& _idReader,
const std::string& _id = std::string())
- : Parent(_reader), id(_id),
- undirEdgeIdReader(new IdReader<UndirEdge, _IdReader>(_idReader)),
- edgeIdReader(new IdReader<Edge, _IdReader>(_idReader))
- {}
+ : Parent(_reader), id(_id) {
+ checkConcept<_reader_bits::ItemIdReader<UndirEdge>, _IdReader>();
+ checkConcept<_reader_bits::ItemIdReader<Edge>, _IdReader>();
+ undirEdgeIdReader.reset(new IdReader<UndirEdge, _IdReader>(_idReader));
+ egdeIdReader.reset(new IdReader<Edge, _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);
Modified: hugo/trunk/lemon/lemon_writer.h
==============================================================================
--- hugo/trunk/lemon/lemon_writer.h (original)
+++ hugo/trunk/lemon/lemon_writer.h Mon Jun 13 19:13:56 2005
@@ -36,9 +36,38 @@
#include <lemon/utility.h>
#include <lemon/maps.h>
+#include <lemon/concept_check.h>
+#include <lemon/concept/maps.h>
+
namespace lemon {
+ namespace _writer_bits {
+
+ template <typename Item>
+ class ItemIdWriter {
+ public:
+
+ bool isIdWriter() { return true; }
+
+ void writeId(std::ostream&, const Item&) {}
+
+ 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;
+ };
+
+ };
+
+ }
+
/// \ingroup io_group
/// \brief Lemon Format writer class.
///
@@ -229,6 +258,7 @@
public:
typedef _Item Item;
virtual void write(std::ostream&, const Item&) const = 0;
+ virtual bool isIdWriter() const = 0;
};
template <typename _Item, typename _BoxedIdWriter>
@@ -245,6 +275,10 @@
virtual void write(std::ostream& os, const Item& item) const {
idWriter.writeId(os, item);
}
+
+ virtual bool isIdWriter() const {
+ return idWriter.isIdWriter();
+ }
};
};
@@ -318,6 +352,7 @@
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>();
writers.push_back(
make_pair(name, new MapWriter<Node, Map, Writer>(map, writer)));
return *this;
@@ -446,8 +481,10 @@
const std::string& _id = std::string(),
bool _forceIdMap = true)
: Parent(_writer), idMap(0), forceIdMap(_forceIdMap),
- graph(_graph), id(_id),
- nodeIdWriter(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter)) {}
+ graph(_graph), id(_id) {
+ checkConcept<_writer_bits::ItemIdWriter<Node>, NodeIdWriter>();
+ nodeIdWriter.reset(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter));
+ }
/// \brief Destructor.
///
@@ -480,6 +517,7 @@
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>();
writers.push_back(
make_pair(name, new MapWriter<Edge, Map, Writer>(map, writer)));
return *this;
@@ -498,6 +536,9 @@
///
/// Write the content of the section.
virtual void write(std::ostream& os) {
+ if (!nodeIdWriter->isIdWriter()) {
+ throw DataFormatError("Cannot find nodeset or ID map");
+ }
for (int i = 0; i < (int)writers.size(); ++i) {
if (writers[i].first == "id") {
idMap = writers[i].second;
@@ -621,8 +662,10 @@
const std::string& _id = std::string(),
bool _forceIdMap = true)
: Parent(_writer), idMap(0), forceIdMap(_forceIdMap),
- graph(_graph), id(_id),
- nodeIdWriter(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter)) {}
+ graph(_graph), id(_id) {
+ checkConcept<_writer_bits::ItemIdWriter<Node>, NodeIdWriter>();
+ nodeIdWriter.reset(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter));
+ }
/// \brief Destructor.
///
@@ -655,6 +698,7 @@
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>();
writers.push_back(
make_pair(name, new MapWriter<UndirEdge, Map, Writer>(map, writer)));
return *this;
@@ -665,6 +709,7 @@
/// 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;
@@ -676,8 +721,9 @@
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>();
writeUndirEdge("+" + name, composeMap(forwardMap(graph), map), writer);
- writeUndirEdge("-" + name, composeMap(forwardMap(graph), map), writer);
+ writeUndirEdge("-" + name, composeMap(backwardMap(graph), map), writer);
return *this;
}
@@ -694,6 +740,9 @@
///
/// Write the content of the section.
virtual void write(std::ostream& os) {
+ if (!nodeIdWriter->isIdWriter()) {
+ throw DataFormatError("Cannot find nodeset or ID map");
+ }
for (int i = 0; i < (int)writers.size(); ++i) {
if (writers[i].first == "id") {
idMap = writers[i].second;
@@ -811,8 +860,11 @@
template <typename _IdWriter>
NodeWriter(LemonWriter& _writer, const _IdWriter& _idWriter,
const std::string& _id = std::string())
- : Parent(_writer), id(_id),
- idWriter(new IdWriter<typename Graph::Node, _IdWriter>(_idWriter)) {}
+ : Parent(_writer), id(_id) {
+ checkConcept<_writer_bits::ItemIdWriter<Node>, _IdWriter>();
+ idWriter.reset(new IdWriter<Node, _IdWriter>(_idWriter));
+ }
+
/// \brief Destructor.
///
@@ -846,6 +898,9 @@
///
/// Write the content of the section.
virtual void write(std::ostream& os) {
+ if (!idWriter->isIdWriter()) {
+ throw DataFormatError("Cannot find nodeset or ID map");
+ }
for (int i = 0; i < (int)writers.size(); ++i) {
os << writers[i].first << ' ';
idWriter->write(os, *(writers[i].second));
@@ -887,8 +942,10 @@
template <typename _IdWriter>
EdgeWriter(LemonWriter& _writer, const _IdWriter& _idWriter,
const std::string& _id = std::string())
- : Parent(_writer), id(_id),
- idWriter(new IdWriter<typename Graph::Edge, _IdWriter>(_idWriter)) {}
+ : Parent(_writer), id(_id) {
+ checkConcept<_writer_bits::ItemIdWriter<Edge>, _IdWriter>();
+ idWriter.reset(new IdWriter<Edge, _IdWriter>(_idWriter));
+ }
/// \brief Destructor.
///
@@ -921,6 +978,9 @@
///
/// Write the content of the section.
virtual void write(std::ostream& os) {
+ if (!idWriter->isIdWriter()) {
+ throw DataFormatError("Cannot find edgeset or ID map");
+ }
for (int i = 0; i < (int)writers.size(); ++i) {
os << writers[i].first << ' ';
idWriter->write(os, *(writers[i].second));
@@ -966,9 +1026,12 @@
template <typename _IdWriter>
UndirEdgeWriter(LemonWriter& _writer, const _IdWriter& _idWriter,
const std::string& _id = std::string())
- : Parent(_writer), id(_id),
- undirEdgeIdWriter(new IdWriter<UndirEdge, _IdWriter>(_idWriter)),
- edgeIdWriter(new IdWriter<Edge, _IdWriter>(_idWriter)) {}
+ : 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));
+ }
/// \brief Destructor.
///
@@ -1008,6 +1071,12 @@
///
/// Write the content of the section.
virtual void write(std::ostream& os) {
+ if (!edgeIdWriter->isIdWriter()) {
+ throw DataFormatError("Cannot find undirected edgeset or ID map");
+ }
+ if (!undirEdgeIdWriter->isIdWriter()) {
+ throw DataFormatError("Cannot find undirected edgeset or ID map");
+ }
for (int i = 0; i < (int)undirEdgeWriters.size(); ++i) {
os << undirEdgeWriters[i].first << ' ';
undirEdgeIdWriter->write(os, *(undirEdgeWriters[i].second));
More information about the Lemon-commits
mailing list