... | ... |
@@ -808,29 +808,32 @@ |
808 | 808 |
(digraph, nfm, afm); |
809 | 809 |
} |
810 | 810 |
|
811 | 811 |
template<typename Digraph, typename NodeFilterMap, typename ArcFilterMap> |
812 | 812 |
SubDigraph<const Digraph, const NodeFilterMap, const ArcFilterMap> |
813 | 813 |
subDigraph(const Digraph& digraph, |
814 | 814 |
const NodeFilterMap& nfm, const ArcFilterMap& afm) { |
815 | 815 |
return SubDigraph<const Digraph, const NodeFilterMap, |
816 | 816 |
const ArcFilterMap>(digraph, nfm, afm); |
817 | 817 |
} |
818 | 818 |
|
819 | 819 |
|
820 |
template <typename _Graph, typename NodeFilterMap, |
|
821 |
typename EdgeFilterMap, bool _checked = true> |
|
820 |
template <typename _Graph, typename _NodeFilterMap, |
|
821 |
typename _EdgeFilterMap, bool _checked = true> |
|
822 | 822 |
class SubGraphBase : public GraphAdaptorBase<_Graph> { |
823 | 823 |
public: |
824 | 824 |
typedef _Graph Graph; |
825 |
typedef _NodeFilterMap NodeFilterMap; |
|
826 |
typedef _EdgeFilterMap EdgeFilterMap; |
|
827 |
|
|
825 | 828 |
typedef SubGraphBase Adaptor; |
826 | 829 |
typedef GraphAdaptorBase<_Graph> Parent; |
827 | 830 |
protected: |
828 | 831 |
|
829 | 832 |
NodeFilterMap* _node_filter_map; |
830 | 833 |
EdgeFilterMap* _edge_filter_map; |
831 | 834 |
|
832 | 835 |
SubGraphBase() |
833 | 836 |
: Parent(), _node_filter_map(0), _edge_filter_map(0) { } |
834 | 837 |
|
835 | 838 |
void setNodeFilterMap(NodeFilterMap& node_filter_map) { |
836 | 839 |
_node_filter_map=&node_filter_map; |
... | ... |
@@ -1039,29 +1042,32 @@ |
1039 | 1042 |
return operator=<EdgeMap>(cmap); |
1040 | 1043 |
} |
1041 | 1044 |
|
1042 | 1045 |
template <typename CMap> |
1043 | 1046 |
EdgeMap& operator=(const CMap& cmap) { |
1044 | 1047 |
MapParent::operator=(cmap); |
1045 | 1048 |
return *this; |
1046 | 1049 |
} |
1047 | 1050 |
}; |
1048 | 1051 |
|
1049 | 1052 |
}; |
1050 | 1053 |
|
1051 |
template <typename _Graph, typename NodeFilterMap, typename EdgeFilterMap> |
|
1052 |
class SubGraphBase<_Graph, NodeFilterMap, EdgeFilterMap, false> |
|
1054 |
template <typename _Graph, typename _NodeFilterMap, typename _EdgeFilterMap> |
|
1055 |
class SubGraphBase<_Graph, _NodeFilterMap, _EdgeFilterMap, false> |
|
1053 | 1056 |
: public GraphAdaptorBase<_Graph> { |
1054 | 1057 |
public: |
1055 | 1058 |
typedef _Graph Graph; |
1059 |
typedef _NodeFilterMap NodeFilterMap; |
|
1060 |
typedef _EdgeFilterMap EdgeFilterMap; |
|
1061 |
|
|
1056 | 1062 |
typedef SubGraphBase Adaptor; |
1057 | 1063 |
typedef GraphAdaptorBase<_Graph> Parent; |
1058 | 1064 |
protected: |
1059 | 1065 |
NodeFilterMap* _node_filter_map; |
1060 | 1066 |
EdgeFilterMap* _edge_filter_map; |
1061 | 1067 |
SubGraphBase() : Parent(), |
1062 | 1068 |
_node_filter_map(0), _edge_filter_map(0) { } |
1063 | 1069 |
|
1064 | 1070 |
void setNodeFilterMap(NodeFilterMap& node_filter_map) { |
1065 | 1071 |
_node_filter_map=&node_filter_map; |
1066 | 1072 |
} |
1067 | 1073 |
void setEdgeFilterMap(EdgeFilterMap& edge_filter_map) { |
... | ... |
@@ -1848,25 +1854,25 @@ |
1848 | 1854 |
|
1849 | 1855 |
Node addNode() { return _digraph->addNode(); } |
1850 | 1856 |
Edge addEdge(const Node& u, const Node& v) { |
1851 | 1857 |
return _digraph->addArc(u, v); |
1852 | 1858 |
} |
1853 | 1859 |
|
1854 | 1860 |
void erase(const Node& i) { _digraph->erase(i); } |
1855 | 1861 |
void erase(const Edge& i) { _digraph->erase(i); } |
1856 | 1862 |
|
1857 | 1863 |
void clear() { _digraph->clear(); } |
1858 | 1864 |
|
1859 | 1865 |
typedef NodeNumTagIndicator<Digraph> NodeNumTag; |
1860 |
int nodeNum() const { return |
|
1866 |
int nodeNum() const { return _digraph->nodeNum(); } |
|
1861 | 1867 |
|
1862 | 1868 |
typedef ArcNumTagIndicator<Digraph> ArcNumTag; |
1863 | 1869 |
int arcNum() const { return 2 * _digraph->arcNum(); } |
1864 | 1870 |
|
1865 | 1871 |
typedef ArcNumTag EdgeNumTag; |
1866 | 1872 |
int edgeNum() const { return _digraph->arcNum(); } |
1867 | 1873 |
|
1868 | 1874 |
typedef FindArcTagIndicator<Digraph> FindArcTag; |
1869 | 1875 |
Arc findArc(Node s, Node t, Arc p = INVALID) const { |
1870 | 1876 |
if (p == INVALID) { |
1871 | 1877 |
Edge arc = _digraph->findArc(s, t); |
1872 | 1878 |
if (arc != INVALID) return direct(arc, true); |
... | ... |
@@ -1883,25 +1889,25 @@ |
1883 | 1889 |
} |
1884 | 1890 |
return INVALID; |
1885 | 1891 |
} |
1886 | 1892 |
|
1887 | 1893 |
typedef FindArcTag FindEdgeTag; |
1888 | 1894 |
Edge findEdge(Node s, Node t, Edge p = INVALID) const { |
1889 | 1895 |
if (s != t) { |
1890 | 1896 |
if (p == INVALID) { |
1891 | 1897 |
Edge arc = _digraph->findArc(s, t); |
1892 | 1898 |
if (arc != INVALID) return arc; |
1893 | 1899 |
arc = _digraph->findArc(t, s); |
1894 | 1900 |
if (arc != INVALID) return arc; |
1895 |
} else if (_digraph-> |
|
1901 |
} else if (_digraph->source(p) == s) { |
|
1896 | 1902 |
Edge arc = _digraph->findArc(s, t, p); |
1897 | 1903 |
if (arc != INVALID) return arc; |
1898 | 1904 |
arc = _digraph->findArc(t, s); |
1899 | 1905 |
if (arc != INVALID) return arc; |
1900 | 1906 |
} else { |
1901 | 1907 |
Edge arc = _digraph->findArc(t, s, p); |
1902 | 1908 |
if (arc != INVALID) return arc; |
1903 | 1909 |
} |
1904 | 1910 |
} else { |
1905 | 1911 |
return _digraph->findArc(s, t, p); |
1906 | 1912 |
} |
1907 | 1913 |
return INVALID; |
... | ... |
@@ -1912,50 +1918,52 @@ |
1912 | 1918 |
template <typename _Value> |
1913 | 1919 |
class ArcMapBase { |
1914 | 1920 |
private: |
1915 | 1921 |
|
1916 | 1922 |
typedef typename Digraph::template ArcMap<_Value> MapImpl; |
1917 | 1923 |
|
1918 | 1924 |
public: |
1919 | 1925 |
|
1920 | 1926 |
typedef typename MapTraits<MapImpl>::ReferenceMapTag ReferenceMapTag; |
1921 | 1927 |
|
1922 | 1928 |
typedef _Value Value; |
1923 | 1929 |
typedef Arc Key; |
1930 |
typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReturnValue; |
|
1931 |
typedef typename MapTraits<MapImpl>::ReturnValue ReturnValue; |
|
1932 |
typedef typename MapTraits<MapImpl>::ConstReturnValue ConstReference; |
|
1933 |
typedef typename MapTraits<MapImpl>::ReturnValue Reference; |
|
1924 | 1934 |
|
1925 | 1935 |
ArcMapBase(const Adaptor& adaptor) : |
1926 | 1936 |
_forward(*adaptor._digraph), _backward(*adaptor._digraph) {} |
1927 | 1937 |
|
1928 | 1938 |
ArcMapBase(const Adaptor& adaptor, const Value& v) |
1929 | 1939 |
: _forward(*adaptor._digraph, v), _backward(*adaptor._digraph, v) {} |
1930 | 1940 |
|
1931 | 1941 |
void set(const Arc& a, const Value& v) { |
1932 | 1942 |
if (direction(a)) { |
1933 | 1943 |
_forward.set(a, v); |
1934 | 1944 |
} else { |
1935 | 1945 |
_backward.set(a, v); |
1936 | 1946 |
} |
1937 | 1947 |
} |
1938 | 1948 |
|
1939 |
typename MapTraits<MapImpl>::ConstReturnValue |
|
1940 |
operator[](const Arc& a) const { |
|
1949 |
ConstReturnValue operator[](const Arc& a) const { |
|
1941 | 1950 |
if (direction(a)) { |
1942 | 1951 |
return _forward[a]; |
1943 | 1952 |
} else { |
1944 | 1953 |
return _backward[a]; |
1945 | 1954 |
} |
1946 | 1955 |
} |
1947 | 1956 |
|
1948 |
typename MapTraits<MapImpl>::ReturnValue |
|
1949 |
operator[](const Arc& a) { |
|
1957 |
ReturnValue operator[](const Arc& a) { |
|
1950 | 1958 |
if (direction(a)) { |
1951 | 1959 |
return _forward[a]; |
1952 | 1960 |
} else { |
1953 | 1961 |
return _backward[a]; |
1954 | 1962 |
} |
1955 | 1963 |
} |
1956 | 1964 |
|
1957 | 1965 |
protected: |
1958 | 1966 |
|
1959 | 1967 |
MapImpl _forward, _backward; |
1960 | 1968 |
|
1961 | 1969 |
}; |
... | ... |
@@ -1987,25 +1995,25 @@ |
1987 | 1995 |
} |
1988 | 1996 |
|
1989 | 1997 |
}; |
1990 | 1998 |
|
1991 | 1999 |
template <typename _Value> |
1992 | 2000 |
class ArcMap |
1993 | 2001 |
: public SubMapExtender<Adaptor, ArcMapBase<_Value> > |
1994 | 2002 |
{ |
1995 | 2003 |
public: |
1996 | 2004 |
typedef _Value Value; |
1997 | 2005 |
typedef SubMapExtender<Adaptor, ArcMapBase<Value> > Parent; |
1998 | 2006 |
|
1999 |
ArcMap(const Adaptor& adaptor) |
|
2007 |
explicit ArcMap(const Adaptor& adaptor) |
|
2000 | 2008 |
: Parent(adaptor) {} |
2001 | 2009 |
|
2002 | 2010 |
ArcMap(const Adaptor& adaptor, const Value& value) |
2003 | 2011 |
: Parent(adaptor, value) {} |
2004 | 2012 |
|
2005 | 2013 |
private: |
2006 | 2014 |
ArcMap& operator=(const ArcMap& cmap) { |
2007 | 2015 |
return operator=<ArcMap>(cmap); |
2008 | 2016 |
} |
2009 | 2017 |
|
2010 | 2018 |
template <typename CMap> |
2011 | 2019 |
ArcMap& operator=(const CMap& cmap) { |
... | ... |
@@ -2034,24 +2042,27 @@ |
2034 | 2042 |
|
2035 | 2043 |
template <typename CMap> |
2036 | 2044 |
EdgeMap& operator=(const CMap& cmap) { |
2037 | 2045 |
Parent::operator=(cmap); |
2038 | 2046 |
return *this; |
2039 | 2047 |
} |
2040 | 2048 |
|
2041 | 2049 |
}; |
2042 | 2050 |
|
2043 | 2051 |
typedef typename ItemSetTraits<Digraph, Node>::ItemNotifier NodeNotifier; |
2044 | 2052 |
NodeNotifier& notifier(Node) const { return _digraph->notifier(Node()); } |
2045 | 2053 |
|
2054 |
typedef typename ItemSetTraits<Digraph, Edge>::ItemNotifier EdgeNotifier; |
|
2055 |
EdgeNotifier& notifier(Edge) const { return _digraph->notifier(Edge()); } |
|
2056 |
|
|
2046 | 2057 |
protected: |
2047 | 2058 |
|
2048 | 2059 |
UndirectorBase() : _digraph(0) {} |
2049 | 2060 |
|
2050 | 2061 |
Digraph* _digraph; |
2051 | 2062 |
|
2052 | 2063 |
void setDigraph(Digraph& digraph) { |
2053 | 2064 |
_digraph = &digraph; |
2054 | 2065 |
} |
2055 | 2066 |
|
2056 | 2067 |
}; |
2057 | 2068 |
|
... | ... |
@@ -2091,59 +2102,62 @@ |
2091 | 2102 |
template <typename _ForwardMap, typename _BackwardMap> |
2092 | 2103 |
class CombinedArcMap { |
2093 | 2104 |
public: |
2094 | 2105 |
|
2095 | 2106 |
typedef _ForwardMap ForwardMap; |
2096 | 2107 |
typedef _BackwardMap BackwardMap; |
2097 | 2108 |
|
2098 | 2109 |
typedef typename MapTraits<ForwardMap>::ReferenceMapTag ReferenceMapTag; |
2099 | 2110 |
|
2100 | 2111 |
typedef typename ForwardMap::Value Value; |
2101 | 2112 |
typedef typename Parent::Arc Key; |
2102 | 2113 |
|
2114 |
typedef typename MapTraits<ForwardMap>::ReturnValue ReturnValue; |
|
2115 |
typedef typename MapTraits<ForwardMap>::ConstReturnValue ConstReturnValue; |
|
2116 |
typedef typename MapTraits<ForwardMap>::ReturnValue Reference; |
|
2117 |
typedef typename MapTraits<ForwardMap>::ConstReturnValue ConstReference; |
|
2118 |
|
|
2103 | 2119 |
/// \brief Constructor |
2104 | 2120 |
/// |
2105 | 2121 |
/// Constructor |
2106 | 2122 |
CombinedArcMap(ForwardMap& forward, BackwardMap& backward) |
2107 | 2123 |
: _forward(&forward), _backward(&backward) {} |
2108 | 2124 |
|
2109 | 2125 |
|
2110 | 2126 |
/// \brief Sets the value associated with a key. |
2111 | 2127 |
/// |
2112 | 2128 |
/// Sets the value associated with a key. |
2113 | 2129 |
void set(const Key& e, const Value& a) { |
2114 | 2130 |
if (Parent::direction(e)) { |
2115 | 2131 |
_forward->set(e, a); |
2116 | 2132 |
} else { |
2117 | 2133 |
_backward->set(e, a); |
2118 | 2134 |
} |
2119 | 2135 |
} |
2120 | 2136 |
|
2121 | 2137 |
/// \brief Returns the value associated with a key. |
2122 | 2138 |
/// |
2123 | 2139 |
/// Returns the value associated with a key. |
2124 |
typename MapTraits<ForwardMap>::ConstReturnValue |
|
2125 |
operator[](const Key& e) const { |
|
2140 |
ConstReturnValue operator[](const Key& e) const { |
|
2126 | 2141 |
if (Parent::direction(e)) { |
2127 | 2142 |
return (*_forward)[e]; |
2128 | 2143 |
} else { |
2129 | 2144 |
return (*_backward)[e]; |
2130 | 2145 |
} |
2131 | 2146 |
} |
2132 | 2147 |
|
2133 | 2148 |
/// \brief Returns the value associated with a key. |
2134 | 2149 |
/// |
2135 | 2150 |
/// Returns the value associated with a key. |
2136 |
typename MapTraits<ForwardMap>::ReturnValue |
|
2137 |
operator[](const Key& e) { |
|
2151 |
ReturnValue operator[](const Key& e) { |
|
2138 | 2152 |
if (Parent::direction(e)) { |
2139 | 2153 |
return (*_forward)[e]; |
2140 | 2154 |
} else { |
2141 | 2155 |
return (*_backward)[e]; |
2142 | 2156 |
} |
2143 | 2157 |
} |
2144 | 2158 |
|
2145 | 2159 |
protected: |
2146 | 2160 |
|
2147 | 2161 |
ForwardMap* _forward; |
2148 | 2162 |
BackwardMap* _backward; |
2149 | 2163 |
|
... | ... |
@@ -2237,47 +2251,38 @@ |
2237 | 2251 |
return (*_direction)[e] ? _graph->v(e) : _graph->u(e); |
2238 | 2252 |
} |
2239 | 2253 |
|
2240 | 2254 |
typedef NodeNumTagIndicator<Graph> NodeNumTag; |
2241 | 2255 |
int nodeNum() const { return _graph->nodeNum(); } |
2242 | 2256 |
|
2243 | 2257 |
typedef EdgeNumTagIndicator<Graph> ArcNumTag; |
2244 | 2258 |
int arcNum() const { return _graph->edgeNum(); } |
2245 | 2259 |
|
2246 | 2260 |
typedef FindEdgeTagIndicator<Graph> FindArcTag; |
2247 | 2261 |
Arc findArc(const Node& u, const Node& v, |
2248 | 2262 |
const Arc& prev = INVALID) const { |
2249 |
Arc arc = prev; |
|
2250 |
bool d = arc == INVALID ? true : (*_direction)[arc]; |
|
2251 |
|
|
2263 |
Arc arc = _graph->findEdge(u, v, prev); |
|
2264 |
while (arc != INVALID && source(arc) != u) { |
|
2252 | 2265 |
arc = _graph->findEdge(u, v, arc); |
2253 |
while (arc != INVALID && !(*_direction)[arc]) { |
|
2254 |
_graph->findEdge(u, v, arc); |
|
2255 |
} |
|
2256 |
if (arc != INVALID) return arc; |
|
2257 |
} |
|
2258 |
_graph->findEdge(v, u, arc); |
|
2259 |
while (arc != INVALID && (*_direction)[arc]) { |
|
2260 |
_graph->findEdge(u, v, arc); |
|
2261 | 2266 |
} |
2262 | 2267 |
return arc; |
2263 | 2268 |
} |
2264 | 2269 |
|
2265 | 2270 |
Node addNode() { |
2266 | 2271 |
return Node(_graph->addNode()); |
2267 | 2272 |
} |
2268 | 2273 |
|
2269 | 2274 |
Arc addArc(const Node& u, const Node& v) { |
2270 |
Arc arc = _graph->addArc(u, v); |
|
2271 |
_direction->set(arc, _graph->source(arc) == u); |
|
2275 |
Arc arc = _graph->addEdge(u, v); |
|
2276 |
_direction->set(arc, _graph->u(arc) == u); |
|
2272 | 2277 |
return arc; |
2273 | 2278 |
} |
2274 | 2279 |
|
2275 | 2280 |
void erase(const Node& i) { _graph->erase(i); } |
2276 | 2281 |
void erase(const Arc& i) { _graph->erase(i); } |
2277 | 2282 |
|
2278 | 2283 |
void clear() { _graph->clear(); } |
2279 | 2284 |
|
2280 | 2285 |
int id(const Node& v) const { return _graph->id(v); } |
2281 | 2286 |
int id(const Arc& e) const { return _graph->id(e); } |
2282 | 2287 |
|
2283 | 2288 |
Node nodeFromId(int idx) const { return _graph->nodeFromId(idx); } |
... | ... |
@@ -2903,110 +2908,113 @@ |
2903 | 2908 |
int nodeNum() const { |
2904 | 2909 |
return 2 * countNodes(*_digraph); |
2905 | 2910 |
} |
2906 | 2911 |
|
2907 | 2912 |
typedef True ArcNumTag; |
2908 | 2913 |
int arcNum() const { |
2909 | 2914 |
return countArcs(*_digraph) + countNodes(*_digraph); |
2910 | 2915 |
} |
2911 | 2916 |
|
2912 | 2917 |
typedef True FindArcTag; |
2913 | 2918 |
Arc findArc(const Node& u, const Node& v, |
2914 | 2919 |
const Arc& prev = INVALID) const { |
2915 |
if (inNode(u)) { |
|
2916 |
if (outNode(v)) { |
|
2917 |
if (static_cast<const DigraphNode&>(u) == |
|
2918 |
static_cast<const DigraphNode&>(v) && prev == INVALID) { |
|
2919 |
return Arc(u); |
|
2920 |
} |
|
2920 |
if (inNode(u) && outNode(v)) { |
|
2921 |
if (static_cast<const DigraphNode&>(u) == |
|
2922 |
static_cast<const DigraphNode&>(v) && prev == INVALID) { |
|
2923 |
return Arc(u); |
|
2921 | 2924 |
} |
2922 |
} else { |
|
2923 |
if (inNode(v)) { |
|
2924 |
return Arc(::lemon::findArc(*_digraph, u, v, prev)); |
|
2925 |
} |
|
2925 |
} |
|
2926 |
else if (outNode(u) && inNode(v)) { |
|
2927 |
return Arc(::lemon::findArc(*_digraph, u, v, prev)); |
|
2926 | 2928 |
} |
2927 | 2929 |
return INVALID; |
2928 | 2930 |
} |
2929 | 2931 |
|
2930 | 2932 |
private: |
2931 | 2933 |
|
2932 | 2934 |
template <typename _Value> |
2933 | 2935 |
class NodeMapBase |
2934 | 2936 |
: public MapTraits<typename Parent::template NodeMap<_Value> > { |
2935 | 2937 |
typedef typename Parent::template NodeMap<_Value> NodeImpl; |
2936 | 2938 |
public: |
2937 | 2939 |
typedef Node Key; |
2938 | 2940 |
typedef _Value Value; |
2941 |
typedef typename MapTraits<NodeImpl>::ReferenceMapTag ReferenceMapTag; |
|
2942 |
typedef typename MapTraits<NodeImpl>::ReturnValue ReturnValue; |
|
2943 |
typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReturnValue; |
|
2944 |
typedef typename MapTraits<NodeImpl>::ReturnValue Reference; |
|
2945 |
typedef typename MapTraits<NodeImpl>::ConstReturnValue ConstReference; |
|
2939 | 2946 |
|
2940 | 2947 |
NodeMapBase(const Adaptor& adaptor) |
2941 | 2948 |
: _in_map(*adaptor._digraph), _out_map(*adaptor._digraph) {} |
2942 | 2949 |
NodeMapBase(const Adaptor& adaptor, const Value& value) |
2943 | 2950 |
: _in_map(*adaptor._digraph, value), |
2944 | 2951 |
_out_map(*adaptor._digraph, value) {} |
2945 | 2952 |
|
2946 | 2953 |
void set(const Node& key, const Value& val) { |
2947 | 2954 |
if (Adaptor::inNode(key)) { _in_map.set(key, val); } |
2948 | 2955 |
else {_out_map.set(key, val); } |
2949 | 2956 |
} |
2950 | 2957 |
|
2951 |
typename MapTraits<NodeImpl>::ReturnValue |
|
2952 |
operator[](const Node& key) { |
|
2958 |
ReturnValue operator[](const Node& key) { |
|
2953 | 2959 |
if (Adaptor::inNode(key)) { return _in_map[key]; } |
2954 | 2960 |
else { return _out_map[key]; } |
2955 | 2961 |
} |
2956 | 2962 |
|
2957 |
typename MapTraits<NodeImpl>::ConstReturnValue |
|
2958 |
operator[](const Node& key) const { |
|
2963 |
ConstReturnValue operator[](const Node& key) const { |
|
2959 | 2964 |
if (Adaptor::inNode(key)) { return _in_map[key]; } |
2960 | 2965 |
else { return _out_map[key]; } |
2961 | 2966 |
} |
2962 | 2967 |
|
2963 | 2968 |
private: |
2964 | 2969 |
NodeImpl _in_map, _out_map; |
2965 | 2970 |
}; |
2966 | 2971 |
|
2967 | 2972 |
template <typename _Value> |
2968 | 2973 |
class ArcMapBase |
2969 | 2974 |
: public MapTraits<typename Parent::template ArcMap<_Value> > { |
2970 | 2975 |
typedef typename Parent::template ArcMap<_Value> ArcImpl; |
2971 | 2976 |
typedef typename Parent::template NodeMap<_Value> NodeImpl; |
2972 | 2977 |
public: |
2973 | 2978 |
typedef Arc Key; |
2974 | 2979 |
typedef _Value Value; |
2980 |
typedef typename MapTraits<ArcImpl>::ReferenceMapTag ReferenceMapTag; |
|
2981 |
typedef typename MapTraits<ArcImpl>::ReturnValue ReturnValue; |
|
2982 |
typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReturnValue; |
|
2983 |
typedef typename MapTraits<ArcImpl>::ReturnValue Reference; |
|
2984 |
typedef typename MapTraits<ArcImpl>::ConstReturnValue ConstReference; |
|
2975 | 2985 |
|
2976 | 2986 |
ArcMapBase(const Adaptor& adaptor) |
2977 | 2987 |
: _arc_map(*adaptor._digraph), _node_map(*adaptor._digraph) {} |
2978 | 2988 |
ArcMapBase(const Adaptor& adaptor, const Value& value) |
2979 | 2989 |
: _arc_map(*adaptor._digraph, value), |
2980 | 2990 |
_node_map(*adaptor._digraph, value) {} |
2981 | 2991 |
|
2982 | 2992 |
void set(const Arc& key, const Value& val) { |
2983 | 2993 |
if (Adaptor::origArc(key)) { |
2984 | 2994 |
_arc_map.set(key._item.first(), val); |
2985 | 2995 |
} else { |
2986 | 2996 |
_node_map.set(key._item.second(), val); |
2987 | 2997 |
} |
2988 | 2998 |
} |
2989 | 2999 |
|
2990 |
typename MapTraits<ArcImpl>::ReturnValue |
|
2991 |
operator[](const Arc& key) { |
|
3000 |
ReturnValue operator[](const Arc& key) { |
|
2992 | 3001 |
if (Adaptor::origArc(key)) { |
2993 | 3002 |
return _arc_map[key._item.first()]; |
2994 | 3003 |
} else { |
2995 | 3004 |
return _node_map[key._item.second()]; |
2996 | 3005 |
} |
2997 | 3006 |
} |
2998 | 3007 |
|
2999 |
typename MapTraits<ArcImpl>::ConstReturnValue |
|
3000 |
operator[](const Arc& key) const { |
|
3008 |
ConstReturnValue operator[](const Arc& key) const { |
|
3001 | 3009 |
if (Adaptor::origArc(key)) { |
3002 | 3010 |
return _arc_map[key._item.first()]; |
3003 | 3011 |
} else { |
3004 | 3012 |
return _node_map[key._item.second()]; |
3005 | 3013 |
} |
3006 | 3014 |
} |
3007 | 3015 |
|
3008 | 3016 |
private: |
3009 | 3017 |
ArcImpl _arc_map; |
3010 | 3018 |
NodeImpl _node_map; |
3011 | 3019 |
}; |
3012 | 3020 |
|
... | ... |
@@ -3175,24 +3183,30 @@ |
3175 | 3183 |
|
3176 | 3184 |
/// \brief NodeMap combined from two original NodeMap |
3177 | 3185 |
/// |
3178 | 3186 |
/// This class adapt two of the original digraph NodeMap to |
3179 | 3187 |
/// get a node map on the adapted digraph. |
3180 | 3188 |
template <typename InNodeMap, typename OutNodeMap> |
3181 | 3189 |
class CombinedNodeMap { |
3182 | 3190 |
public: |
3183 | 3191 |
|
3184 | 3192 |
typedef Node Key; |
3185 | 3193 |
typedef typename InNodeMap::Value Value; |
3186 | 3194 |
|
3195 |
typedef typename MapTraits<InNodeMap>::ReferenceMapTag ReferenceMapTag; |
|
3196 |
typedef typename MapTraits<InNodeMap>::ReturnValue ReturnValue; |
|
3197 |
typedef typename MapTraits<InNodeMap>::ConstReturnValue ConstReturnValue; |
|
3198 |
typedef typename MapTraits<InNodeMap>::ReturnValue Reference; |
|
3199 |
typedef typename MapTraits<InNodeMap>::ConstReturnValue ConstReference; |
|
3200 |
|
|
3187 | 3201 |
/// \brief Constructor |
3188 | 3202 |
/// |
3189 | 3203 |
/// Constructor. |
3190 | 3204 |
CombinedNodeMap(InNodeMap& in_map, OutNodeMap& out_map) |
3191 | 3205 |
: _in_map(in_map), _out_map(out_map) {} |
3192 | 3206 |
|
3193 | 3207 |
/// \brief The subscript operator. |
3194 | 3208 |
/// |
3195 | 3209 |
/// The subscript operator. |
3196 | 3210 |
Value& operator[](const Key& key) { |
3197 | 3211 |
if (Parent::inNode(key)) { |
3198 | 3212 |
return _in_map[key]; |
... | ... |
@@ -3261,24 +3275,35 @@ |
3261 | 3275 |
|
3262 | 3276 |
/// \brief ArcMap combined from an original ArcMap and a NodeMap |
3263 | 3277 |
/// |
3264 | 3278 |
/// This class adapt an original ArcMap and a NodeMap to get an |
3265 | 3279 |
/// arc map on the adapted digraph |
3266 | 3280 |
template <typename DigraphArcMap, typename DigraphNodeMap> |
3267 | 3281 |
class CombinedArcMap { |
3268 | 3282 |
public: |
3269 | 3283 |
|
3270 | 3284 |
typedef Arc Key; |
3271 | 3285 |
typedef typename DigraphArcMap::Value Value; |
3272 | 3286 |
|
3287 |
typedef typename MapTraits<DigraphArcMap>::ReferenceMapTag |
|
3288 |
ReferenceMapTag; |
|
3289 |
typedef typename MapTraits<DigraphArcMap>::ReturnValue |
|
3290 |
ReturnValue; |
|
3291 |
typedef typename MapTraits<DigraphArcMap>::ConstReturnValue |
|
3292 |
ConstReturnValue; |
|
3293 |
typedef typename MapTraits<DigraphArcMap>::ReturnValue |
|
3294 |
Reference; |
|
3295 |
typedef typename MapTraits<DigraphArcMap>::ConstReturnValue |
|
3296 |
ConstReference; |
|
3297 |
|
|
3273 | 3298 |
/// \brief Constructor |
3274 | 3299 |
/// |
3275 | 3300 |
/// Constructor. |
3276 | 3301 |
CombinedArcMap(DigraphArcMap& arc_map, DigraphNodeMap& node_map) |
3277 | 3302 |
: _arc_map(arc_map), _node_map(node_map) {} |
3278 | 3303 |
|
3279 | 3304 |
/// \brief The subscript operator. |
3280 | 3305 |
/// |
3281 | 3306 |
/// The subscript operator. |
3282 | 3307 |
void set(const Arc& arc, const Value& val) { |
3283 | 3308 |
if (Parent::origArc(arc)) { |
3284 | 3309 |
_arc_map.set(arc, val); |
0 comments (0 inline)