00001 #ifndef _PG_PROPERTY_MAP_HPP_
00002 #define _PG_PROPERTY_MAP_HPP_
00003
00004 #include <boost/pending/property.hpp>
00005
00006 namespace ParGraph
00007 {
00008 using boost::get_property_value;
00009
00011 template< class Tag, class Graph >
00012 struct EdgeMap
00013 {
00014 typedef Tag tag;
00015 typedef typename boost::property_value< typename Graph::VertexProperty, Tag >::type value_type;
00016 typedef typename value_type::edge_kind edge_kind;
00017 typedef typename value_type::property_type edge_property_type;
00018 typedef typename value_type::edge_type edge_type;
00019 typedef typename value_type::out_iterator out_iterator;
00020 typedef typename value_type::in_iterator in_iterator;
00021 typedef typename value_type::Edge Edge;
00022 typedef typename value_type::mapiterator mapiterator;
00023 typedef typename value_type::const_mapiterator const_mapiterator;
00024 };
00025
00026
00027 template< class Tag, class Graph >
00028 EdgeMap< Tag, Graph >
00029 get_edge_map( Tag, Graph )
00030 {
00031 return EdgeMap< Tag, Graph >();
00032 }
00033
00037 template< class T, class V, class G >
00038 typename EdgeMap< T, G >::value_type::map_type &
00039 get_out_edges( EdgeMap< T, G >, V v, G & g )
00040 {
00041 return get_property_value( g.get_property_reference( v ), typename EdgeMap<T,G>::tag() ).out_edges;
00042 };
00043
00047 template< class T, class G, class VProp >
00048 typename EdgeMap< T, G >::value_type::map_type &
00049 get_out_edges( EdgeMap< T, G >, VProp & vp )
00050 {
00051 return get_property_value( vp, typename EdgeMap< T, G >::tag() ).out_edges;
00052 }
00053
00054 template< class T, class G, class P >
00055 inline typename EdgeMap< T, G >::value_type::map_type &
00056 get_out_edges( EdgeMap< T, G >, DirectedInOutEdges<P> & el )
00057 {
00058 return el.out_edges;
00059 }
00060
00061 template< class T, class G, class P >
00062 inline typename EdgeMap< T, G >::value_type::map_type &
00063 get_out_edges( EdgeMap< T, G >, DirectedOutEdges<P> & el )
00064 {
00065 return el.out_edges;
00066 }
00067
00071 template< class T, class V, class G >
00072 inline typename EdgeMap< T, G >::value_type::map_type &
00073 get_in_edges( EdgeMap< T, G >, V v, G & g )
00074 {
00075 return get_property_value( g.get_property_reference( v ), typename EdgeMap<T,G>::tag() ).in_edges;
00076 };
00077
00081 template< class T, class G, class VProp >
00082 typename EdgeMap< T, G >::value_type::map_type &
00083 get_in_edges( EdgeMap< T, G >, VProp & vp )
00084 {
00085 return get_property_value( vp, typename EdgeMap< T, G >::tag() ).in_edges;
00086 }
00087
00088 template< class T, class G, class P >
00089 inline typename EdgeMap< T, G >::value_type::map_type &
00090 get_in_edges( EdgeMap< T, G >, DirectedInOutEdges<P> & el )
00091 {
00092 return el.in_edges;
00093 }
00094
00095 template< class Tag, class Graph >
00096 struct ReverseEdgeMap
00097 {
00098 typedef Tag tag;
00099 typedef typename boost::property_value< typename Graph::VertexProperty, Tag >::type value_type;
00100 typedef typename value_type::edge_kind edge_kind;
00101 typedef typename value_type::property_type edge_property_type;
00102 typedef typename value_type::edge_type edge_type;
00103 typedef typename value_type::in_iterator in_iterator;
00104 typedef typename value_type::out_iterator out_iterator;
00105 typedef typename value_type::Edge Edge;
00106 typedef typename value_type::mapiterator mapiterator;
00107 typedef typename value_type::const_mapiterator const_mapiterator;
00108 };
00109
00110 template< class T, class V, class G >
00111 inline typename ReverseEdgeMap< T, G >::value_type::map_type &
00112 get_out_edges( ReverseEdgeMap< T, G >, V v, G & g )
00113 {
00114 return get_property_value( g.get_property_reference( v ), typename ReverseEdgeMap<T,G>::tag() ).in_edges;
00115 };
00116
00117 template< class T, class G, class VProp >
00118 inline typename ReverseEdgeMap< T, G >::value_type::map_type &
00119 get_out_edges( ReverseEdgeMap< T, G >, VProp & vp )
00120 {
00121 return get_property_value( vp, typename ReverseEdgeMap< T, G >::tag() ).in_edges;
00122 }
00123
00124 template< class T, class G, class P >
00125 inline typename ReverseEdgeMap< T, G >::value_type::map_type &
00126 get_out_edges( ReverseEdgeMap< T, G >, DirectedInOutEdges<P> & el )
00127 {
00128 return el.in_edges;
00129 }
00130
00131 template< class T, class V, class G >
00132 inline typename ReverseEdgeMap< T, G >::value_type::map_type &
00133 get_in_edges( ReverseEdgeMap< T, G >, V v, G & g )
00134 {
00135 return get_property_value( g.get_property_reference( v ), typename ReverseEdgeMap<T,G>::tag() ).out_edges;
00136 };
00137
00138 template< class T, class G, class VProp >
00139 inline typename ReverseEdgeMap< T, G >::value_type::map_type &
00140 get_in_edges( ReverseEdgeMap< T, G >, VProp & vp )
00141 {
00142 return get_property_value( vp, typename ReverseEdgeMap< T, G >::tag() ).out_edges;
00143 }
00144
00145 template< class T, class G, class P >
00146 inline typename ReverseEdgeMap< T, G >::value_type::map_type &
00147 get_in_edges( ReverseEdgeMap< T, G >, DirectedInOutEdges<P> & el )
00148 {
00149 return el.out_edges;
00150 }
00151
00152 template< class Filter, class Iterator >
00153 class FilteredEdgeIterator
00154 {
00155 typedef FilteredEdgeIterator< Filter, Iterator > self_type;
00156 Iterator iter, it_end;
00157 Filter f;
00158 void find_next()
00159 {
00160 while( iter != it_end )
00161 {
00162 if( f( *iter ) ) return;
00163 iter++;
00164 }
00165 }
00166 public:
00167 FilteredEdgeIterator() {}
00168 FilteredEdgeIterator( Filter filter, Iterator & it, Iterator & end )
00169 {
00170 f = filter;
00171 it_end = end;
00172 iter = it;
00173 find_next();
00174 }
00175 void operator++(int)
00176 {
00177 iter++;
00178 find_next();
00179 }
00180 bool operator==( const self_type & other )
00181 {
00182 return iter == other.iter;
00183 }
00184 bool operator!=( const self_type & other )
00185 {
00186 return iter != other.iter;
00187 }
00188 typename Iterator::value_type operator* ()
00189 {
00190 return *iter;
00191 }
00192 };
00193
00194 template< class Filter, class BaseEdgeMap >
00195 struct FilteredEdgeMap
00196 {
00197 Filter f;
00198 typedef typename BaseEdgeMap::tag tag;
00199 typedef typename BaseEdgeMap::value_type value_type;
00200 typedef typename BaseEdgeMap::edge_kind edge_kind;
00201 typedef typename BaseEdgeMap::edge_property_type edge_property_type;
00202 typedef typename BaseEdgeMap::edge_type edge_type;
00203 typedef typename BaseEdgeMap::Edge Edge;
00204 typedef FilteredEdgeIterator< Filter, typename BaseEdgeMap::out_iterator > out_iterator;
00205 typedef FilteredEdgeIterator< Filter, typename BaseEdgeMap::in_iterator > in_iterator;
00206 FilteredEdgeMap( Filter _f ) : f(_f) {}
00207 };
00208
00209 template< class Graph, class V, class F, class B >
00210 inline std::pair< typename FilteredEdgeMap<F,B>::out_iterator,
00211 typename FilteredEdgeMap<F,B>::out_iterator >
00212 out_edges( Graph &g, V v, FilteredEdgeMap<F,B> m )
00213 {
00214 typedef typename FilteredEdgeMap<F,B>::out_iterator Iter;
00215 pair< typename B::out_iterator, typename B::out_iterator > tmp =
00216 out_edges( g, v, B() );
00217 Iter it1 = Iter( m.f, tmp.first, tmp.second );
00218 Iter it2 = Iter( m.f, tmp.second, tmp.second );
00219 return std::make_pair( it1, it2 );
00220 }
00221
00223 template< class T, class EdgeMap >
00224 struct EdgePropertyMap
00225 {
00226 typedef T tag;
00227 typedef EdgeMap edge_map;
00228 typedef typename boost::property_value< typename edge_map::value_type::property_type, tag >::type value_type;
00229 };
00230
00231 template< class Tag, class EdgeMap >
00232 EdgePropertyMap< Tag, EdgeMap >
00233 get_edge_property_map( Tag, EdgeMap )
00234 {
00235 return EdgePropertyMap< Tag, EdgeMap >();
00236 };
00237
00238
00239 template< class T, class M, class Iter >
00240 typename EdgePropertyMap< T, M >::value_type &
00241 get( EdgePropertyMap< T, M >, Iter iter )
00242 {
00243 return get_property_value( get_edge_property(iter), typename EdgePropertyMap< T, M >::tag() );
00244 };
00245
00246 template< class T, class M, class Iter >
00247 void
00248 put( EdgePropertyMap< T, M >, Iter iter, typename EdgePropertyMap< T, M >::value_type value)
00249 {
00250 get_property_value( get_edge_property(iter), typename EdgePropertyMap< T, M >::tag() ) = value;
00251 };
00252
00253
00255 template< class T, class G >
00256 struct VertexPropertyMap
00257 {
00258 typedef T tag;
00259 typedef typename boost::property_value< typename G::VertexProperty, T >::type value_type;
00260 };
00261
00263 template< class Tag, class Graph >
00264 VertexPropertyMap< Tag, Graph >
00265 get_vertex_property_map( Tag, Graph )
00266 {
00267 return VertexPropertyMap< Tag, Graph >();
00268 }
00269
00271 template< class Map, class Vertex, class Graph >
00272 inline void
00273 put( Map, Vertex v, Graph & g, typename Map::value_type value )
00274 {
00275 get( Map(), g.get_property_reference( v ) ) = value;
00276 }
00277
00279 template< class Map, class Vertex, class Graph >
00280 inline typename Map::value_type &
00281 get( Map, Vertex v, Graph & g )
00282 {
00283 return get_property_value( g.get_property_reference( v ), typename Map::tag() );
00284 }
00285
00286 template< class T, class P >
00287 struct PropertyMap
00288 {
00289 typedef T tag;
00290 typedef typename boost::property_value< P, T >::type value_type;
00291 };
00292
00293 template< class Tag, class PropertyList >
00294 PropertyMap< Tag, PropertyList >
00295 get_property_map( Tag, PropertyList )
00296 {
00297 return PropertyMap< Tag, PropertyList >();
00298 }
00299
00300 template< class Map, class Property >
00301 inline typename Map::value_type &
00302 get( Map, Property & p )
00303 {
00304 return get_property_value( p, Map::tag );
00305 }
00306
00307 template< class Map, class Property >
00308 inline void
00309 put( Map, Property & p, typename Map::value_type value )
00310 {
00311 get( Map(), p ) = value;
00312 }
00313
00314 }
00315 #endif // _PG_PROPERTY_MAP_HPP_