670 Parent::setEdgeFilterMap(_edge_filter_map); |
670 Parent::setEdgeFilterMap(_edge_filter_map); |
671 } |
671 } |
672 }; |
672 }; |
673 |
673 |
674 template <typename _Graph> |
674 template <typename _Graph> |
675 class UndirGraphAdaptorBase : |
675 class UGraphAdaptorBase : |
676 public UndirGraphExtender<GraphAdaptorBase<_Graph> > { |
676 public UGraphExtender<GraphAdaptorBase<_Graph> > { |
677 public: |
677 public: |
678 typedef _Graph Graph; |
678 typedef _Graph Graph; |
679 typedef UndirGraphExtender<GraphAdaptorBase<_Graph> > Parent; |
679 typedef UGraphExtender<GraphAdaptorBase<_Graph> > Parent; |
680 protected: |
680 protected: |
681 UndirGraphAdaptorBase() : Parent() { } |
681 UGraphAdaptorBase() : Parent() { } |
682 public: |
682 public: |
683 typedef typename Parent::UndirEdge UndirEdge; |
683 typedef typename Parent::UEdge UEdge; |
684 typedef typename Parent::Edge Edge; |
684 typedef typename Parent::Edge Edge; |
685 |
685 |
686 template <typename T> |
686 template <typename T> |
687 class EdgeMap { |
687 class EdgeMap { |
688 protected: |
688 protected: |
689 const UndirGraphAdaptorBase<_Graph>* g; |
689 const UGraphAdaptorBase<_Graph>* g; |
690 template <typename TT> friend class EdgeMap; |
690 template <typename TT> friend class EdgeMap; |
691 typename _Graph::template EdgeMap<T> forward_map, backward_map; |
691 typename _Graph::template EdgeMap<T> forward_map, backward_map; |
692 public: |
692 public: |
693 typedef T Value; |
693 typedef T Value; |
694 typedef Edge Key; |
694 typedef Edge Key; |
695 |
695 |
696 EdgeMap(const UndirGraphAdaptorBase<_Graph>& _g) : g(&_g), |
696 EdgeMap(const UGraphAdaptorBase<_Graph>& _g) : g(&_g), |
697 forward_map(*(g->graph)), backward_map(*(g->graph)) { } |
697 forward_map(*(g->graph)), backward_map(*(g->graph)) { } |
698 |
698 |
699 EdgeMap(const UndirGraphAdaptorBase<_Graph>& _g, T a) : g(&_g), |
699 EdgeMap(const UGraphAdaptorBase<_Graph>& _g, T a) : g(&_g), |
700 forward_map(*(g->graph), a), backward_map(*(g->graph), a) { } |
700 forward_map(*(g->graph), a), backward_map(*(g->graph), a) { } |
701 |
701 |
702 void set(Edge e, T a) { |
702 void set(Edge e, T a) { |
703 if (g->direction(e)) |
703 if (g->direction(e)) |
704 forward_map.set(e, a); |
704 forward_map.set(e, a); |
713 return backward_map[e]; |
713 return backward_map[e]; |
714 } |
714 } |
715 }; |
715 }; |
716 |
716 |
717 template <typename T> |
717 template <typename T> |
718 class UndirEdgeMap { |
718 class UEdgeMap { |
719 template <typename TT> friend class UndirEdgeMap; |
719 template <typename TT> friend class UEdgeMap; |
720 typename _Graph::template EdgeMap<T> map; |
720 typename _Graph::template EdgeMap<T> map; |
721 public: |
721 public: |
722 typedef T Value; |
722 typedef T Value; |
723 typedef UndirEdge Key; |
723 typedef UEdge Key; |
724 |
724 |
725 UndirEdgeMap(const UndirGraphAdaptorBase<_Graph>& g) : |
725 UEdgeMap(const UGraphAdaptorBase<_Graph>& g) : |
726 map(*(g.graph)) { } |
726 map(*(g.graph)) { } |
727 |
727 |
728 UndirEdgeMap(const UndirGraphAdaptorBase<_Graph>& g, T a) : |
728 UEdgeMap(const UGraphAdaptorBase<_Graph>& g, T a) : |
729 map(*(g.graph), a) { } |
729 map(*(g.graph), a) { } |
730 |
730 |
731 void set(UndirEdge e, T a) { |
731 void set(UEdge e, T a) { |
732 map.set(e, a); |
732 map.set(e, a); |
733 } |
733 } |
734 |
734 |
735 T operator[](UndirEdge e) const { |
735 T operator[](UEdge e) const { |
736 return map[e]; |
736 return map[e]; |
737 } |
737 } |
738 }; |
738 }; |
739 |
739 |
740 }; |
740 }; |
744 /// Undocumented, untested!!! |
744 /// Undocumented, untested!!! |
745 /// If somebody knows nice demo application, let's polulate it. |
745 /// If somebody knows nice demo application, let's polulate it. |
746 /// |
746 /// |
747 /// \author Marton Makai |
747 /// \author Marton Makai |
748 template<typename _Graph> |
748 template<typename _Graph> |
749 class UndirGraphAdaptor : |
749 class UGraphAdaptor : |
750 public IterableUndirGraphExtender< |
750 public IterableUGraphExtender< |
751 UndirGraphAdaptorBase<_Graph> > { |
751 UGraphAdaptorBase<_Graph> > { |
752 public: |
752 public: |
753 typedef _Graph Graph; |
753 typedef _Graph Graph; |
754 typedef IterableUndirGraphExtender< |
754 typedef IterableUGraphExtender< |
755 UndirGraphAdaptorBase<_Graph> > Parent; |
755 UGraphAdaptorBase<_Graph> > Parent; |
756 protected: |
756 protected: |
757 UndirGraphAdaptor() { } |
757 UGraphAdaptor() { } |
758 public: |
758 public: |
759 UndirGraphAdaptor(_Graph& _graph) { |
759 UGraphAdaptor(_Graph& _graph) { |
760 setGraph(_graph); |
760 setGraph(_graph); |
761 } |
761 } |
762 }; |
762 }; |
763 |
763 |
764 |
764 |