lemon/lgf_writer.h
changeset 1030 4936be66d2f5
parent 1026 699c7eac2c6d
child 1074 97d978243703
     1.1 --- a/lemon/lgf_writer.h	Sun Feb 05 00:04:44 2012 +0100
     1.2 +++ b/lemon/lgf_writer.h	Tue Feb 12 07:15:52 2013 +0100
     1.3 @@ -185,22 +185,22 @@
     1.4      public:
     1.5        ValueStorage(const Value& value, const Converter& converter = Converter())
     1.6          : _value(value), _converter(converter) {}
     1.7 -
     1.8 +      
     1.9        virtual std::string get() {
    1.10          return _converter(_value);
    1.11        }
    1.12      };
    1.13  
    1.14 -    template <typename Value>
    1.15 +    template <typename Value,
    1.16 +              typename Map = std::map<Value, std::string> >
    1.17      struct MapLookUpConverter {
    1.18 -      const std::map<Value, std::string>& _map;
    1.19 +      const Map& _map;
    1.20  
    1.21 -      MapLookUpConverter(const std::map<Value, std::string>& map)
    1.22 +      MapLookUpConverter(const Map& map)
    1.23          : _map(map) {}
    1.24  
    1.25 -      std::string operator()(const Value& str) {
    1.26 -        typename std::map<Value, std::string>::const_iterator it =
    1.27 -          _map.find(str);
    1.28 +      std::string operator()(const Value& value) {
    1.29 +        typename Map::const_iterator it = _map.find(value);
    1.30          if (it == _map.end()) {
    1.31            throw FormatError("Item not found");
    1.32          }
    1.33 @@ -208,6 +208,35 @@
    1.34        }
    1.35      };
    1.36  
    1.37 +    template <typename Value,
    1.38 +              typename Map1 = std::map<Value, std::string>,
    1.39 +              typename Map2 = std::map<Value, std::string> >
    1.40 +    struct DoubleMapLookUpConverter {
    1.41 +      const Map1& _map1;
    1.42 +      const Map2& _map2;
    1.43 +
    1.44 +      DoubleMapLookUpConverter(const Map1& map1, const Map2& map2)
    1.45 +        : _map1(map1), _map2(map2) {}
    1.46 +
    1.47 +      std::string operator()(const Value& value) {
    1.48 +        typename Map1::const_iterator it1 = _map1.find(value);
    1.49 +        typename Map1::const_iterator it2 = _map2.find(value);
    1.50 +        if (it1 == _map1.end()) {
    1.51 +          if (it2 == _map2.end()) {
    1.52 +            throw FormatError("Item not found");
    1.53 +          } else {
    1.54 +            return it2->second;
    1.55 +          }
    1.56 +        } else {
    1.57 +          if (it2 == _map2.end()) {
    1.58 +            return it1->second;
    1.59 +          } else {
    1.60 +            throw FormatError("Item is ambigous");
    1.61 +          }
    1.62 +        }
    1.63 +      }
    1.64 +    };
    1.65 +
    1.66      template <typename Graph>
    1.67      struct GraphArcLookUpConverter {
    1.68        const Graph& _graph;
    1.69 @@ -1651,15 +1680,19 @@
    1.70      std::string _edges_caption;
    1.71      std::string _attributes_caption;
    1.72  
    1.73 -    typedef std::map<Node, std::string> NodeIndex;
    1.74 -    NodeIndex _node_index;
    1.75 +    typedef std::map<Node, std::string> RedNodeIndex;
    1.76 +    RedNodeIndex _red_node_index;
    1.77 +    typedef std::map<Node, std::string> BlueNodeIndex;
    1.78 +    BlueNodeIndex _blue_node_index;
    1.79      typedef std::map<Edge, std::string> EdgeIndex;
    1.80      EdgeIndex _edge_index;
    1.81  
    1.82      typedef std::vector<std::pair<std::string,
    1.83 -      _writer_bits::MapStorageBase<Node>* > > NodeMaps;
    1.84 -    NodeMaps _red_maps;
    1.85 -    NodeMaps _blue_maps;
    1.86 +      _writer_bits::MapStorageBase<RedNode>* > > RedNodeMaps;
    1.87 +    RedNodeMaps _red_node_maps;
    1.88 +    typedef std::vector<std::pair<std::string,
    1.89 +      _writer_bits::MapStorageBase<BlueNode>* > > BlueNodeMaps;
    1.90 +    BlueNodeMaps _blue_node_maps;
    1.91  
    1.92      typedef std::vector<std::pair<std::string,
    1.93        _writer_bits::MapStorageBase<Edge>* > >EdgeMaps;
    1.94 @@ -1710,13 +1743,13 @@
    1.95  
    1.96      /// \brief Destructor
    1.97      ~BpGraphWriter() {
    1.98 -      for (typename NodeMaps::iterator it = _red_maps.begin();
    1.99 -           it != _red_maps.end(); ++it) {
   1.100 +      for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
   1.101 +           it != _red_node_maps.end(); ++it) {
   1.102          delete it->second;
   1.103        }
   1.104  
   1.105 -      for (typename NodeMaps::iterator it = _blue_maps.begin();
   1.106 -           it != _blue_maps.end(); ++it) {
   1.107 +      for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
   1.108 +           it != _blue_node_maps.end(); ++it) {
   1.109          delete it->second;
   1.110        }
   1.111  
   1.112 @@ -1753,11 +1786,12 @@
   1.113        other._os = 0;
   1.114        other.local_os = false;
   1.115  
   1.116 -      _node_index.swap(other._node_index);
   1.117 +      _red_node_index.swap(other._red_node_index);
   1.118 +      _blue_node_index.swap(other._blue_node_index);
   1.119        _edge_index.swap(other._edge_index);
   1.120  
   1.121 -      _red_maps.swap(other._red_maps);
   1.122 -      _blue_maps.swap(other._blue_maps);
   1.123 +      _red_node_maps.swap(other._red_node_maps);
   1.124 +      _blue_node_maps.swap(other._blue_node_maps);
   1.125        _edge_maps.swap(other._edge_maps);
   1.126        _attributes.swap(other._attributes);
   1.127  
   1.128 @@ -1779,12 +1813,12 @@
   1.129      template <typename Map>
   1.130      BpGraphWriter& nodeMap(const std::string& caption, const Map& map) {
   1.131        checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
   1.132 -      _writer_bits::MapStorageBase<Node>* red_storage =
   1.133 -        new _writer_bits::MapStorage<Node, Map>(map);
   1.134 -      _red_maps.push_back(std::make_pair(caption, red_storage));
   1.135 -      _writer_bits::MapStorageBase<Node>* blue_storage =
   1.136 -        new _writer_bits::MapStorage<Node, Map>(map);
   1.137 -      _blue_maps.push_back(std::make_pair(caption, blue_storage));
   1.138 +      _writer_bits::MapStorageBase<RedNode>* red_storage =
   1.139 +        new _writer_bits::MapStorage<RedNode, Map>(map);
   1.140 +      _red_node_maps.push_back(std::make_pair(caption, red_storage));
   1.141 +      _writer_bits::MapStorageBase<BlueNode>* blue_storage =
   1.142 +        new _writer_bits::MapStorage<BlueNode, Map>(map);
   1.143 +      _blue_node_maps.push_back(std::make_pair(caption, blue_storage));
   1.144        return *this;
   1.145      }
   1.146  
   1.147 @@ -1796,12 +1830,12 @@
   1.148      BpGraphWriter& nodeMap(const std::string& caption, const Map& map,
   1.149                             const Converter& converter = Converter()) {
   1.150        checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
   1.151 -      _writer_bits::MapStorageBase<Node>* red_storage =
   1.152 -        new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
   1.153 -      _red_maps.push_back(std::make_pair(caption, red_storage));
   1.154 -      _writer_bits::MapStorageBase<Node>* blue_storage =
   1.155 -        new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
   1.156 -      _blue_maps.push_back(std::make_pair(caption, blue_storage));
   1.157 +      _writer_bits::MapStorageBase<RedNode>* red_storage =
   1.158 +        new _writer_bits::MapStorage<RedNode, Map, Converter>(map, converter);
   1.159 +      _red_node_maps.push_back(std::make_pair(caption, red_storage));
   1.160 +      _writer_bits::MapStorageBase<BlueNode>* blue_storage =
   1.161 +        new _writer_bits::MapStorage<BlueNode, Map, Converter>(map, converter);
   1.162 +      _blue_node_maps.push_back(std::make_pair(caption, blue_storage));
   1.163        return *this;
   1.164      }
   1.165  
   1.166 @@ -1810,10 +1844,10 @@
   1.167      /// Add a red node map writing rule to the writer.
   1.168      template <typename Map>
   1.169      BpGraphWriter& redNodeMap(const std::string& caption, const Map& map) {
   1.170 -      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
   1.171 -      _writer_bits::MapStorageBase<Node>* storage =
   1.172 -        new _writer_bits::MapStorage<Node, Map>(map);
   1.173 -      _red_maps.push_back(std::make_pair(caption, storage));
   1.174 +      checkConcept<concepts::ReadMap<RedNode, typename Map::Value>, Map>();
   1.175 +      _writer_bits::MapStorageBase<RedNode>* storage =
   1.176 +        new _writer_bits::MapStorage<RedNode, Map>(map);
   1.177 +      _red_node_maps.push_back(std::make_pair(caption, storage));
   1.178        return *this;
   1.179      }
   1.180  
   1.181 @@ -1824,10 +1858,10 @@
   1.182      template <typename Map, typename Converter>
   1.183      BpGraphWriter& redNodeMap(const std::string& caption, const Map& map,
   1.184                                const Converter& converter = Converter()) {
   1.185 -      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
   1.186 -      _writer_bits::MapStorageBase<Node>* storage =
   1.187 -        new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
   1.188 -      _red_maps.push_back(std::make_pair(caption, storage));
   1.189 +      checkConcept<concepts::ReadMap<RedNode, typename Map::Value>, Map>();
   1.190 +      _writer_bits::MapStorageBase<RedNode>* storage =
   1.191 +        new _writer_bits::MapStorage<RedNode, Map, Converter>(map, converter);
   1.192 +      _red_node_maps.push_back(std::make_pair(caption, storage));
   1.193        return *this;
   1.194      }
   1.195  
   1.196 @@ -1836,10 +1870,10 @@
   1.197      /// Add a blue node map writing rule to the writer.
   1.198      template <typename Map>
   1.199      BpGraphWriter& blueNodeMap(const std::string& caption, const Map& map) {
   1.200 -      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
   1.201 -      _writer_bits::MapStorageBase<Node>* storage =
   1.202 -        new _writer_bits::MapStorage<Node, Map>(map);
   1.203 -      _blue_maps.push_back(std::make_pair(caption, storage));
   1.204 +      checkConcept<concepts::ReadMap<BlueNode, typename Map::Value>, Map>();
   1.205 +      _writer_bits::MapStorageBase<BlueNode>* storage =
   1.206 +        new _writer_bits::MapStorage<BlueNode, Map>(map);
   1.207 +      _blue_node_maps.push_back(std::make_pair(caption, storage));
   1.208        return *this;
   1.209      }
   1.210  
   1.211 @@ -1850,10 +1884,10 @@
   1.212      template <typename Map, typename Converter>
   1.213      BpGraphWriter& blueNodeMap(const std::string& caption, const Map& map,
   1.214                                 const Converter& converter = Converter()) {
   1.215 -      checkConcept<concepts::ReadMap<Node, typename Map::Value>, Map>();
   1.216 -      _writer_bits::MapStorageBase<Node>* storage =
   1.217 -        new _writer_bits::MapStorage<Node, Map, Converter>(map, converter);
   1.218 -      _blue_maps.push_back(std::make_pair(caption, storage));
   1.219 +      checkConcept<concepts::ReadMap<BlueNode, typename Map::Value>, Map>();
   1.220 +      _writer_bits::MapStorageBase<BlueNode>* storage =
   1.221 +        new _writer_bits::MapStorage<BlueNode, Map, Converter>(map, converter);
   1.222 +      _blue_node_maps.push_back(std::make_pair(caption, storage));
   1.223        return *this;
   1.224      }
   1.225  
   1.226 @@ -1945,8 +1979,33 @@
   1.227      ///
   1.228      /// Add a node writing rule to the writer.
   1.229      BpGraphWriter& node(const std::string& caption, const Node& node) {
   1.230 +      typedef _writer_bits::DoubleMapLookUpConverter<
   1.231 +        Node, RedNodeIndex, BlueNodeIndex> Converter;
   1.232 +      Converter converter(_red_node_index, _blue_node_index);
   1.233 +      _writer_bits::ValueStorageBase* storage =
   1.234 +        new _writer_bits::ValueStorage<Node, Converter>(node, converter);
   1.235 +      _attributes.push_back(std::make_pair(caption, storage));
   1.236 +      return *this;
   1.237 +    }
   1.238 +
   1.239 +    /// \brief Red node writing rule
   1.240 +    ///
   1.241 +    /// Add a red node writing rule to the writer.
   1.242 +    BpGraphWriter& redNode(const std::string& caption, const RedNode& node) {
   1.243        typedef _writer_bits::MapLookUpConverter<Node> Converter;
   1.244 -      Converter converter(_node_index);
   1.245 +      Converter converter(_red_node_index);
   1.246 +      _writer_bits::ValueStorageBase* storage =
   1.247 +        new _writer_bits::ValueStorage<Node, Converter>(node, converter);
   1.248 +      _attributes.push_back(std::make_pair(caption, storage));
   1.249 +      return *this;
   1.250 +    }
   1.251 +
   1.252 +    /// \brief Blue node writing rule
   1.253 +    ///
   1.254 +    /// Add a blue node writing rule to the writer.
   1.255 +    BpGraphWriter& blueNode(const std::string& caption, const BlueNode& node) {
   1.256 +      typedef _writer_bits::MapLookUpConverter<Node> Converter;
   1.257 +      Converter converter(_blue_node_index);
   1.258        _writer_bits::ValueStorageBase* storage =
   1.259          new _writer_bits::ValueStorage<Node, Converter>(node, converter);
   1.260        _attributes.push_back(std::make_pair(caption, storage));
   1.261 @@ -2033,9 +2092,9 @@
   1.262    private:
   1.263  
   1.264      void writeRedNodes() {
   1.265 -      _writer_bits::MapStorageBase<Node>* label = 0;
   1.266 -      for (typename NodeMaps::iterator it = _red_maps.begin();
   1.267 -           it != _red_maps.end(); ++it) {
   1.268 +      _writer_bits::MapStorageBase<RedNode>* label = 0;
   1.269 +      for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
   1.270 +           it != _red_node_maps.end(); ++it) {
   1.271          if (it->first == "label") {
   1.272            label = it->second;
   1.273            break;
   1.274 @@ -2051,13 +2110,13 @@
   1.275        if (label == 0) {
   1.276          *_os << "label" << '\t';
   1.277        }
   1.278 -      for (typename NodeMaps::iterator it = _red_maps.begin();
   1.279 -           it != _red_maps.end(); ++it) {
   1.280 +      for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
   1.281 +           it != _red_node_maps.end(); ++it) {
   1.282          _writer_bits::writeToken(*_os, it->first) << '\t';
   1.283        }
   1.284        *_os << std::endl;
   1.285  
   1.286 -      std::vector<Node> nodes;
   1.287 +      std::vector<RedNode> nodes;
   1.288        for (RedNodeIt n(_graph); n != INVALID; ++n) {
   1.289          nodes.push_back(n);
   1.290        }
   1.291 @@ -2071,20 +2130,20 @@
   1.292        }
   1.293  
   1.294        for (int i = 0; i < static_cast<int>(nodes.size()); ++i) {
   1.295 -        Node n = nodes[i];
   1.296 +        RedNode n = nodes[i];
   1.297          if (label == 0) {
   1.298            std::ostringstream os;
   1.299 -          os << _graph.id(n);
   1.300 +          os << _graph.id(static_cast<Node>(n));
   1.301            _writer_bits::writeToken(*_os, os.str());
   1.302            *_os << '\t';
   1.303 -          _node_index.insert(std::make_pair(n, os.str()));
   1.304 +          _red_node_index.insert(std::make_pair(n, os.str()));
   1.305          }
   1.306 -        for (typename NodeMaps::iterator it = _red_maps.begin();
   1.307 -             it != _red_maps.end(); ++it) {
   1.308 +        for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
   1.309 +             it != _red_node_maps.end(); ++it) {
   1.310            std::string value = it->second->get(n);
   1.311            _writer_bits::writeToken(*_os, value);
   1.312            if (it->first == "label") {
   1.313 -            _node_index.insert(std::make_pair(n, value));
   1.314 +            _red_node_index.insert(std::make_pair(n, value));
   1.315            }
   1.316            *_os << '\t';
   1.317          }
   1.318 @@ -2093,9 +2152,9 @@
   1.319      }
   1.320  
   1.321      void writeBlueNodes() {
   1.322 -      _writer_bits::MapStorageBase<Node>* label = 0;
   1.323 -      for (typename NodeMaps::iterator it = _blue_maps.begin();
   1.324 -           it != _blue_maps.end(); ++it) {
   1.325 +      _writer_bits::MapStorageBase<BlueNode>* label = 0;
   1.326 +      for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
   1.327 +           it != _blue_node_maps.end(); ++it) {
   1.328          if (it->first == "label") {
   1.329            label = it->second;
   1.330            break;
   1.331 @@ -2111,13 +2170,13 @@
   1.332        if (label == 0) {
   1.333          *_os << "label" << '\t';
   1.334        }
   1.335 -      for (typename NodeMaps::iterator it = _blue_maps.begin();
   1.336 -           it != _blue_maps.end(); ++it) {
   1.337 +      for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
   1.338 +           it != _blue_node_maps.end(); ++it) {
   1.339          _writer_bits::writeToken(*_os, it->first) << '\t';
   1.340        }
   1.341        *_os << std::endl;
   1.342  
   1.343 -      std::vector<Node> nodes;
   1.344 +      std::vector<BlueNode> nodes;
   1.345        for (BlueNodeIt n(_graph); n != INVALID; ++n) {
   1.346          nodes.push_back(n);
   1.347        }
   1.348 @@ -2131,20 +2190,20 @@
   1.349        }
   1.350  
   1.351        for (int i = 0; i < static_cast<int>(nodes.size()); ++i) {
   1.352 -        Node n = nodes[i];
   1.353 +        BlueNode n = nodes[i];
   1.354          if (label == 0) {
   1.355            std::ostringstream os;
   1.356 -          os << _graph.id(n);
   1.357 +          os << _graph.id(static_cast<Node>(n));
   1.358            _writer_bits::writeToken(*_os, os.str());
   1.359            *_os << '\t';
   1.360 -          _node_index.insert(std::make_pair(n, os.str()));
   1.361 +          _blue_node_index.insert(std::make_pair(n, os.str()));
   1.362          }
   1.363 -        for (typename NodeMaps::iterator it = _blue_maps.begin();
   1.364 -             it != _blue_maps.end(); ++it) {
   1.365 +        for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
   1.366 +             it != _blue_node_maps.end(); ++it) {
   1.367            std::string value = it->second->get(n);
   1.368            _writer_bits::writeToken(*_os, value);
   1.369            if (it->first == "label") {
   1.370 -            _node_index.insert(std::make_pair(n, value));
   1.371 +            _blue_node_index.insert(std::make_pair(n, value));
   1.372            }
   1.373            *_os << '\t';
   1.374          }
   1.375 @@ -2153,9 +2212,9 @@
   1.376      }
   1.377  
   1.378      void createRedNodeIndex() {
   1.379 -      _writer_bits::MapStorageBase<Node>* label = 0;
   1.380 -      for (typename NodeMaps::iterator it = _red_maps.begin();
   1.381 -           it != _red_maps.end(); ++it) {
   1.382 +      _writer_bits::MapStorageBase<RedNode>* label = 0;
   1.383 +      for (typename RedNodeMaps::iterator it = _red_node_maps.begin();
   1.384 +           it != _red_node_maps.end(); ++it) {
   1.385          if (it->first == "label") {
   1.386            label = it->second;
   1.387            break;
   1.388 @@ -2163,23 +2222,23 @@
   1.389        }
   1.390  
   1.391        if (label == 0) {
   1.392 -        for (NodeIt n(_graph); n != INVALID; ++n) {
   1.393 +        for (RedNodeIt n(_graph); n != INVALID; ++n) {
   1.394            std::ostringstream os;
   1.395            os << _graph.id(n);
   1.396 -          _node_index.insert(std::make_pair(n, os.str()));
   1.397 +          _red_node_index.insert(std::make_pair(n, os.str()));
   1.398          }
   1.399        } else {
   1.400 -        for (NodeIt n(_graph); n != INVALID; ++n) {
   1.401 +        for (RedNodeIt n(_graph); n != INVALID; ++n) {
   1.402            std::string value = label->get(n);
   1.403 -          _node_index.insert(std::make_pair(n, value));
   1.404 +          _red_node_index.insert(std::make_pair(n, value));
   1.405          }
   1.406        }
   1.407      }
   1.408  
   1.409      void createBlueNodeIndex() {
   1.410 -      _writer_bits::MapStorageBase<Node>* label = 0;
   1.411 -      for (typename NodeMaps::iterator it = _blue_maps.begin();
   1.412 -           it != _blue_maps.end(); ++it) {
   1.413 +      _writer_bits::MapStorageBase<BlueNode>* label = 0;
   1.414 +      for (typename BlueNodeMaps::iterator it = _blue_node_maps.begin();
   1.415 +           it != _blue_node_maps.end(); ++it) {
   1.416          if (it->first == "label") {
   1.417            label = it->second;
   1.418            break;
   1.419 @@ -2187,15 +2246,15 @@
   1.420        }
   1.421  
   1.422        if (label == 0) {
   1.423 -        for (NodeIt n(_graph); n != INVALID; ++n) {
   1.424 +        for (BlueNodeIt n(_graph); n != INVALID; ++n) {
   1.425            std::ostringstream os;
   1.426            os << _graph.id(n);
   1.427 -          _node_index.insert(std::make_pair(n, os.str()));
   1.428 +          _blue_node_index.insert(std::make_pair(n, os.str()));
   1.429          }
   1.430        } else {
   1.431 -        for (NodeIt n(_graph); n != INVALID; ++n) {
   1.432 +        for (BlueNodeIt n(_graph); n != INVALID; ++n) {
   1.433            std::string value = label->get(n);
   1.434 -          _node_index.insert(std::make_pair(n, value));
   1.435 +          _blue_node_index.insert(std::make_pair(n, value));
   1.436          }
   1.437        }
   1.438      }
   1.439 @@ -2241,10 +2300,10 @@
   1.440  
   1.441        for (int i = 0; i < static_cast<int>(edges.size()); ++i) {
   1.442          Edge e = edges[i];
   1.443 -        _writer_bits::writeToken(*_os, _node_index.
   1.444 +        _writer_bits::writeToken(*_os, _red_node_index.
   1.445                                   find(_graph.redNode(e))->second);
   1.446          *_os << '\t';
   1.447 -        _writer_bits::writeToken(*_os, _node_index.
   1.448 +        _writer_bits::writeToken(*_os, _blue_node_index.
   1.449                                   find(_graph.blueNode(e))->second);
   1.450          *_os << '\t';
   1.451          if (label == 0) {