Changeset 1429:4283998fb2be in lemon-0.x
- Timestamp:
- 05/19/05 13:49:42 (20 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@1903
- Location:
- src/lemon
- Files:
-
- 6 edited
Legend:
- Unmodified
- Added
- Removed
-
src/lemon/bits/item_reader.h
r1427 r1429 349 349 void read(std::istream& is, Value& value) const { 350 350 char c; 351 if (!(is >> c)) return;351 if (!(is >> std::ws >> c)) return; 352 352 is.putback(c); 353 353 switch (c) { -
src/lemon/bits/item_writer.h
r1415 r1429 178 178 }; 179 179 180 template <> 181 class DefaultWriter<std::string> 182 : public QuotedStringWriter<std::string> {}; 183 180 184 template <typename Item> 181 185 class DefaultWriter<std::vector<Item> > -
src/lemon/graph_reader.h
r1421 r1429 299 299 reader->run(); 300 300 } 301 302 /// \brief Gives back the node by its id. 303 /// 304 /// It reads an id from the stream and gives back which node belongs to 305 /// it. It is possible only if there was read an "id" named node map. 306 Node readId(std::istream& is, Node) const { 307 return nodeset_reader.readId(is, Node()); 308 } 309 310 /// \brief Gives back the edge by its id. 311 /// 312 /// It reads an id from the stream and gives back which edge belongs to 313 /// it. It is possible only if there was read an "id" named edge map. 314 Edge readId(std::istream& is, Edge) const { 315 return edgeset_reader.readId(is, Edge()); 316 } 301 317 302 318 private: … … 674 690 /// 675 691 /// Add a new labeled edge reader for the reader. 692 UndirGraphReader& readEdge(std::string name, Edge& edge) { 693 undir_edge_reader.readEdge(name, edge); 694 } 695 696 /// \brief Add a new labeled undirected edge reader for the reader. 697 /// 698 /// Add a new labeled undirected edge reader for the reader. 676 699 UndirGraphReader& readUndirEdge(std::string name, UndirEdge& edge) { 677 700 undir_edge_reader.readUndirEdge(name, edge); … … 713 736 reader->run(); 714 737 } 738 739 /// \brief Gives back the node by its id. 740 /// 741 /// It reads an id from the stream and gives back which node belongs to 742 /// it. It is possible only if there was read an "id" named node map. 743 Node readId(std::istream& is, Node) const { 744 return nodeset_reader.readId(is, Node()); 745 } 746 747 /// \brief Gives back the edge by its id. 748 /// 749 /// It reads an id from the stream and gives back which edge belongs to 750 /// it. It is possible only if there was read an "id" named edge map. 751 Edge readId(std::istream& is, Edge) const { 752 return undir_edgeset_reader.readId(is, Edge()); 753 } 754 755 /// \brief Gives back the undirected edge by its id. 756 /// 757 /// It reads an id from the stream and gives back which undirected edge 758 /// belongs to it. It is possible only if there was read an "id" named 759 /// edge map. 760 UndirEdge readId(std::istream& is, UndirEdge) const { 761 return undir_edgeset_reader.readId(is, UndirEdge()); 762 } 763 715 764 716 765 private: -
src/lemon/graph_writer.h
r1421 r1429 238 238 writer->run(); 239 239 } 240 241 /// \brief Write the id of the given node. 242 /// 243 /// It writes the id of the given node. If there was written an "id" 244 /// named node map then it will write the map value belongs to the node. 245 void writeId(std::ostream& os, const Node& item) const { 246 nodeset_writer.writeId(os, item); 247 } 248 249 /// \brief Write the id of the given edge. 250 /// 251 /// It writes the id of the given edge. If there was written an "id" 252 /// named edge map then it will write the map value belongs to the edge. 253 void writeId(std::ostream& os, const Edge& item) const { 254 edgeset_writer.writeId(os, item); 255 } 240 256 241 257 private: … … 548 564 /// 549 565 /// Add a new labeled edge writer for the writer. 566 UndirGraphWriter& writeEdge(std::string name, const Edge& edge) { 567 undir_edge_writer.writeEdge(name, edge); 568 } 569 570 /// \brief Add a new labeled undirected edge writer for the writer. 571 /// 572 /// Add a new labeled undirected edge writer for the writer. 550 573 UndirGraphWriter& writeUndirEdge(std::string name, const UndirEdge& edge) { 551 574 undir_edge_writer.writeUndirEdge(name, edge); … … 587 610 writer->run(); 588 611 } 612 613 /// \brief Write the id of the given node. 614 /// 615 /// It writes the id of the given node. If there was written an "id" 616 /// named node map then it will write the map value belongs to the node. 617 void writeId(std::ostream& os, const Node& item) const { 618 nodeset_writer.writeId(os, item); 619 } 620 621 /// \brief Write the id of the given edge. 622 /// 623 /// It writes the id of the given edge. If there was written an "id" 624 /// named edge map then it will write the map value belongs to the edge. 625 void writeId(std::ostream& os, const Edge& item) const { 626 undir_edgeset_writer.writeId(os, item); 627 } 628 629 /// \brief Write the id of the given undirected edge. 630 /// 631 /// It writes the id of the given undirected edge. If there was written 632 /// an "id" named edge map then it will write the map value belongs to 633 /// the edge. 634 void writeId(std::ostream& os, const UndirEdge& item) const { 635 undir_edgeset_writer.writeId(os, item); 636 } 637 589 638 590 639 private: -
src/lemon/lemon_reader.h
r1427 r1429 546 546 547 547 virtual Item read(std::istream& is) const { 548 return boxedIdReader.readId(is );548 return boxedIdReader.readId(is, Item()); 549 549 } 550 550 }; … … 598 598 typedef _Graph Graph; 599 599 typedef _Traits Traits; 600 typedef typename Graph::Node Item;600 typedef typename Graph::Node Node; 601 601 typedef typename Traits::Skipper DefaultSkipper; 602 602 … … 653 653 NodeSetReader& readNodeMap(std::string name, Map& map, 654 654 const Reader& reader = Reader()) { 655 return _readMap< 656 typename Traits::template Reader<typename Map::Value>, Map, 657 typename SmartParameter<Map>::Type>(name, map, reader); 655 return _readMap<Reader, Map, typename SmartParameter<Map>::Type> 656 (name, map, reader); 658 657 } 659 658 … … 661 660 NodeSetReader& readNodeMap(std::string name, const Map& map, 662 661 const Reader& reader = Reader()) { 663 return _readMap< 664 typename Traits::template Reader<typename Map::Value>, Map, 665 typename SmartParameter<Map>::Type>(name, map, reader); 662 return _readMap<Reader, Map, typename SmartParameter<Map>::Type> 663 (name, map, reader); 666 664 } 667 665 … … 677 675 } 678 676 readers.insert( 679 make_pair(name, new MapReader< Item, Map, Reader>(map, reader)));677 make_pair(name, new MapReader<Node, Map, Reader>(map, reader))); 680 678 return *this; 681 679 } … … 694 692 throw IOParameterError(msg.message()); 695 693 } 696 readers.insert(make_pair(name, new SkipReader< Item, Reader>(reader)));694 readers.insert(make_pair(name, new SkipReader<Node, Reader>(reader))); 697 695 return *this; 698 696 } … … 717 715 /// It reads the content of the section. 718 716 virtual void read(std::istream& is) { 719 std::vector<ReaderBase< Item>* > index;717 std::vector<ReaderBase<Node>* > index; 720 718 std::string line; 721 719 … … 735 733 } 736 734 while (getline(is, line)) { 737 typename Graph::Node node = graph.addNode();735 Node node = graph.addNode(); 738 736 std::istringstream ls(line); 739 737 for (int i = 0; i < (int)index.size(); ++i) { … … 757 755 /// It reads an id from the stream and gives back which node belongs to 758 756 /// it. It is possible only if there was read an "id" named map. 759 Item readId(std::istream& is) const {757 Node readId(std::istream& is, Node = Node()) const { 760 758 return inverter->read(is); 761 759 } … … 763 761 private: 764 762 765 typedef std::map<std::string, ReaderBase< Item>*> MapReaders;763 typedef std::map<std::string, ReaderBase<Node>*> MapReaders; 766 764 MapReaders readers; 767 765 768 766 typename SmartReference<Graph>::Type graph; 769 767 std::string id; 770 SkipReader< Item, DefaultSkipper> skipper;771 772 std::auto_ptr<InverterBase< Item> > inverter;768 SkipReader<Node, DefaultSkipper> skipper; 769 770 std::auto_ptr<InverterBase<Node> > inverter; 773 771 }; 774 772 … … 802 800 typedef _Graph Graph; 803 801 typedef _Traits Traits; 804 typedef typename Graph::Edge Item; 802 typedef typename Graph::Node Node; 803 typedef typename Graph::Edge Edge; 805 804 typedef typename Traits::Skipper DefaultSkipper; 806 805 … … 820 819 const DefaultSkipper& _skipper = DefaultSkipper()) 821 820 : Parent(_reader), graph(_graph), id(_id), skipper(_skipper), 822 nodeIdReader(new IdReader<typename Graph::Node, NodeIdReader> 823 (_nodeIdReader)) {} 821 nodeIdReader(new IdReader<Node, NodeIdReader>(_nodeIdReader)) {} 824 822 825 823 /// \brief Destructor. … … 862 860 EdgeSetReader& readEdgeMap(std::string name, Map& map, 863 861 const Reader& reader = Reader()) { 864 return _readMap< 865 typename Traits::template Reader<typename Map::Value>, Map, 862 return _readMap<Reader, Map, 866 863 typename SmartParameter<Map>::Type>(name, map, reader); 867 864 } … … 870 867 EdgeSetReader& readEdgeMap(std::string name, const Map& map, 871 868 const Reader& reader = Reader()) { 872 return _readMap< 873 typename Traits::template Reader<typename Map::Value>, Map, 869 return _readMap<Reader, Map, 874 870 typename SmartParameter<Map>::Type>(name, map, reader); 875 871 } … … 886 882 } 887 883 readers.insert( 888 make_pair(name, new MapReader< Item, Map, Reader>(map, reader)));884 make_pair(name, new MapReader<Edge, Map, Reader>(map, reader))); 889 885 return *this; 890 886 } … … 903 899 throw IOParameterError(msg.message()); 904 900 } 905 readers.insert(make_pair(name, new SkipReader< Item, Reader>(reader)));901 readers.insert(make_pair(name, new SkipReader<Edge, Reader>(reader))); 906 902 return *this; 907 903 } … … 926 922 /// It reads the content of the section. 927 923 virtual void read(std::istream& is) { 928 std::vector<ReaderBase< Item>* > index;924 std::vector<ReaderBase<Edge>* > index; 929 925 std::string line; 930 926 … … 945 941 while (getline(is, line)) { 946 942 std::istringstream ls(line); 947 typename Graph::Node from = nodeIdReader->read(ls);948 typename Graph::Node to = nodeIdReader->read(ls);949 typename Graph::Edge edge = graph.addEdge(from, to);943 Node from = nodeIdReader->read(ls); 944 Node to = nodeIdReader->read(ls); 945 Edge edge = graph.addEdge(from, to); 950 946 for (int i = 0; i < (int)index.size(); ++i) { 951 947 index[i]->read(ls, edge); … … 968 964 /// It reads an id from the stream and gives back which edge belongs to 969 965 /// it. It is possible only if there was read an "id" named map. 970 Item readId(std::istream& is) const {966 Edge readId(std::istream& is, Edge = Edge()) const { 971 967 return inverter->read(is); 972 968 } … … 974 970 private: 975 971 976 typedef std::map<std::string, ReaderBase< Item>*> MapReaders;972 typedef std::map<std::string, ReaderBase<Edge>*> MapReaders; 977 973 MapReaders readers; 978 974 979 975 typename SmartReference<Graph>::Type graph; 980 976 std::string id; 981 SkipReader< Item, DefaultSkipper> skipper;982 983 std::auto_ptr<InverterBase< Item> > inverter;984 std::auto_ptr<IdReaderBase< typename Graph::Node> > nodeIdReader;977 SkipReader<Edge, DefaultSkipper> skipper; 978 979 std::auto_ptr<InverterBase<Edge> > inverter; 980 std::auto_ptr<IdReaderBase<Node> > nodeIdReader; 985 981 }; 986 982 … … 1019 1015 typedef _Graph Graph; 1020 1016 typedef _Traits Traits; 1021 typedef typename Graph::UndirEdge Item; 1017 typedef typename Graph::Node Node; 1018 typedef typename Graph::Edge Edge; 1019 typedef typename Graph::UndirEdge UndirEdge; 1022 1020 typedef typename Traits::Skipper DefaultSkipper; 1023 1021 … … 1037 1035 const DefaultSkipper& _skipper = DefaultSkipper()) 1038 1036 : Parent(_reader), graph(_graph), id(_id), skipper(_skipper), 1039 nodeIdReader(new IdReader<typename Graph::Node, NodeIdReader> 1040 (_nodeIdReader)) {} 1037 nodeIdReader(new IdReader<Node, NodeIdReader>(_nodeIdReader)) {} 1041 1038 1042 1039 /// \brief Destructor. … … 1101 1098 } 1102 1099 readers.insert( 1103 make_pair(name, new MapReader< Item, Map, Reader>(map, reader)));1100 make_pair(name, new MapReader<UndirEdge, Map, Reader>(map, reader))); 1104 1101 return *this; 1105 1102 } … … 1118 1115 throw IOParameterError(msg.message()); 1119 1116 } 1120 readers.insert(make_pair(name, new SkipReader<Item, Reader>(reader))); 1117 readers.insert(make_pair(name, 1118 new SkipReader<UndirEdge, Reader>(reader))); 1121 1119 return *this; 1122 1120 } … … 1200 1198 /// It reads the content of the section. 1201 1199 virtual void read(std::istream& is) { 1202 std::vector<ReaderBase< Item>* > index;1200 std::vector<ReaderBase<UndirEdge>* > index; 1203 1201 std::string line; 1204 1202 … … 1219 1217 while (getline(is, line)) { 1220 1218 std::istringstream ls(line); 1221 typename Graph::Node from = nodeIdReader->read(ls);1222 typename Graph::Node to = nodeIdReader->read(ls);1223 typename Graph::UndirEdge edge = graph.addEdge(from, to);1219 Node from = nodeIdReader->read(ls); 1220 Node to = nodeIdReader->read(ls); 1221 UndirEdge edge = graph.addEdge(from, to); 1224 1222 for (int i = 0; i < (int)index.size(); ++i) { 1225 1223 index[i]->read(ls, edge); … … 1242 1240 /// It reads an id from the stream and gives back which undirected edge 1243 1241 /// belongs to it. It is possible only if there was read an "id" named map. 1244 Item readId(std::istream& is) const {1242 UndirEdge readId(std::istream& is, UndirEdge = UndirEdge()) const { 1245 1243 return inverter->read(is); 1246 1244 } 1247 1245 1248 private: 1249 1250 typedef std::map<std::string, ReaderBase<Item>*> MapReaders; 1246 /// \brief Gives back the directed edge by its id. 1247 /// 1248 /// It reads an id from the stream and gives back which directed edge 1249 /// belongs to it. The directed edge id is the \c '+' or \c '-' character 1250 /// and the undirected edge id. It is possible only if there was read 1251 /// an "id" named map. 1252 Edge readId(std::istream& is, Edge = Edge()) const { 1253 char c; 1254 is >> c; 1255 UndirEdge undirEdge = inverter->read(is); 1256 if (c == '+') { 1257 return graph.edgeWithSource(undirEdge, graph.source(undirEdge)); 1258 } else if (c == '-') { 1259 return graph.edgeWithSource(undirEdge, graph.target(undirEdge)); 1260 } else { 1261 throw DataFormatError("Wrong id format for edge " 1262 "in undirected edgeset"); 1263 } 1264 } 1265 1266 private: 1267 1268 typedef std::map<std::string, ReaderBase<UndirEdge>*> MapReaders; 1251 1269 MapReaders readers; 1252 1270 1253 1271 typename SmartReference<Graph>::Type graph; 1254 1272 std::string id; 1255 SkipReader< Item, DefaultSkipper> skipper;1256 1257 std::auto_ptr<InverterBase< Item> > inverter;1258 std::auto_ptr<IdReaderBase< typename Graph::Node> > nodeIdReader;1273 SkipReader<UndirEdge, DefaultSkipper> skipper; 1274 1275 std::auto_ptr<InverterBase<UndirEdge> > inverter; 1276 std::auto_ptr<IdReaderBase<Node> > nodeIdReader; 1259 1277 }; 1260 1278 … … 1273 1291 typedef CommonSectionReaderBase Parent; 1274 1292 typedef _Graph Graph; 1275 typedef typename Graph::Node Item;1293 typedef typename Graph::Node Node; 1276 1294 public: 1277 1295 … … 1302 1320 /// 1303 1321 /// Add a node reader command for the NodeReader. 1304 void readNode(const std::string& name, Item& item) {1322 void readNode(const std::string& name, Node& item) { 1305 1323 if (readers.find(name) != readers.end()) { 1306 1324 ErrorMessage msg; … … 1335 1353 std::string id; 1336 1354 ls >> id; 1337 typename ItemReaders::iterator it = readers.find(id);1355 typename NodeReaders::iterator it = readers.find(id); 1338 1356 if (it != readers.end()) { 1339 1357 *(it->second) = idReader->read(ls); … … 1346 1364 std::string id; 1347 1365 1348 typedef std::map<std::string, Item*> ItemReaders;1349 ItemReaders readers;1350 std::auto_ptr<IdReaderBase< Item> > idReader;1366 typedef std::map<std::string, Node*> NodeReaders; 1367 NodeReaders readers; 1368 std::auto_ptr<IdReaderBase<Node> > idReader; 1351 1369 }; 1352 1370 … … 1365 1383 typedef CommonSectionReaderBase Parent; 1366 1384 typedef _Graph Graph; 1367 typedef typename Graph::Edge Item;1385 typedef typename Graph::Edge Edge; 1368 1386 public: 1369 1387 … … 1393 1411 /// 1394 1412 /// Add an edge reader command for the EdgeReader. 1395 void readEdge(const std::string& name, Item& item) {1413 void readEdge(const std::string& name, Edge& item) { 1396 1414 if (readers.find(name) != readers.end()) { 1397 1415 ErrorMessage msg; … … 1426 1444 std::string id; 1427 1445 ls >> id; 1428 typename ItemReaders::iterator it = readers.find(id);1446 typename EdgeReaders::iterator it = readers.find(id); 1429 1447 if (it != readers.end()) { 1430 1448 *(it->second) = idReader->read(ls); … … 1437 1455 std::string id; 1438 1456 1439 typedef std::map<std::string, Item*> ItemReaders;1440 ItemReaders readers;1441 std::auto_ptr<IdReaderBase< Item> > idReader;1457 typedef std::map<std::string, Edge*> EdgeReaders; 1458 EdgeReaders readers; 1459 std::auto_ptr<IdReaderBase<Edge> > idReader; 1442 1460 }; 1443 1461 … … 1456 1474 typedef CommonSectionReaderBase Parent; 1457 1475 typedef _Graph Graph; 1458 typedef typename Graph::UndirEdge Item; 1476 typedef typename Graph::Edge Edge; 1477 typedef typename Graph::UndirEdge UndirEdge; 1459 1478 public: 1460 1479 … … 1470 1489 const std::string& _id = std::string()) 1471 1490 : Parent(_reader), id(_id), 1472 idReader(new IdReader<typename Graph::UndirEdge, _IdReader>(_idReader)) 1491 undirEdgeIdReader(new IdReader<UndirEdge, _IdReader>(_idReader)), 1492 edgeIdReader(new IdReader<Edge, _IdReader>(_idReader)) 1473 1493 {} 1474 1494 … … 1486 1506 /// 1487 1507 /// Add an undirected edge reader command for the UndirEdgeReader. 1488 void readUndirEdge(const std::string& name, Item& item) { 1489 if (readers.find(name) != readers.end()) { 1508 void readUndirEdge(const std::string& name, UndirEdge& item) { 1509 if (undirEdgeReaders.find(name) != undirEdgeReaders.end()) { 1510 ErrorMessage msg; 1511 msg << "Multiple read rule for undirected edge: " << name; 1512 throw IOParameterError(msg.message()); 1513 } 1514 undirEdgeReaders.insert(make_pair(name, &item)); 1515 } 1516 1517 /// \brief Add an edge reader command for the UndirEdgeReader. 1518 /// 1519 /// Add an edge reader command for the UndirEdgeReader. 1520 void readEdge(const std::string& name, Edge& item) { 1521 if (edgeReaders.find(name) != edgeReaders.end()) { 1490 1522 ErrorMessage msg; 1491 1523 msg << "Multiple read rule for edge: " << name; 1492 1524 throw IOParameterError(msg.message()); 1493 1525 } 1494 readers.insert(make_pair(name, &item));1526 edgeReaders.insert(make_pair(name, &item)); 1495 1527 } 1496 1528 … … 1507 1539 std::string name; 1508 1540 ls >> command >> name; 1509 return command == "@ edges" && name == id;1541 return command == "@undiredges" && name == id; 1510 1542 } 1511 1543 … … 1519 1551 std::string id; 1520 1552 ls >> id; 1521 typename ItemReaders::iterator it = readers.find(id); 1522 if (it != readers.end()) { 1523 *(it->second) = idReader->read(ls); 1524 } 1553 { 1554 typename UndirEdgeReaders::iterator it = undirEdgeReaders.find(id); 1555 if (it != undirEdgeReaders.end()) { 1556 *(it->second) = undirEdgeIdReader->read(ls); 1557 break; 1558 } 1559 } { 1560 typename EdgeReaders::iterator it = edgeReaders.find(id); 1561 if (it != edgeReaders.end()) { 1562 *(it->second) = edgeIdReader->read(ls); 1563 break; 1564 } 1565 } 1525 1566 } 1526 1567 } … … 1530 1571 std::string id; 1531 1572 1532 typedef std::map<std::string, Item*> ItemReaders; 1533 ItemReaders readers; 1534 std::auto_ptr<IdReaderBase<Item> > idReader; 1573 typedef std::map<std::string, UndirEdge*> UndirEdgeReaders; 1574 UndirEdgeReaders undirEdgeReaders; 1575 std::auto_ptr<IdReaderBase<UndirEdge> > undirEdgeIdReader; 1576 1577 typedef std::map<std::string, Edge*> EdgeReaders; 1578 EdgeReaders edgeReaders; 1579 std::auto_ptr<IdReaderBase<Edge> > edgeIdReader; 1535 1580 }; 1536 1581 -
src/lemon/lemon_writer.h
r1421 r1429 244 244 245 245 virtual void write(std::ostream& os, const Item& item) const { 246 returnidWriter.writeId(os, item);246 idWriter.writeId(os, item); 247 247 } 248 248 }; … … 274 274 typedef _Graph Graph; 275 275 typedef _Traits Traits; 276 typedef typename Graph::Node Item;276 typedef typename Graph::Node Node; 277 277 278 278 /// \brief Constructor. … … 320 320 const Writer& writer = Writer()) { 321 321 writers.push_back( 322 make_pair(name, new MapWriter< Item, Map, Writer>(map, writer)));322 make_pair(name, new MapWriter<Node, Map, Writer>(map, writer))); 323 323 return *this; 324 324 } … … 380 380 /// Otherwise if the \c forceId parameter was true it will write 381 381 /// its id in the graph. 382 void writeId(std::ostream& os, const Item& item) const {382 void writeId(std::ostream& os, const Node& item) const { 383 383 if (forceIdMap) { 384 384 os << graph.id(item); … … 390 390 private: 391 391 392 typedef std::vector<std::pair<std::string, WriterBase< Item>*> > MapWriters;392 typedef std::vector<std::pair<std::string, WriterBase<Node>*> > MapWriters; 393 393 MapWriters writers; 394 394 395 WriterBase< Item>* idMap;395 WriterBase<Node>* idMap; 396 396 bool forceIdMap; 397 397 … … 431 431 typedef _Graph Graph; 432 432 typedef _Traits Traits; 433 typedef typename Graph::Edge Item; 433 typedef typename Graph::Node Node; 434 typedef typename Graph::Edge Edge; 434 435 435 436 /// \brief Constructor. … … 447 448 : Parent(_writer), idMap(0), forceIdMap(_forceIdMap), 448 449 graph(_graph), id(_id), 449 nodeIdWriter(new IdWriter<typename Graph::Node, NodeIdWriter> 450 (_nodeIdWriter)) {} 450 nodeIdWriter(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter)) {} 451 451 452 452 /// \brief Destructor. … … 482 482 const Writer& writer = Writer()) { 483 483 writers.push_back( 484 make_pair(name, new MapWriter< Item, Map, Writer>(map, writer)));484 make_pair(name, new MapWriter<Edge, Map, Writer>(map, writer))); 485 485 return *this; 486 486 } … … 547 547 /// Otherwise if the \c forceId parameter was true it will write 548 548 /// its id in the graph. 549 void writeId(std::ostream& os, const Item& item) const {549 void writeId(std::ostream& os, const Edge& item) const { 550 550 if (forceIdMap) { 551 551 os << graph.id(item); … … 557 557 private: 558 558 559 typedef std::vector<std::pair<std::string, WriterBase< Item>*> > MapWriters;559 typedef std::vector<std::pair<std::string, WriterBase<Edge>*> > MapWriters; 560 560 MapWriters writers; 561 561 562 WriterBase< Item>* idMap;562 WriterBase<Edge>* idMap; 563 563 bool forceIdMap; 564 564 … … 566 566 std::string id; 567 567 568 std::auto_ptr<IdWriterBase< typename Graph::Node> > nodeIdWriter;568 std::auto_ptr<IdWriterBase<Node> > nodeIdWriter; 569 569 }; 570 570 … … 605 605 typedef _Graph Graph; 606 606 typedef _Traits Traits; 607 typedef typename Graph::UndirEdge Item; 607 typedef typename Graph::Node Node; 608 typedef typename Graph::Edge Edge; 609 typedef typename Graph::UndirEdge UndirEdge; 608 610 609 611 /// \brief Constructor. … … 621 623 : Parent(_writer), idMap(0), forceIdMap(_forceIdMap), 622 624 graph(_graph), id(_id), 623 nodeIdWriter(new IdWriter<typename Graph::Node, NodeIdWriter> 624 (_nodeIdWriter)) {} 625 nodeIdWriter(new IdWriter<Node, NodeIdWriter>(_nodeIdWriter)) {} 625 626 626 627 /// \brief Destructor. … … 656 657 const Writer& writer = Writer()) { 657 658 writers.push_back( 658 make_pair(name, new MapWriter< Item, Map, Writer>(map, writer)));659 make_pair(name, new MapWriter<UndirEdge, Map, Writer>(map, writer))); 659 660 return *this; 660 661 } … … 743 744 /// undirected edge. Otherwise if the \c forceId parameter was true it 744 745 /// will write its id in the graph. 745 void writeId(std::ostream& os, const Item& item) const {746 void writeId(std::ostream& os, const UndirEdge& item) const { 746 747 if (forceIdMap) { 747 748 os << graph.id(item); … … 751 752 } 752 753 753 private: 754 755 typedef std::vector<std::pair<std::string, WriterBase<Item>*> > MapWriters; 754 /// \brief Write the id of the given edge. 755 /// 756 /// It writes the id of the given edge. If there was written 757 /// an "id" named map then it will write the map value belongs to the 758 /// edge. Otherwise if the \c forceId parameter was true it 759 /// will write its id in the graph. If the edge is forward map 760 /// then its prefix character is \c '+' elsewhere \c '-'. 761 void writeId(std::ostream& os, const Edge& item) const { 762 if (graph.forward(item)) { 763 os << "+ "; 764 } else { 765 os << "- "; 766 } 767 if (forceIdMap) { 768 os << graph.id(item); 769 } else { 770 idMap->write(os, item); 771 } 772 } 773 774 private: 775 776 typedef std::vector<std::pair<std::string, 777 WriterBase<UndirEdge>*> > MapWriters; 756 778 MapWriters writers; 757 779 758 WriterBase< Item>* idMap;780 WriterBase<UndirEdge>* idMap; 759 781 bool forceIdMap; 760 782 … … 762 784 std::string id; 763 785 764 std::auto_ptr<IdWriterBase< typename Graph::Node> > nodeIdWriter;786 std::auto_ptr<IdWriterBase<Node> > nodeIdWriter; 765 787 }; 766 788 … … 779 801 typedef CommonSectionWriterBase Parent; 780 802 typedef _Graph Graph; 781 typedef typename Graph::Node Item;803 typedef typename Graph::Node Node; 782 804 public: 783 805 … … 807 829 /// 808 830 /// Add a node writer command for the NodeWriter. 809 void writeNode(const std::string& name, const Item& item) {831 void writeNode(const std::string& name, const Node& item) { 810 832 writers.push_back(make_pair(name, &item)); 811 833 } … … 836 858 std::string id; 837 859 838 typedef std::vector<std::pair<std::string, const Item*> > ItemWriters;839 ItemWriters writers;840 std::auto_ptr<IdWriterBase< Item> > idWriter;860 typedef std::vector<std::pair<std::string, const Node*> > NodeWriters; 861 NodeWriters writers; 862 std::auto_ptr<IdWriterBase<Node> > idWriter; 841 863 }; 842 864 … … 855 877 typedef CommonSectionWriterBase Parent; 856 878 typedef _Graph Graph; 857 typedef typename Graph::Edge Item;879 typedef typename Graph::Edge Edge; 858 880 public: 859 881 … … 882 904 /// 883 905 /// Add an edge writer command for the EdgeWriter. 884 void writeEdge(const std::string& name, const Item& item) {906 void writeEdge(const std::string& name, const Edge& item) { 885 907 writers.push_back(make_pair(name, &item)); 886 908 } … … 911 933 std::string id; 912 934 913 typedef std::vector<std::pair<std::string, const Item*> > ItemWriters;914 ItemWriters writers;915 916 std::auto_ptr<IdWriterBase< Item> > idWriter;935 typedef std::vector<std::pair<std::string, const Edge*> > EdgeWriters; 936 EdgeWriters writers; 937 938 std::auto_ptr<IdWriterBase<Edge> > idWriter; 917 939 }; 918 940 … … 931 953 typedef CommonSectionWriterBase Parent; 932 954 typedef _Graph Graph; 933 typedef typename Graph::UndirEdge Item; 955 typedef typename Graph::Node Node; 956 typedef typename Graph::Edge Edge; 957 typedef typename Graph::UndirEdge UndirEdge; 934 958 public: 935 959 … … 944 968 const std::string& _id = std::string()) 945 969 : Parent(_writer), id(_id), 946 idWriter(new IdWriter<typename Graph::UndirEdge, _IdWriter>947 (_idWriter)) {}970 undirEdgeIdWriter(new IdWriter<UndirEdge, _IdWriter>(_idWriter)), 971 edgeIdWriter(new IdWriter<Edge, _IdWriter>(_idWriter)) {} 948 972 949 973 /// \brief Destructor. … … 957 981 public: 958 982 983 /// \brief Add an edge writer command for the UndirEdgeWriter. 984 /// 985 /// Add an edge writer command for the UndirEdgeWriter. 986 void writeEdge(const std::string& name, const Edge& item) { 987 edgeWriters.push_back(make_pair(name, &item)); 988 } 989 959 990 /// \brief Add an undirected edge writer command for the UndirEdgeWriter. 960 991 /// 961 /// Add an edge writer command for the UndirEdgeWriter.962 void writeUndirEdge(const std::string& name, const Item& item) {963 writers.push_back(make_pair(name, &item));992 /// Add an undirected edge writer command for the UndirEdgeWriter. 993 void writeUndirEdge(const std::string& name, const UndirEdge& item) { 994 undirEdgeWriters.push_back(make_pair(name, &item)); 964 995 } 965 996 … … 971 1002 /// and the header line's id and the writer's id are the same. 972 1003 virtual std::string header() { 973 return "@ edges " + id;1004 return "@undiredges " + id; 974 1005 } 975 1006 … … 978 1009 /// Write the content of the section. 979 1010 virtual void write(std::ostream& os) { 980 for (int i = 0; i < (int) writers.size(); ++i) {981 os << writers[i].first << ' ';982 idWriter->write(os, *(writers[i].second));1011 for (int i = 0; i < (int)undirEdgeWriters.size(); ++i) { 1012 os << undirEdgeWriters[i].first << ' '; 1013 undirEdgeIdWriter->write(os, *(undirEdgeWriters[i].second)); 983 1014 os << std::endl; 984 1015 } 1016 for (int i = 0; i < (int)edgeWriters.size(); ++i) { 1017 os << edgeWriters[i].first << ' '; 1018 edgeIdWriter->write(os, *(edgeWriters[i].second)); 1019 os << std::endl; 1020 } 985 1021 } 986 1022 … … 989 1025 std::string id; 990 1026 991 typedef std::vector<std::pair<std::string, const Item*> > ItemWriters; 992 ItemWriters writers; 993 994 std::auto_ptr<IdWriterBase<Item> > idWriter; 1027 typedef std::vector<std::pair<std::string, 1028 const UndirEdge*> > UndirEdgeWriters; 1029 UndirEdgeWriters undirEdgeWriters; 1030 std::auto_ptr<IdWriterBase<UndirEdge> > undirEdgeIdWriter; 1031 1032 typedef std::vector<std::pair<std::string, const Edge*> > EdgeWriters; 1033 EdgeWriters edgeWriters; 1034 std::auto_ptr<IdWriterBase<Edge> > edgeIdWriter; 1035 995 1036 }; 996 1037
Note: See TracChangeset
for help on using the changeset viewer.