diff -r b84e68af8248 -r c8fa41fcc4a7 lemon/core.h --- a/lemon/core.h Thu Nov 25 22:45:29 2010 +0100 +++ b/lemon/core.h Thu Dec 01 09:05:47 2011 +0100 @@ -550,26 +550,30 @@ { template static void copy(const From& from, Graph &to, - NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) { + NodeRefMap& nodeRefMap, + EdgeRefMap& edgeRefMap) { to.build(from, nodeRefMap, edgeRefMap); } }; template struct BpGraphCopySelector { - template + template static void copy(const From& from, BpGraph &to, - NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) { + RedNodeRefMap& redNodeRefMap, + BlueNodeRefMap& blueNodeRefMap, + EdgeRefMap& edgeRefMap) { to.clear(); for (typename From::RedIt it(from); it != INVALID; ++it) { - nodeRefMap[it] = to.addRedNode(); + redNodeRefMap[it] = to.addRedNode(); } for (typename From::BlueIt it(from); it != INVALID; ++it) { - nodeRefMap[it] = to.addBlueNode(); + blueNodeRefMap[it] = to.addBlueNode(); } for (typename From::EdgeIt it(from); it != INVALID; ++it) { - edgeRefMap[it] = to.addEdge(nodeRefMap[from.redNode(it)], - nodeRefMap[from.blueNode(it)]); + edgeRefMap[it] = to.addEdge(redNodeRefMap[from.redNode(it)], + blueNodeRefMap[from.blueNode(it)]); } } }; @@ -579,10 +583,13 @@ BpGraph, typename enable_if::type> { - template + template static void copy(const From& from, BpGraph &to, - NodeRefMap& nodeRefMap, EdgeRefMap& edgeRefMap) { - to.build(from, nodeRefMap, edgeRefMap); + RedNodeRefMap& redNodeRefMap, + BlueNodeRefMap& blueNodeRefMap, + EdgeRefMap& edgeRefMap) { + to.build(from, redNodeRefMap, blueNodeRefMap, edgeRefMap); } }; @@ -1182,12 +1189,38 @@ typedef typename From::EdgeIt EdgeIt; typedef typename To::Node TNode; + typedef typename To::RedNode TRedNode; + typedef typename To::BlueNode TBlueNode; typedef typename To::Arc TArc; typedef typename To::Edge TEdge; - typedef typename From::template NodeMap NodeRefMap; + typedef typename From::template RedMap RedNodeRefMap; + typedef typename From::template BlueMap BlueNodeRefMap; typedef typename From::template EdgeMap EdgeRefMap; + struct NodeRefMap { + NodeRefMap(const From& from, const RedNodeRefMap& red_node_ref, + const BlueNodeRefMap& blue_node_ref) + : _from(from), _red_node_ref(red_node_ref), + _blue_node_ref(blue_node_ref) {} + + typedef typename From::Node Key; + typedef typename To::Node Value; + + Value operator[](const Key& key) const { + std::pair red_blue_pair = _from.asRedBlueNode(key); + if (red_blue_pair.first != INVALID) { + return _red_node_ref[red_blue_pair.first]; + } else { + return _blue_node_ref[red_blue_pair.second]; + } + } + + const From& _from; + const RedNodeRefMap& _red_node_ref; + const BlueNodeRefMap& _blue_node_ref; + }; + struct ArcRefMap { ArcRefMap(const From& from, const To& to, const EdgeRefMap& edge_ref) : _from(from), _to(to), _edge_ref(edge_ref) {} @@ -1292,7 +1325,7 @@ template BpGraphCopy& redRef(RedRef& map) { _red_maps.push_back(new _core_bits::RefCopy(map)); + RedNodeRefMap, RedRef>(map)); return *this; } @@ -1306,7 +1339,7 @@ template BpGraphCopy& redCrossRef(RedCrossRef& map) { _red_maps.push_back(new _core_bits::CrossRefCopy(map)); + RedNodeRefMap, RedCrossRef>(map)); return *this; } @@ -1321,7 +1354,16 @@ template BpGraphCopy& redMap(const FromMap& map, ToMap& tmap) { _red_maps.push_back(new _core_bits::MapCopy(map, tmap)); + RedNodeRefMap, FromMap, ToMap>(map, tmap)); + return *this; + } + + /// \brief Make a copy of the given red node. + /// + /// This function makes a copy of the given red node. + BpGraphCopy& redNode(const RedNode& node, TRedNode& tnode) { + _red_maps.push_back(new _core_bits::ItemCopy(node, tnode)); return *this; } @@ -1334,7 +1376,7 @@ template BpGraphCopy& blueRef(BlueRef& map) { _blue_maps.push_back(new _core_bits::RefCopy(map)); + BlueNodeRefMap, BlueRef>(map)); return *this; } @@ -1348,7 +1390,7 @@ template BpGraphCopy& blueCrossRef(BlueCrossRef& map) { _blue_maps.push_back(new _core_bits::CrossRefCopy(map)); + BlueNodeRefMap, BlueCrossRef>(map)); return *this; } @@ -1363,7 +1405,16 @@ template BpGraphCopy& blueMap(const FromMap& map, ToMap& tmap) { _blue_maps.push_back(new _core_bits::MapCopy(map, tmap)); + BlueNodeRefMap, FromMap, ToMap>(map, tmap)); + return *this; + } + + /// \brief Make a copy of the given blue node. + /// + /// This function makes a copy of the given blue node. + BpGraphCopy& blueNode(const BlueNode& node, TBlueNode& tnode) { + _blue_maps.push_back(new _core_bits::ItemCopy(node, tnode)); return *this; } @@ -1470,19 +1521,21 @@ /// This function executes the copying of the graph along with the /// copying of the assigned data. void run() { - NodeRefMap nodeRefMap(_from); + RedNodeRefMap redNodeRefMap(_from); + BlueNodeRefMap blueNodeRefMap(_from); + NodeRefMap nodeRefMap(_from, redNodeRefMap, blueNodeRefMap); EdgeRefMap edgeRefMap(_from); ArcRefMap arcRefMap(_from, _to, edgeRefMap); _core_bits::BpGraphCopySelector:: - copy(_from, _to, nodeRefMap, edgeRefMap); + copy(_from, _to, redNodeRefMap, blueNodeRefMap, edgeRefMap); for (int i = 0; i < int(_node_maps.size()); ++i) { _node_maps[i]->copy(_from, nodeRefMap); } for (int i = 0; i < int(_red_maps.size()); ++i) { - _red_maps[i]->copy(_from, nodeRefMap); + _red_maps[i]->copy(_from, redNodeRefMap); } for (int i = 0; i < int(_blue_maps.size()); ++i) { - _blue_maps[i]->copy(_from, nodeRefMap); + _blue_maps[i]->copy(_from, blueNodeRefMap); } for (int i = 0; i < int(_edge_maps.size()); ++i) { _edge_maps[i]->copy(_from, edgeRefMap); @@ -1500,10 +1553,10 @@ std::vector<_core_bits::MapCopyBase* > _node_maps; - std::vector<_core_bits::MapCopyBase* > + std::vector<_core_bits::MapCopyBase* > _red_maps; - std::vector<_core_bits::MapCopyBase* > + std::vector<_core_bits::MapCopyBase* > _blue_maps; std::vector<_core_bits::MapCopyBase* >