2 * src/lemon/graph_reader.h - Part of LEMON, a generic C++ optimization library
4 * Copyright (C) 2004 Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
5 * (Egervary Combinatorial Optimization Research Group, EGRES).
7 * Permission to use, modify and distribute this software is granted
8 * provided that this copyright notice appears in all copies. For
9 * precise terms see the accompanying LICENSE file.
11 * This software is provided "AS IS" with no warranty of any kind,
12 * express or implied, and with no claim as to its suitability for any
19 ///\brief Map utilities.
27 #include <lemon/error.h>
29 /// \todo fix exceptions
34 struct DefaultReaderTraits {
36 template <typename _Value>
39 void read(std::istream& is, Value& value) {
44 template <typename _Value>
47 void read(std::istream& is) {
53 struct DefaultSkipper {
54 void read(std::istream& is) {
62 virtual string message() = 0;
65 class FileReaderException {
66 virtual int getLine() = 0;
71 template <typename _Graph, typename _ReaderTraits = DefaultReaderTraits>
77 typedef typename Graph::Node Node;
78 typedef typename Graph::Edge Edge;
80 typedef _ReaderTraits ReaderTraits;
83 GraphReader(std::istream& _is, Graph& _graph) : is(_is), graph(_graph) {}
85 template <typename Map>
86 GraphReader& readNodeMap(std::string name, Map& map,
87 const typename ReaderTraits::template Reader<typename Map::Value>& reader =
88 typename ReaderTraits::template Reader<typename Map::Value>()) {
89 return readNodeMap<Map, typename ReaderTraits::template Reader<typename Map::Value> >(name, map, reader);
92 template <typename Map, typename Reader>
93 GraphReader& readNodeMap(std::string name, Map& map, const Reader& reader = Reader()) {
94 node_readers.insert(make_pair(name, new MapReader<Node, Map, Reader>(map, reader)));
98 template <typename Map>
99 GraphReader& readEdgeMap(std::string name, Map& map,
100 const typename ReaderTraits::template Reader<typename Map::Value>& reader =
101 typename ReaderTraits::template Reader<typename Map::Value>()) {
102 return readEdgeMap<Map, typename ReaderTraits::template Reader<typename Map::Value> >(name, map, reader);
105 template <typename Map, typename Reader>
106 GraphReader& readEdgeMap(std::string name, Map& map, const Reader& reader = Reader()) {
107 edge_readers.insert(make_pair(name, new MapReader<Edge, Map, Reader>(map, reader)));
113 readNodeSet(line_num);
114 readEdgeSet(line_num);
116 std::string line = readNotEmptyLine(is, line_num);
122 void readNodeSet(int& line_num) {
125 std::string line = readNotEmptyLine(is, line_num);
127 std::vector<MapReaderBase<Node>*> index;
129 std::string line = readNotEmptyLine(is, line_num);
131 std::istringstream ls(line);
133 typename map<std::string, MapReaderBase<Node>* >::iterator it = node_readers.find(id);
134 if (it != node_readers.end()) {
135 index.push_back(it->second);
143 while (line = readNotEmptyLine(is, line_num), line[0] != '@') {
144 Node node = graph.addNode();
145 std::istringstream ls(line);
146 for (int i = 0; i < n; ++i) {
148 index[i]->read(ls, node);
150 default_skipper.read(ls);
156 void readEdgeSet(int& line_num) {
160 std::string readNotEmptyLine(std::istream& is, int& line_num) {
162 while (++line_num, getline(is, line)) {
163 int vi = line.find_first_not_of(" \t");
164 if (vi != string::npos && line[vi] != '#') {
165 return line.substr(vi);
174 typename ReaderTraits::DefaultSkipper default_skipper;
176 template <typename _Item>
177 class MapReaderBase {
180 virtual void read(istream& is, const Item& item) = 0;
183 template <typename _Item, typename _Map, typename _Reader>
184 class MapReader : public MapReaderBase<_Item> {
187 typedef _Reader Reader;
193 MapReader(Map& _map, const Reader& _reader)
194 : map(_map), reader(_reader) {}
197 virtual void read(istream& is, const Item& item) {
198 typename Reader::Value value;
199 reader.read(is, value);
200 map.set(item, value);
204 typedef std::map<std::string, MapReaderBase<Node>* > NodeReaders;
205 NodeReaders node_readers;
207 typedef std::map<std::string, MapReaderBase<Edge>* > EdgeReaders;
208 EdgeReaders edge_readers;