COIN-OR::LEMON - Graph Library

Ticket #107: 33e45a9b868c.patch

File 33e45a9b868c.patch, 4.8 KB (added by Balazs Dezso, 16 years ago)
  • lemon/lgf_writer.h

    # HG changeset patch
    # User Balazs Dezso <deba@inf.elte.hu>
    # Date 1214940109 -7200
    # Node ID 33e45a9b868cab9cfeed4563edae07c42f908abd
    # Parent  716b220697a00d88556c5c9138c8bad2ecc40def
    Fix skip*() functions is GraphWriters (Ticket #107)
    
    diff -r 716b220697a0 -r 33e45a9b868c lemon/lgf_writer.h
    a b  
    603603    /// The \c \@nodes section will be not written to the stream.
    604604    DigraphWriter& skipNodes() {
    605605      LEMON_ASSERT(!_skip_nodes, "Multiple usage of skipNodes() member");
     606      _skip_nodes = true;
    606607      return *this;
    607608    }
    608609
     
    611612    /// The \c \@arcs section will be not written to the stream.
    612613    DigraphWriter& skipArcs() {
    613614      LEMON_ASSERT(!_skip_arcs, "Multiple usage of skipArcs() member");
     615      _skip_arcs = true;
    614616      return *this;
    615617    }
    616618
     
    675677          *_os << '\t';
    676678        }
    677679        *_os << std::endl;
     680      }
     681    }
     682
     683    void createNodeIndex() {
     684      _writer_bits::MapStorageBase<Node>* label = 0;
     685      for (typename NodeMaps::iterator it = _node_maps.begin();
     686           it != _node_maps.end(); ++it) {
     687        if (it->first == "label") {
     688          label = it->second;
     689          break;
     690        }
     691      }
     692
     693      if (label == 0) {
     694        for (NodeIt n(_digraph); n != INVALID; ++n) {
     695          std::ostringstream os;
     696          os << _digraph.id(n);
     697          _node_index.insert(std::make_pair(n, os.str()));       
     698        }       
     699      } else {
     700        for (NodeIt n(_digraph); n != INVALID; ++n) {
     701          std::string value = label->get(n);     
     702          _node_index.insert(std::make_pair(n, value));
     703        }
    678704      }
    679705    }
    680706
     
    745771      }
    746772    }
    747773
     774    void createArcIndex() {
     775      _writer_bits::MapStorageBase<Arc>* label = 0;
     776      for (typename ArcMaps::iterator it = _arc_maps.begin();
     777           it != _arc_maps.end(); ++it) {
     778        if (it->first == "label") {
     779          label = it->second;
     780          break;
     781        }
     782      }
     783
     784      if (label == 0) {
     785        for (ArcIt a(_digraph); a != INVALID; ++a) {
     786          std::ostringstream os;
     787          os << _digraph.id(a);
     788          _arc_index.insert(std::make_pair(a, os.str()));         
     789        }       
     790      } else {
     791        for (ArcIt a(_digraph); a != INVALID; ++a) {
     792          std::string value = label->get(a);     
     793          _arc_index.insert(std::make_pair(a, value));
     794        }
     795      }
     796    }
     797
    748798    void writeAttributes() {
    749799      if (_attributes.empty()) return;
    750800      *_os << "@attributes";
     
    771821    void run() {
    772822      if (!_skip_nodes) {
    773823        writeNodes();
     824      } else {
     825        createNodeIndex();
    774826      }
    775827      if (!_skip_arcs) {     
    776828        writeArcs();
     829      } else {
     830        createArcIndex();
    777831      }
    778832      writeAttributes();
    779833    }
     
    11151169    /// The \c \@nodes section will be not written to the stream.
    11161170    GraphWriter& skipNodes() {
    11171171      LEMON_ASSERT(!_skip_nodes, "Multiple usage of skipNodes() member");
     1172      _skip_nodes = true;
    11181173      return *this;
    11191174    }
    11201175
     
    11231178    /// The \c \@edges section will be not written to the stream.
    11241179    GraphWriter& skipEdges() {
    11251180      LEMON_ASSERT(!_skip_edges, "Multiple usage of skipEdges() member");
     1181      _skip_edges = true;
    11261182      return *this;
    11271183    }
    11281184
     
    11871243          *_os << '\t';
    11881244        }
    11891245        *_os << std::endl;
     1246      }
     1247    }
     1248
     1249    void createNodeIndex() {
     1250      _writer_bits::MapStorageBase<Node>* label = 0;
     1251      for (typename NodeMaps::iterator it = _node_maps.begin();
     1252           it != _node_maps.end(); ++it) {
     1253        if (it->first == "label") {
     1254          label = it->second;
     1255          break;
     1256        }
     1257      }
     1258
     1259      if (label == 0) {
     1260        for (NodeIt n(_graph); n != INVALID; ++n) {
     1261          std::ostringstream os;
     1262          os << _graph.id(n);
     1263          _node_index.insert(std::make_pair(n, os.str()));       
     1264        }       
     1265      } else {
     1266        for (NodeIt n(_graph); n != INVALID; ++n) {
     1267          std::string value = label->get(n);     
     1268          _node_index.insert(std::make_pair(n, value));
     1269        }
    11901270      }
    11911271    }
    11921272
     
    12571337      }
    12581338    }
    12591339
     1340    void createEdgeIndex() {
     1341      _writer_bits::MapStorageBase<Edge>* label = 0;
     1342      for (typename EdgeMaps::iterator it = _edge_maps.begin();
     1343           it != _edge_maps.end(); ++it) {
     1344        if (it->first == "label") {
     1345          label = it->second;
     1346          break;
     1347        }
     1348      }
     1349
     1350      if (label == 0) {
     1351        for (EdgeIt e(_graph); e != INVALID; ++e) {
     1352          std::ostringstream os;
     1353          os << _graph.id(e);
     1354          _edge_index.insert(std::make_pair(e, os.str()));       
     1355        }       
     1356      } else {
     1357        for (EdgeIt e(_graph); e != INVALID; ++e) {
     1358          std::string value = label->get(e);     
     1359          _edge_index.insert(std::make_pair(e, value));
     1360        }
     1361      }
     1362    }
     1363
    12601364    void writeAttributes() {
    12611365      if (_attributes.empty()) return;
    12621366      *_os << "@attributes";
     
    12831387    void run() {
    12841388      if (!_skip_nodes) {
    12851389        writeNodes();
     1390      } else {
     1391        createNodeIndex();
    12861392      }
    12871393      if (!_skip_edges) {     
    12881394        writeEdges();
     1395      } else {
     1396        createEdgeIndex();
    12891397      }
    12901398      writeAttributes();
    12911399    }