Changeset 2502:9c23c3762bc5 in lemon-0.x for lemon/graph_writer.h
- Timestamp:
- 10/24/07 18:31:49 (16 years ago)
- Branch:
- default
- Phase:
- public
- Convert:
- svn:c9d7d8f5-90d6-0310-b91f-818b3a526b0e/lemon/trunk@3342
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
lemon/graph_writer.h
r2467 r2502 157 157 /// \brief Issue a new node map writing command for the writer. 158 158 /// 159 /// This function issues a new <i> node map writing command</i> to the writer.159 /// This function issues a new <i> node map writing command</i> to the writer. 160 160 template <typename Map> 161 161 GraphWriter& writeNodeMap(std::string label, const Map& map) { … … 167 167 /// \brief Issue a new node map writing command for the writer. 168 168 /// 169 /// This function issues a new <i> node map writing command</i> to the writer.169 /// This function issues a new <i> node map writing command</i> to the writer. 170 170 template <typename ItemWriter, typename Map> 171 171 GraphWriter& writeNodeMap(std::string label, const Map& map, … … 640 640 }; 641 641 642 /// \brief The bipartite graph writer class. 643 /// 644 /// The \c BpUGraphWriter class provides the ugraph output. To write 645 /// a graph you should first give writing commands to the writer. You can 646 /// declare write command as \c NodeMap, \c EdgeMap or \c UEdgeMap 647 /// writing and labeled Node, Edge or UEdge writing. 648 /// 649 ///\code 650 /// BpUGraphWriter<ListUGraph> writer(std::cout, graph); 651 ///\endcode 652 /// 653 /// The \c writeNodeMap() function declares a \c NodeMap writing 654 /// command in the \c BpUGraphWriter. You should give as parameter 655 /// the name of the map and the map object. The NodeMap writing 656 /// command with name "label" should write a unique map because it 657 /// is regarded as label map. 658 /// 659 ///\code 660 /// IdMap<ListUGraph, Node> nodeLabelMap; 661 /// writer.writeNodeMap("label", nodeLabelMap); 662 /// 663 /// writer.writeNodeMap("coords", coords); 664 /// writer.writeNodeMap("color", colorMap); 665 ///\endcode 666 /// 667 /// With the \c writeUEdgeMap() member function you can give an 668 /// undirected edge map writing command similar to the NodeMaps. 669 /// 670 ///\code 671 /// DescriptorMap<ListGraph, Edge, ListGraph::EdgeMap<int> > 672 /// edgeDescMap(graph); 673 /// writer.writeUEdgeMap("descriptor", edgeDescMap); 674 /// 675 /// writer.writeUEdgeMap("weight", weightMap); 676 /// writer.writeUEdgeMap("label", labelMap); 677 ///\endcode 678 /// 679 /// The EdgeMap handling is just a syntactical sugar. It writes 680 /// two undirected edge map with '+' and '-' prefix in the name. 681 /// 682 ///\code 683 /// writer.writeEdgeMap("capacity", capacityMap); 684 ///\endcode 685 /// 686 /// 687 /// With \c writeNode() and \c writeUEdge() functions you can 688 /// designate nodes and undirected edges in the graph. For example, you can 689 /// write out the source and target of the graph. 690 /// 691 ///\code 692 /// writer.writeNode("source", sourceNode); 693 /// writer.writeNode("target", targetNode); 694 /// 695 /// writer.writeUEdge("observed", uEdge); 696 ///\endcode 697 /// 698 /// After you give all write commands you must call the \c run() member 699 /// function, which executes all the writing commands. 700 /// 701 ///\code 702 /// writer.run(); 703 ///\endcode 704 /// 705 /// \see DefaultWriterTraits 706 /// \see QuotedStringWriter 707 /// \see IdMap 708 /// \see DescriptorMap 709 /// \see \ref GraphWriter 710 /// \see \ref graph-io-page 711 /// \author Balazs Dezso 712 template <typename _Graph, typename _WriterTraits = DefaultWriterTraits> 713 class BpUGraphWriter { 714 public: 715 716 typedef _Graph Graph; 717 typedef typename Graph::Node Node; 718 typedef typename Graph::Edge Edge; 719 typedef typename Graph::UEdge UEdge; 720 721 typedef _WriterTraits WriterTraits; 722 723 /// \brief Construct a new BpUGraphWriter. 724 /// 725 /// Construct a new BpUGraphWriter. It writes the given graph 726 /// to the given stream. 727 BpUGraphWriter(std::ostream& _os, const Graph& _graph) 728 : writer(new LemonWriter(_os)), own_writer(true), 729 nodeset_writer(*writer, _graph, std::string()), 730 uedgeset_writer(*writer, _graph, nodeset_writer, std::string()), 731 node_writer(*writer, nodeset_writer, std::string()), 732 uedge_writer(*writer, uedgeset_writer, std::string()), 733 attribute_writer(*writer, std::string()) {} 734 735 /// \brief Construct a new BpUGraphWriter. 736 /// 737 /// Construct a new BpUGraphWriter. It writes the given graph 738 /// to the given file. 739 BpUGraphWriter(const std::string& _filename, const Graph& _graph) 740 : writer(new LemonWriter(_filename)), own_writer(true), 741 nodeset_writer(*writer, _graph, std::string()), 742 uedgeset_writer(*writer, _graph, nodeset_writer, std::string()), 743 node_writer(*writer, nodeset_writer, std::string()), 744 uedge_writer(*writer, uedgeset_writer, std::string()), 745 attribute_writer(*writer, std::string()) {} 746 747 /// \brief Construct a new BpUGraphWriter. 748 /// 749 /// Construct a new BpUGraphWriter. It writes the given graph 750 /// to given LemonWriter. 751 BpUGraphWriter(LemonWriter& _writer, const Graph& _graph) 752 : writer(_writer), own_writer(false), 753 nodeset_writer(*writer, _graph, std::string()), 754 uedgeset_writer(*writer, _graph, nodeset_writer, std::string()), 755 node_writer(*writer, nodeset_writer, std::string()), 756 uedge_writer(*writer, uedgeset_writer, std::string()), 757 attribute_writer(*writer, std::string()) {} 758 759 /// \brief Destruct the graph writer. 760 /// 761 /// Destruct the graph writer. 762 ~BpUGraphWriter() { 763 if (own_writer) 764 delete writer; 765 } 766 767 /// \brief Issue a new node map writing command to the writer. 768 /// 769 /// This function issues a new <i> node map writing command</i> to 770 /// the writer. 771 template <typename Map> 772 BpUGraphWriter& writeNodeMap(std::string label, const Map& map) { 773 nodeset_writer.writeNodeMap(label, map); 774 return *this; 775 } 776 777 /// \brief Issue a new node map writing command to the writer. 778 /// 779 /// This function issues a new <i> node map writing command</i> to 780 /// the writer. 781 template <typename ItemWriter, typename Map> 782 BpUGraphWriter& writeNodeMap(std::string label, const Map& map, 783 const ItemWriter& iw = ItemWriter()) { 784 nodeset_writer.writeNodeMap(label, map, iw); 785 return *this; 786 } 787 788 /// \brief Issue a new A-node map writing command to the writer. 789 /// 790 /// This function issues a new <i> A-node map writing command</i> to 791 /// the writer. 792 template <typename Map> 793 BpUGraphWriter& writeANodeMap(std::string label, const Map& map) { 794 nodeset_writer.writeANodeMap(label, map); 795 return *this; 796 } 797 798 /// \brief Issue a new A-node map writing command to the writer. 799 /// 800 /// This function issues a new <i> A-node map writing command</i> to 801 /// the writer. 802 template <typename ItemWriter, typename Map> 803 BpUGraphWriter& writeANodeMap(std::string label, const Map& map, 804 const ItemWriter& iw = ItemWriter()) { 805 nodeset_writer.writeANodeMap(label, map, iw); 806 return *this; 807 } 808 /// \brief Issue a new B-node map writing command to the writer. 809 /// 810 /// This function issues a new <i> B-node map writing command</i> to 811 /// the writer. 812 template <typename Map> 813 BpUGraphWriter& writeBNodeMap(std::string label, const Map& map) { 814 nodeset_writer.writeBNodeMap(label, map); 815 return *this; 816 } 817 818 /// \brief Issue a new B-node map writing command to the writer. 819 /// 820 /// This function issues a new <i> B-node map writing command</i> to 821 /// the writer. 822 template <typename ItemWriter, typename Map> 823 BpUGraphWriter& writeBNodeMap(std::string label, const Map& map, 824 const ItemWriter& iw = ItemWriter()) { 825 nodeset_writer.writeBNodeMap(label, map, iw); 826 return *this; 827 } 828 829 /// \brief Issue a new edge map writing command to the writer. 830 /// 831 /// This function issues a new <i> edge map writing command</i> to 832 /// the writer. 833 template <typename Map> 834 BpUGraphWriter& writeEdgeMap(std::string label, const Map& map) { 835 uedgeset_writer.writeEdgeMap(label, map); 836 return *this; 837 } 838 839 /// \brief Issue a new edge map writing command to the writer. 840 /// 841 /// This function issues a new <i> edge map writing command</i> to 842 /// the writer. 843 template <typename ItemWriter, typename Map> 844 BpUGraphWriter& writeEdgeMap(std::string label, const Map& map, 845 const ItemWriter& iw = ItemWriter()) { 846 uedgeset_writer.writeEdgeMap(label, map, iw); 847 return *this; 848 } 849 850 /// \brief Issue a new undirected edge map writing command to the writer. 851 /// 852 /// This function issues a new <i> undirected edge map writing 853 /// command</i> to the writer. 854 template <typename Map> 855 BpUGraphWriter& writeUEdgeMap(std::string label, const Map& map) { 856 uedgeset_writer.writeUEdgeMap(label, map); 857 return *this; 858 } 859 860 /// \brief Issue a new undirected edge map writing command to the writer. 861 /// 862 /// This function issues a new <i> undirected edge map writing 863 /// command</i> to the writer. 864 template <typename ItemWriter, typename Map> 865 BpUGraphWriter& writeUEdgeMap(std::string label, const Map& map, 866 const ItemWriter& iw = ItemWriter()) { 867 uedgeset_writer.writeUEdgeMap(label, map, iw); 868 return *this; 869 } 870 871 /// \brief Issue a new labeled node writer to the writer. 872 /// 873 /// This function issues a new <i> labeled node writing 874 /// command</i> to the writer. 875 BpUGraphWriter& writeNode(std::string label, const Node& node) { 876 node_writer.writeNode(label, node); 877 return *this; 878 } 879 880 /// \brief Issue a new labeled edge writer to the writer. 881 /// 882 /// This function issues a new <i> labeled edge writing 883 /// command</i> to the writer. 884 BpUGraphWriter& writeEdge(std::string label, const Edge& edge) { 885 uedge_writer.writeEdge(label, edge); 886 } 887 888 /// \brief Issue a new labeled undirected edge writing command to 889 /// the writer. 890 /// 891 /// Issue a new <i>labeled undirected edge writing command</i> to 892 /// the writer. 893 BpUGraphWriter& writeUEdge(std::string label, const UEdge& edge) { 894 uedge_writer.writeUEdge(label, edge); 895 } 896 897 /// \brief Issue a new attribute writing command. 898 /// 899 /// This function issues a new <i> attribute writing 900 /// command</i> to the writer. 901 template <typename Value> 902 BpUGraphWriter& writeAttribute(std::string label, const Value& value) { 903 attribute_writer.writeAttribute(label, value); 904 return *this; 905 } 906 907 /// \brief Issue a new attribute writing command. 908 /// 909 /// This function issues a new <i> attribute writing 910 /// command</i> to the writer. 911 template <typename ItemWriter, typename Value> 912 BpUGraphWriter& writeAttribute(std::string label, const Value& value, 913 const ItemWriter& iw = ItemWriter()) { 914 attribute_writer.writeAttribute(label, value, iw); 915 return *this; 916 } 917 918 /// \brief Conversion operator to LemonWriter. 919 /// 920 /// Conversion operator to LemonWriter. It makes possible 921 /// to access the encapsulated \e LemonWriter, this way 922 /// you can attach to this writer new instances of 923 /// \e LemonWriter::SectionWriter. 924 operator LemonWriter&() { 925 return *writer; 926 } 927 928 /// \brief Executes the writing commands. 929 /// 930 /// Executes the writing commands. 931 void run() { 932 writer->run(); 933 } 934 935 /// \brief Returns true if the writer can give back the labels by the items. 936 /// 937 /// Returns true if the writer can give back the the labels by the items. 938 bool isLabelWriter() const { 939 return nodeset_writer.isLabelWriter() && 940 uedgeset_writer.isLabelWriter(); 941 } 942 943 /// \brief Write the label of the given node. 944 /// 945 /// It writes the label of the given node. If there was written a "label" 946 /// named node map then it will write the map value belonging to the node. 947 void writeLabel(std::ostream& os, const Node& item) const { 948 nodeset_writer.writeLabel(os, item); 949 } 950 951 /// \brief Write the label of the given edge. 952 /// 953 /// It writes the label of the given edge. If there was written a "label" 954 /// named edge map then it will write the map value belonging to the edge. 955 void writeLabel(std::ostream& os, const Edge& item) const { 956 uedgeset_writer.writeLabel(os, item); 957 } 958 959 /// \brief Write the label of the given undirected edge. 960 /// 961 /// It writes the label of the given undirected edge. If there was 962 /// written a "label" named edge map then it will write the map 963 /// value belonging to the edge. 964 void writeLabel(std::ostream& os, const UEdge& item) const { 965 uedgeset_writer.writeLabel(os, item); 966 } 967 968 /// \brief Sorts the given node vector by label. 969 /// 970 /// Sorts the given node vector by label. If there was written an 971 /// "label" named map then the vector will be sorted by the values 972 /// of this map. Otherwise if the \c forceLabel parameter was true 973 /// it will be sorted by its id in the graph. 974 void sortByLabel(std::vector<Node>& nodes) const { 975 nodeset_writer.sortByLabel(nodes); 976 } 977 978 /// \brief Sorts the given edge vector by label. 979 /// 980 /// Sorts the given edge vector by label. If there was written an 981 /// "label" named map then the vector will be sorted by the values 982 /// of this map. Otherwise if the \c forceLabel parameter was true 983 /// it will be sorted by its id in the graph. 984 void sortByLabel(std::vector<Edge>& edges) const { 985 uedgeset_writer.sortByLabel(edges); 986 } 987 988 /// \brief Sorts the given undirected edge vector by label. 989 /// 990 /// Sorts the given undirected edge vector by label. If there was 991 /// written an "label" named map then the vector will be sorted by 992 /// the values of this map. Otherwise if the \c forceLabel 993 /// parameter was true it will be sorted by its id in the graph. 994 void sortByLabel(std::vector<UEdge>& uedges) const { 995 uedgeset_writer.sortByLabel(uedges); 996 } 997 998 private: 999 1000 LemonWriter* writer; 1001 bool own_writer; 1002 1003 BpNodeSetWriter<Graph, WriterTraits> nodeset_writer; 1004 UEdgeSetWriter<Graph, WriterTraits> uedgeset_writer; 1005 1006 NodeWriter<Graph> node_writer; 1007 UEdgeWriter<Graph> uedge_writer; 1008 1009 AttributeWriter<WriterTraits> attribute_writer; 1010 }; 1011 642 1012 /// @} 643 1013
Note: See TracChangeset
for help on using the changeset viewer.