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>* >