lemon/core.h
changeset 1193 c8fa41fcc4a7
parent 1190 523e45e37e52
child 1194 699c7eac2c6d
     1.1 --- a/lemon/core.h	Thu Nov 25 22:45:29 2010 +0100
     1.2 +++ b/lemon/core.h	Thu Dec 01 09:05:47 2011 +0100
     1.3 @@ -550,26 +550,30 @@
     1.4      {
     1.5        template <typename From, typename NodeRefMap, typename EdgeRefMap>
     1.6        static void copy(const From& from, Graph &to,
     1.7 -                       NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
     1.8 +                       NodeRefMap& nodeRefMap,
     1.9 +                       EdgeRefMap& edgeRefMap) {
    1.10          to.build(from, nodeRefMap, edgeRefMap);
    1.11        }
    1.12      };
    1.13  
    1.14      template <typename BpGraph, typename Enable = void>
    1.15      struct BpGraphCopySelector {
    1.16 -      template <typename From, typename NodeRefMap, typename EdgeRefMap>
    1.17 +      template <typename From, typename RedNodeRefMap,
    1.18 +                typename BlueNodeRefMap, typename EdgeRefMap>
    1.19        static void copy(const From& from, BpGraph &to,
    1.20 -                       NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
    1.21 +                       RedNodeRefMap& redNodeRefMap,
    1.22 +                       BlueNodeRefMap& blueNodeRefMap,
    1.23 +                       EdgeRefMap& edgeRefMap) {
    1.24          to.clear();
    1.25          for (typename From::RedIt it(from); it != INVALID; ++it) {
    1.26 -          nodeRefMap[it] = to.addRedNode();
    1.27 +          redNodeRefMap[it] = to.addRedNode();
    1.28          }
    1.29          for (typename From::BlueIt it(from); it != INVALID; ++it) {
    1.30 -          nodeRefMap[it] = to.addBlueNode();
    1.31 +          blueNodeRefMap[it] = to.addBlueNode();
    1.32          }
    1.33          for (typename From::EdgeIt it(from); it != INVALID; ++it) {
    1.34 -          edgeRefMap[it] = to.addEdge(nodeRefMap[from.redNode(it)],
    1.35 -                                      nodeRefMap[from.blueNode(it)]);
    1.36 +          edgeRefMap[it] = to.addEdge(redNodeRefMap[from.redNode(it)],
    1.37 +                                      blueNodeRefMap[from.blueNode(it)]);
    1.38          }
    1.39        }
    1.40      };
    1.41 @@ -579,10 +583,13 @@
    1.42        BpGraph,
    1.43        typename enable_if<typename BpGraph::BuildTag, void>::type>
    1.44      {
    1.45 -      template <typename From, typename NodeRefMap, typename EdgeRefMap>
    1.46 +      template <typename From, typename RedNodeRefMap,
    1.47 +                typename BlueNodeRefMap, typename EdgeRefMap>
    1.48        static void copy(const From& from, BpGraph &to,
    1.49 -                       NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) {
    1.50 -        to.build(from, nodeRefMap, edgeRefMap);
    1.51 +                       RedNodeRefMap& redNodeRefMap,
    1.52 +                       BlueNodeRefMap& blueNodeRefMap,
    1.53 +                       EdgeRefMap& edgeRefMap) {
    1.54 +        to.build(from, redNodeRefMap, blueNodeRefMap, edgeRefMap);
    1.55        }
    1.56      };
    1.57  
    1.58 @@ -1182,12 +1189,38 @@
    1.59      typedef typename From::EdgeIt EdgeIt;
    1.60  
    1.61      typedef typename To::Node TNode;
    1.62 +    typedef typename To::RedNode TRedNode;
    1.63 +    typedef typename To::BlueNode TBlueNode;
    1.64      typedef typename To::Arc TArc;
    1.65      typedef typename To::Edge TEdge;
    1.66  
    1.67 -    typedef typename From::template NodeMap<TNode> NodeRefMap;
    1.68 +    typedef typename From::template RedMap<TRedNode> RedNodeRefMap;
    1.69 +    typedef typename From::template BlueMap<TBlueNode> BlueNodeRefMap;
    1.70      typedef typename From::template EdgeMap<TEdge> EdgeRefMap;
    1.71  
    1.72 +    struct NodeRefMap {
    1.73 +      NodeRefMap(const From& from, const RedNodeRefMap& red_node_ref,
    1.74 +                 const BlueNodeRefMap& blue_node_ref)
    1.75 +        : _from(from), _red_node_ref(red_node_ref),
    1.76 +          _blue_node_ref(blue_node_ref) {}
    1.77 +
    1.78 +      typedef typename From::Node Key;
    1.79 +      typedef typename To::Node Value;
    1.80 +
    1.81 +      Value operator[](const Key& key) const {
    1.82 +        std::pair<RedNode, BlueNode> red_blue_pair = _from.asRedBlueNode(key);
    1.83 +        if (red_blue_pair.first != INVALID) {
    1.84 +          return _red_node_ref[red_blue_pair.first];
    1.85 +        } else {
    1.86 +          return _blue_node_ref[red_blue_pair.second];
    1.87 +        }
    1.88 +      }
    1.89 +
    1.90 +      const From& _from;
    1.91 +      const RedNodeRefMap& _red_node_ref;
    1.92 +      const BlueNodeRefMap& _blue_node_ref;
    1.93 +    };
    1.94 +
    1.95      struct ArcRefMap {
    1.96        ArcRefMap(const From& from, const To& to, const EdgeRefMap& edge_ref)
    1.97          : _from(from), _to(to), _edge_ref(edge_ref) {}
    1.98 @@ -1292,7 +1325,7 @@
    1.99      template <typename RedRef>
   1.100      BpGraphCopy& redRef(RedRef& map) {
   1.101        _red_maps.push_back(new _core_bits::RefCopy<From, RedNode,
   1.102 -                          NodeRefMap, RedRef>(map));
   1.103 +                          RedNodeRefMap, RedRef>(map));
   1.104        return *this;
   1.105      }
   1.106  
   1.107 @@ -1306,7 +1339,7 @@
   1.108      template <typename RedCrossRef>
   1.109      BpGraphCopy& redCrossRef(RedCrossRef& map) {
   1.110        _red_maps.push_back(new _core_bits::CrossRefCopy<From, RedNode,
   1.111 -                          NodeRefMap, RedCrossRef>(map));
   1.112 +                          RedNodeRefMap, RedCrossRef>(map));
   1.113        return *this;
   1.114      }
   1.115  
   1.116 @@ -1321,7 +1354,16 @@
   1.117      template <typename FromMap, typename ToMap>
   1.118      BpGraphCopy& redMap(const FromMap& map, ToMap& tmap) {
   1.119        _red_maps.push_back(new _core_bits::MapCopy<From, RedNode,
   1.120 -                           NodeRefMap, FromMap, ToMap>(map, tmap));
   1.121 +                          RedNodeRefMap, FromMap, ToMap>(map, tmap));
   1.122 +      return *this;
   1.123 +    }
   1.124 +
   1.125 +    /// \brief Make a copy of the given red node.
   1.126 +    ///
   1.127 +    /// This function makes a copy of the given red node.
   1.128 +    BpGraphCopy& redNode(const RedNode& node, TRedNode& tnode) {
   1.129 +      _red_maps.push_back(new _core_bits::ItemCopy<From, RedNode,
   1.130 +                          RedNodeRefMap, TRedNode>(node, tnode));
   1.131        return *this;
   1.132      }
   1.133  
   1.134 @@ -1334,7 +1376,7 @@
   1.135      template <typename BlueRef>
   1.136      BpGraphCopy& blueRef(BlueRef& map) {
   1.137        _blue_maps.push_back(new _core_bits::RefCopy<From, BlueNode,
   1.138 -                           NodeRefMap, BlueRef>(map));
   1.139 +                           BlueNodeRefMap, BlueRef>(map));
   1.140        return *this;
   1.141      }
   1.142  
   1.143 @@ -1348,7 +1390,7 @@
   1.144      template <typename BlueCrossRef>
   1.145      BpGraphCopy& blueCrossRef(BlueCrossRef& map) {
   1.146        _blue_maps.push_back(new _core_bits::CrossRefCopy<From, BlueNode,
   1.147 -                           NodeRefMap, BlueCrossRef>(map));
   1.148 +                           BlueNodeRefMap, BlueCrossRef>(map));
   1.149        return *this;
   1.150      }
   1.151  
   1.152 @@ -1363,7 +1405,16 @@
   1.153      template <typename FromMap, typename ToMap>
   1.154      BpGraphCopy& blueMap(const FromMap& map, ToMap& tmap) {
   1.155        _blue_maps.push_back(new _core_bits::MapCopy<From, BlueNode,
   1.156 -                           NodeRefMap, FromMap, ToMap>(map, tmap));
   1.157 +                           BlueNodeRefMap, FromMap, ToMap>(map, tmap));
   1.158 +      return *this;
   1.159 +    }
   1.160 +
   1.161 +    /// \brief Make a copy of the given blue node.
   1.162 +    ///
   1.163 +    /// This function makes a copy of the given blue node.
   1.164 +    BpGraphCopy& blueNode(const BlueNode& node, TBlueNode& tnode) {
   1.165 +      _blue_maps.push_back(new _core_bits::ItemCopy<From, BlueNode,
   1.166 +                           BlueNodeRefMap, TBlueNode>(node, tnode));
   1.167        return *this;
   1.168      }
   1.169  
   1.170 @@ -1470,19 +1521,21 @@
   1.171      /// This function executes the copying of the graph along with the
   1.172      /// copying of the assigned data.
   1.173      void run() {
   1.174 -      NodeRefMap nodeRefMap(_from);
   1.175 +      RedNodeRefMap redNodeRefMap(_from);
   1.176 +      BlueNodeRefMap blueNodeRefMap(_from);
   1.177 +      NodeRefMap nodeRefMap(_from, redNodeRefMap, blueNodeRefMap);
   1.178        EdgeRefMap edgeRefMap(_from);
   1.179        ArcRefMap arcRefMap(_from, _to, edgeRefMap);
   1.180        _core_bits::BpGraphCopySelector<To>::
   1.181 -        copy(_from, _to, nodeRefMap, edgeRefMap);
   1.182 +        copy(_from, _to, redNodeRefMap, blueNodeRefMap, edgeRefMap);
   1.183        for (int i = 0; i < int(_node_maps.size()); ++i) {
   1.184          _node_maps[i]->copy(_from, nodeRefMap);
   1.185        }
   1.186        for (int i = 0; i < int(_red_maps.size()); ++i) {
   1.187 -        _red_maps[i]->copy(_from, nodeRefMap);
   1.188 +        _red_maps[i]->copy(_from, redNodeRefMap);
   1.189        }
   1.190        for (int i = 0; i < int(_blue_maps.size()); ++i) {
   1.191 -        _blue_maps[i]->copy(_from, nodeRefMap);
   1.192 +        _blue_maps[i]->copy(_from, blueNodeRefMap);
   1.193        }
   1.194        for (int i = 0; i < int(_edge_maps.size()); ++i) {
   1.195          _edge_maps[i]->copy(_from, edgeRefMap);
   1.196 @@ -1500,10 +1553,10 @@
   1.197      std::vector<_core_bits::MapCopyBase<From, Node, NodeRefMap>* >
   1.198        _node_maps;
   1.199  
   1.200 -    std::vector<_core_bits::MapCopyBase<From, RedNode, NodeRefMap>* >
   1.201 +    std::vector<_core_bits::MapCopyBase<From, RedNode, RedNodeRefMap>* >
   1.202        _red_maps;
   1.203  
   1.204 -    std::vector<_core_bits::MapCopyBase<From, BlueNode, NodeRefMap>* >
   1.205 +    std::vector<_core_bits::MapCopyBase<From, BlueNode, BlueNodeRefMap>* >
   1.206        _blue_maps;
   1.207  
   1.208      std::vector<_core_bits::MapCopyBase<From, Arc, ArcRefMap>* >