Changeset 1037:3eaff8d04171 in lemon-0.x for src/work/deba/graph_reader.h
- Timestamp:
- 12/15/04 20:56:55 (19 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@1427
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/work/deba/graph_reader.h
r1036 r1037 25 25 #include <vector> 26 26 27 #include <memory> 28 27 29 #include <lemon/error.h> 28 30 … … 49 51 }; 50 52 51 class StreamException : public IOException { 53 template <typename _Exception> 54 class StreamException : public _Exception { 52 55 public: 53 virtual int line() = 0; 56 typedef _Exception Exception; 57 StreamException(int _line, Exception _exception) 58 : line_num(_line), Exception(_exception) {} 59 virtual int line() const { 60 return line_num; 61 } 62 virtual std::string what() const { 63 ostringstream os; 64 os << Exception::what() << " in line " << line(); 65 return os.str(); 66 } 54 67 private: 55 IOException* exception;56 68 int line_num; 57 69 }; … … 85 97 value.clear(); 86 98 is >> ws; 87 if (!is.get(c) || c != '\"') throw DataFormatException("Quoted string format exception");99 if (!is.get(c) || c != '\"') throw DataFormatException("Quoted string format"); 88 100 while (is.get(c) && c != '\"') { 89 101 if (escaped && c == '\\') { … … 93 105 } 94 106 } 95 if (!is) throw DataFormatException("Quoted string format exception");107 if (!is) throw DataFormatException("Quoted string format"); 96 108 } 97 109 … … 172 184 template <typename _Graph, typename _ReaderTraits = DefaultReaderTraits> 173 185 class GraphReader { 174 175 186 public: 176 187 … … 182 193 typedef typename ReaderTraits::DefaultReader DefaultReader; 183 194 184 GraphReader( istream& _is, Graph& _graph, const DefaultReader& _reader = DefaultReader())195 GraphReader(std::istream& _is, Graph& _graph, const DefaultReader& _reader = DefaultReader()) 185 196 : is(_is), graph(_graph), nodeSkipper(_reader), edgeSkipper(_reader) {} 186 197 … … 188 199 ~GraphReader() { 189 200 190 for (typename Node Readers::iterator it = node_readers.begin(); it != node_readers.end(); ++it) {201 for (typename NodeMapReaders::iterator it = node_map_readers.begin(); it != node_map_readers.end(); ++it) { 191 202 delete it->second; 192 203 } 193 204 194 for (typename Edge Readers::iterator it = edge_readers.begin(); it != edge_readers.end(); ++it) {205 for (typename EdgeMapReaders::iterator it = edge_map_readers.begin(); it != edge_map_readers.end(); ++it) { 195 206 delete it->second; 196 207 } 197 208 198 209 } 210 211 // Node map rules 199 212 200 213 template <typename Map> … … 205 218 template <typename Reader, typename Map> 206 219 GraphReader& readNodeMap(std::string name, Map& map, const Reader& reader = Reader()) { 207 if (node_readers.find(name) != node_readers.end()) { 208 Exception e; 209 e << "Multiple read rule for node map: " << name; 210 throw e; 211 } 212 node_readers.insert(make_pair(name, new MapReader<Node, Map, Reader>(map, reader))); 220 if (node_map_readers.find(name) != node_map_readers.end()) { 221 throw Exception() << "Multiple read rule for node map: " << name; 222 } 223 node_map_readers.insert(make_pair(name, new MapReader<Node, Map, Reader>(map, reader))); 213 224 return *this; 214 225 } … … 216 227 template <typename Reader> 217 228 GraphReader& skipNodeMap(std::string name, const Reader& reader = Reader()) { 218 if (node_readers.find(name) != node_readers.end()) { 219 Exception e; 220 e << "Multiple read rule for node map: " << name; 221 throw e; 222 } 223 node_readers.insert(make_pair(name, new SkipReader<Node, Reader>(reader))); 229 if (node_map_readers.find(name) != node_map_readers.end()) { 230 throw Exception() << "Multiple read rule for node map: " << name; 231 } 232 node_map_readers.insert(make_pair(name, new SkipReader<Node, Reader>(reader))); 224 233 return *this; 225 234 } 235 236 // Edge map rules 226 237 227 238 template <typename Map> … … 233 244 template <typename Reader, typename Map> 234 245 GraphReader& readEdgeMap(std::string name, Map& map, const Reader& reader = Reader()) { 235 if (edge_readers.find(name) != edge_readers.end()) { 236 Exception e; 237 e << "Multiple read rule for edge map: " << name; 238 throw e; 239 } 240 edge_readers.insert(make_pair(name, new MapReader<Edge, Map, Reader>(map, reader))); 246 if (edge_map_readers.find(name) != edge_map_readers.end()) { 247 throw Exception() << "Multiple read rule for edge map: " << name; 248 } 249 edge_map_readers.insert(make_pair(name, new MapReader<Edge, Map, Reader>(map, reader))); 241 250 return *this; 242 251 } … … 244 253 template <typename Reader> 245 254 GraphReader& skipEdgeMap(std::string name, const Reader& reader = Reader()) { 255 if (edge_map_readers.find(name) != edge_map_readers.end()) { 256 throw Exception() << "Multiple read rule for edge map: " << name; 257 } 258 edge_map_readers.insert(make_pair(name, new SkipReader<Edge, Reader>(reader))); 259 return *this; 260 } 261 262 // Node rules 263 GraphReader& readNode(std::string name, Node& node) { 264 if (node_readers.find(name) != node_readers.end()) { 265 throw Exception() << "Multiple read rule for node"; 266 } 267 node_readers.insert(make_pair(name, &node)); 268 } 269 270 // Edge rules 271 272 GraphReader& readEdge(std::string name, Edge& edge) { 246 273 if (edge_readers.find(name) != edge_readers.end()) { 247 Exception e; 248 e << "Multiple read rule for edge map: " << name; 249 throw e; 250 } 251 edge_readers.insert(make_pair(name, new SkipReader<Edge, Reader>(reader))); 252 return *this; 274 throw Exception() << "Multiple read rule for edge"; 275 } 276 edge_readers.insert(make_pair(name, &edge)); 253 277 } 254 278 255 279 void read() { 256 280 int line_num = 0; 257 InverterBase<Node>* nodeInverter = 0; 258 InverterBase<Edge>* edgeInverter = 0; 259 // \todo delete the inverters 260 // try { 261 { 262 std::string line = readNotEmptyLine(is, line_num); 263 } 264 readNodeSet(line_num, nodeInverter); 265 readEdgeSet(line_num, edgeInverter, nodeInverter); 266 // } catch (...){ 267 if (nodeInverter != 0) delete nodeInverter; 268 if (edgeInverter != 0) delete edgeInverter; 269 // } 281 std::auto_ptr<InverterBase<Node> > nodeInverter; 282 std::auto_ptr<InverterBase<Edge> > edgeInverter; 283 try { 284 std::string line = readNotEmptyLine(is, line_num); 285 if (line.find("@nodeset") == 0) { 286 line = readNodeSet(line_num, nodeInverter); 287 } 288 if (line.find("@edgeset") == 0) { 289 line = readEdgeSet(line_num, edgeInverter, nodeInverter); 290 } 291 if (line.find("@nodes") == 0) { 292 line = readNodes(line_num, nodeInverter); 293 } 294 if (line.find("@edges") == 0) { 295 line = readEdges(line_num, edgeInverter); 296 } 297 if (line.find("@end") != 0) { 298 throw DataFormatException("Invalid control sequence: " + line); 299 } 300 } catch (DataFormatException e) { 301 throw StreamException<DataFormatException>(line_num, e); 302 } 270 303 } 271 304 … … 273 306 274 307 template <typename Item> class InverterBase; 275 // template <typename Item> class InverterBase; 276 277 void readNodeSet(int& line_num, InverterBase<Node>* & nodeInverter) { 278 int n = 0; 279 std::vector<ReaderBase<Node>*> index; 308 309 std::string readNodeSet(int& line_num, auto_ptr<InverterBase<Node> > & nodeInverter) { 310 std::vector<ReaderBase<Node>* > index; 280 311 { 281 312 std::string line = readNotEmptyLine(is, line_num); … … 284 315 while (ls >> id) { 285 316 if (id[0] == '#') break; 286 typename Node Readers::iterator it = node_readers.find(id);287 if (it != node_ readers.end()) {317 typename NodeMapReaders::iterator it = node_map_readers.find(id); 318 if (it != node_map_readers.end()) { 288 319 index.push_back(it->second); 320 node_map_readers.erase(it); 289 321 } else { 290 322 index.push_back(&nodeSkipper); 291 323 } 292 ++n; 293 } 294 } 295 296 nodeInverter = index[0]->getInverter(); 324 } 325 } 326 327 if (index.size() == 0) { 328 throw DataFormatException("No node map found"); 329 } 330 331 nodeInverter = auto_ptr<InverterBase<Node> >(index[0]->getInverter()); 297 332 std::string line; 298 333 while (line = readNotEmptyLine(is, line_num), line[0] != '@') { … … 300 335 std::istringstream ls(line); 301 336 nodeInverter->read(ls, node); 302 for (int i = 1; i < n; ++i) {337 for (int i = 1; i < index.size(); ++i) { 303 338 index[i]->read(ls, node); 304 339 } 305 340 } 306 } 307 308 void readEdgeSet(int& line_num, InverterBase<Edge>* & edgeInverter, InverterBase<Node>* & nodeInverter) { 309 int n = 0; 341 return line; 342 } 343 344 std::string readEdgeSet(int& line_num, 345 auto_ptr<InverterBase<Edge> > & edgeInverter, auto_ptr<InverterBase<Node> > & nodeInverter) { 310 346 std::vector<ReaderBase<Edge>*> index; 311 347 { … … 315 351 while (ls >> id) { 316 352 if (id[0] == '#') break; 317 typename Edge Readers::iterator it = edge_readers.find(id);318 if (it != edge_ readers.end()) {353 typename EdgeMapReaders::iterator it = edge_map_readers.find(id); 354 if (it != edge_map_readers.end()) { 319 355 index.push_back(it->second); 356 edge_map_readers.erase(it); 320 357 } else { 321 358 index.push_back(&edgeSkipper); 322 359 } 323 ++n; 324 } 325 } 326 edgeInverter = index[0]->getInverter(); 360 } 361 } 362 363 if (index.size() == 0) { 364 throw DataFormatException("No edge map found"); 365 } 366 367 edgeInverter = auto_ptr<InverterBase<Edge> >(index[0]->getInverter()); 327 368 std::string line; 328 369 while (line = readNotEmptyLine(is, line_num), line[0] != '@') { … … 332 373 Edge edge = graph.addEdge(source, target); 333 374 edgeInverter->read(ls, edge); 334 for (int i = 1; i < n; ++i) {375 for (int i = 1; i < index.size(); ++i) { 335 376 index[i]->read(ls, edge); 336 377 } 337 378 } 379 return line; 380 } 381 382 std::string readNodes(int& line_num, auto_ptr<InverterBase<Node> >& nodeInverter) { 383 std::string line; 384 while (line = readNotEmptyLine(is, line_num), line[0] != '@') { 385 std::istringstream ls(line); 386 std::string name; 387 ls >> name; 388 typename NodeReaders::iterator it = node_readers.find(name); 389 if (it != node_readers.end()) { 390 *(it -> second) = nodeInverter->read(ls); 391 } 392 } 393 return line; 394 } 395 396 std::string readEdges(int& line_num, auto_ptr<InverterBase<Edge> >& edgeInverter) { 397 std::string line; 398 while (line = readNotEmptyLine(is, line_num), line[0] != '@') { 399 std::istringstream ls(line); 400 std::string name; 401 ls >> name; 402 typename EdgeReaders::iterator it = edge_readers.find(name); 403 if (it != edge_readers.end()) { 404 *(it -> second) = edgeInverter->read(ls); 405 } 406 } 407 return line; 338 408 } 339 409 … … 346 416 } 347 417 } 348 throw Exception(); 349 } 418 throw DataFormatException("End of stream"); 419 } 420 421 // Inverters store and give back the Item from the id, 422 // and may put the ids into a map. 350 423 351 424 template <typename _Item> … … 353 426 public: 354 427 typedef _Item Item; 355 virtual void read( istream&, const Item&) = 0;356 virtual Item read( istream&) = 0;428 virtual void read(std::istream&, const Item&) = 0; 429 virtual Item read(std::istream&) = 0; 357 430 }; 358 431 … … 373 446 : map(_map), reader(_reader) {} 374 447 375 virtual void read( istream& is, const Item& item) {448 virtual void read(std::istream& is, const Item& item) { 376 449 Value value; 377 450 reader.read(is, value); … … 385 458 } 386 459 387 virtual Item read( istream& is) {460 virtual Item read(std::istream& is) { 388 461 Value value; 389 462 reader.read(is, value); … … 410 483 : reader(_reader) {} 411 484 412 virtual void read( istream& is, const Item& item) {485 virtual void read(std::istream& is, const Item& item) { 413 486 Value value; 414 487 reader.read(is, value); … … 421 494 } 422 495 423 virtual Item read( istream& is) {496 virtual Item read(std::istream& is) { 424 497 Value value; 425 498 reader.read(is, value); … … 435 508 }; 436 509 510 // Readers 437 511 438 512 template <typename _Item> … … 440 514 public: 441 515 typedef _Item Item; 442 virtual void read(istream& is, const Item& item) = 0; 516 517 virtual void read(std::istream& is, const Item& item) = 0; 443 518 virtual InverterBase<_Item>* getInverter() = 0; 444 519 }; … … 459 534 460 535 461 virtual void read( istream& is, const Item& item) {536 virtual void read(std::istream& is, const Item& item) { 462 537 Value value; 463 538 reader.read(is, value); … … 481 556 SkipReader(const Reader& _reader) : reader(_reader) {} 482 557 483 virtual void read( istream& is, const Item& item) {558 virtual void read(std::istream& is, const Item& item) { 484 559 Value value; 485 560 reader.read(is, value); … … 492 567 493 568 494 typedef std::map<std::string, ReaderBase<Node>* > NodeReaders; 569 typedef std::map<std::string, ReaderBase<Node>*> NodeMapReaders; 570 NodeMapReaders node_map_readers; 571 572 typedef std::map<std::string, ReaderBase<Edge>*> EdgeMapReaders; 573 EdgeMapReaders edge_map_readers; 574 575 typedef std::map<std::string, Node*> NodeReaders; 495 576 NodeReaders node_readers; 496 577 497 typedef std::map<std::string, ReaderBase<Edge>*> EdgeReaders;578 typedef std::map<std::string, Edge*> EdgeReaders; 498 579 EdgeReaders edge_readers; 499 580
Note: See TracChangeset
for help on using the changeset viewer.