| | 3767 | |
| | 3768 | /// \brief Copy the values of a graph map to another map. |
| | 3769 | /// |
| | 3770 | /// This function copies the values of a graph map to another graph map. |
| | 3771 | /// \c To::Key must be equal or convertible to \c From::Key and |
| | 3772 | /// \c From::Value must be equal or convertible to \c To::Value. |
| | 3773 | /// |
| | 3774 | /// For example, an edge map of \c int value type can be copied to |
| | 3775 | /// an arc map of \c double value type in an undirected graph, but |
| | 3776 | /// an arc map cannot be copied to an edge map. |
| | 3777 | /// Note that even a \ref ConstMap can be copied to a standard graph map, |
| | 3778 | /// but \ref mapFill() can also be used for this purpose. |
| | 3779 | /// |
| | 3780 | /// \param gr The graph for which the maps are defined. |
| | 3781 | /// \param from The map from which the values have to be copied. |
| | 3782 | /// It must conform to the \ref concepts::ReadMap "ReadMap" concept. |
| | 3783 | /// \param to The map to which the values have to be copied. |
| | 3784 | /// It must conform to the \ref concepts::WriteMap "WriteMap" concept. |
| | 3785 | template <typename GR, typename From, typename To> |
| | 3786 | void mapCopy(const GR& gr, const From& from, To& to) { |
| | 3787 | typedef typename To::Key Item; |
| | 3788 | typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
| | 3789 | |
| | 3790 | for (ItemIt it(gr); it != INVALID; ++it) { |
| | 3791 | to.set(it, from[it]); |
| | 3792 | } |
| | 3793 | } |
| | 3794 | |
| | 3795 | /// \brief Compare two graph maps. |
| | 3796 | /// |
| | 3797 | /// This function compares the values of two graph maps. It returns |
| | 3798 | /// \c true if the maps assign the same value for all items in the graph. |
| | 3799 | /// The \c Key type of the maps (\c Node, \c Arc or \c Edge) must be equal |
| | 3800 | /// and their \c Value types must be comparable using \c %operator==(). |
| | 3801 | /// |
| | 3802 | /// \param gr The graph for which the maps are defined. |
| | 3803 | /// \param map1 The first map. |
| | 3804 | /// \param map2 The second map. |
| | 3805 | template <typename GR, typename Map1, typename Map2> |
| | 3806 | bool mapCompare(const GR& gr, const Map1& map1, const Map2& map2) { |
| | 3807 | typedef typename Map2::Key Item; |
| | 3808 | typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
| | 3809 | |
| | 3810 | for (ItemIt it(gr); it != INVALID; ++it) { |
| | 3811 | if (!(map1[it] == map2[it])) return false; |
| | 3812 | } |
| | 3813 | return true; |
| | 3814 | } |
| | 3815 | |
| | 3816 | /// \brief Return an item having minimum value of a graph map. |
| | 3817 | /// |
| | 3818 | /// This function returns an item (\c Node, \c Arc or \c Edge) having |
| | 3819 | /// minimum value of the given graph map. |
| | 3820 | /// If the item set is empty, it returns \c INVALID. |
| | 3821 | /// |
| | 3822 | /// \param gr The graph for which the map is defined. |
| | 3823 | /// \param map The graph map. |
| | 3824 | template <typename GR, typename Map> |
| | 3825 | typename Map::Key mapMin(const GR& gr, const Map& map) { |
| | 3826 | return mapMin(gr, map, std::less<typename Map::Value>()); |
| | 3827 | } |
| | 3828 | |
| | 3829 | /// \brief Return an item having minimum value of a graph map. |
| | 3830 | /// |
| | 3831 | /// This function returns an item (\c Node, \c Arc or \c Edge) having |
| | 3832 | /// minimum value of the given graph map. |
| | 3833 | /// If the item set is empty, it returns \c INVALID. |
| | 3834 | /// |
| | 3835 | /// \param gr The graph for which the map is defined. |
| | 3836 | /// \param map The graph map. |
| | 3837 | /// \param comp Comparison function object. |
| | 3838 | template <typename GR, typename Map, typename Comp> |
| | 3839 | typename Map::Key mapMin(const GR& gr, const Map& map, const Comp& comp) { |
| | 3840 | typedef typename Map::Key Item; |
| | 3841 | typedef typename Map::Value Value; |
| | 3842 | typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
| | 3843 | |
| | 3844 | ItemIt min_item(gr); |
| | 3845 | if (min_item == INVALID) return INVALID; |
| | 3846 | Value min = map[min_item]; |
| | 3847 | for (ItemIt it(gr); it != INVALID; ++it) { |
| | 3848 | if (comp(map[it], min)) { |
| | 3849 | min = map[it]; |
| | 3850 | min_item = it; |
| | 3851 | } |
| | 3852 | } |
| | 3853 | return min_item; |
| | 3854 | } |
| | 3855 | |
| | 3856 | /// \brief Return an item having maximum value of a graph map. |
| | 3857 | /// |
| | 3858 | /// This function returns an item (\c Node, \c Arc or \c Edge) having |
| | 3859 | /// maximum value of the given graph map. |
| | 3860 | /// If the item set is empty, it returns \c INVALID. |
| | 3861 | /// |
| | 3862 | /// \param gr The graph for which the map is defined. |
| | 3863 | /// \param map The graph map. |
| | 3864 | template <typename GR, typename Map> |
| | 3865 | typename Map::Key mapMax(const GR& gr, const Map& map) { |
| | 3866 | return mapMax(gr, map, std::less<typename Map::Value>()); |
| | 3867 | } |
| | 3868 | |
| | 3869 | /// \brief Return an item having maximum value of a graph map. |
| | 3870 | /// |
| | 3871 | /// This function returns an item (\c Node, \c Arc or \c Edge) having |
| | 3872 | /// maximum value of the given graph map. |
| | 3873 | /// If the item set is empty, it returns \c INVALID. |
| | 3874 | /// |
| | 3875 | /// \param gr The graph for which the map is defined. |
| | 3876 | /// \param map The graph map. |
| | 3877 | /// \param comp Comparison function object. |
| | 3878 | template <typename GR, typename Map, typename Comp> |
| | 3879 | typename Map::Key mapMax(const GR& gr, const Map& map, const Comp& comp) { |
| | 3880 | typedef typename Map::Key Item; |
| | 3881 | typedef typename Map::Value Value; |
| | 3882 | typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
| | 3883 | |
| | 3884 | ItemIt max_item(gr); |
| | 3885 | if (max_item == INVALID) return INVALID; |
| | 3886 | Value max = map[max_item]; |
| | 3887 | for (ItemIt it(gr); it != INVALID; ++it) { |
| | 3888 | if (comp(max, map[it])) { |
| | 3889 | max = map[it]; |
| | 3890 | max_item = it; |
| | 3891 | } |
| | 3892 | } |
| | 3893 | return max_item; |
| | 3894 | } |
| | 3895 | |
| | 3896 | /// \brief Return the minimum value of a graph map. |
| | 3897 | /// |
| | 3898 | /// This function returns the minimum value of the given graph map. |
| | 3899 | /// The corresponding item set of the graph must not be empty. |
| | 3900 | /// |
| | 3901 | /// \param gr The graph for which the map is defined. |
| | 3902 | /// \param map The graph map. |
| | 3903 | template <typename GR, typename Map> |
| | 3904 | typename Map::Value mapMinValue(const GR& gr, const Map& map) { |
| | 3905 | return map[mapMin(gr, map, std::less<typename Map::Value>())]; |
| | 3906 | } |
| | 3907 | |
| | 3908 | /// \brief Return the minimum value of a graph map. |
| | 3909 | /// |
| | 3910 | /// This function returns the minimum value of the given graph map. |
| | 3911 | /// The corresponding item set of the graph must not be empty. |
| | 3912 | /// |
| | 3913 | /// \param gr The graph for which the map is defined. |
| | 3914 | /// \param map The graph map. |
| | 3915 | /// \param comp Comparison function object. |
| | 3916 | template <typename GR, typename Map, typename Comp> |
| | 3917 | typename Map::Value |
| | 3918 | mapMinValue(const GR& gr, const Map& map, const Comp& comp) { |
| | 3919 | return map[mapMin(gr, map, comp)]; |
| | 3920 | } |
| | 3921 | |
| | 3922 | /// \brief Return the maximum value of a graph map. |
| | 3923 | /// |
| | 3924 | /// This function returns the maximum value of the given graph map. |
| | 3925 | /// The corresponding item set of the graph must not be empty. |
| | 3926 | /// |
| | 3927 | /// \param gr The graph for which the map is defined. |
| | 3928 | /// \param map The graph map. |
| | 3929 | template <typename GR, typename Map> |
| | 3930 | typename Map::Value mapMaxValue(const GR& gr, const Map& map) { |
| | 3931 | return map[mapMax(gr, map, std::less<typename Map::Value>())]; |
| | 3932 | } |
| | 3933 | |
| | 3934 | /// \brief Return the maximum value of a graph map. |
| | 3935 | /// |
| | 3936 | /// This function returns the maximum value of the given graph map. |
| | 3937 | /// The corresponding item set of the graph must not be empty. |
| | 3938 | /// |
| | 3939 | /// \param gr The graph for which the map is defined. |
| | 3940 | /// \param map The graph map. |
| | 3941 | /// \param comp Comparison function object. |
| | 3942 | template <typename GR, typename Map, typename Comp> |
| | 3943 | typename Map::Value |
| | 3944 | mapMaxValue(const GR& gr, const Map& map, const Comp& comp) { |
| | 3945 | return map[mapMax(gr, map, comp)]; |
| | 3946 | } |
| | 3947 | |
| | 3948 | /// \brief Return an item having a specified value in a graph map. |
| | 3949 | /// |
| | 3950 | /// This function returns an item (\c Node, \c Arc or \c Edge) having |
| | 3951 | /// the specified assigned value in the given graph map. |
| | 3952 | /// If no such item exists, it returns \c INVALID. |
| | 3953 | /// |
| | 3954 | /// \param gr The graph for which the map is defined. |
| | 3955 | /// \param map The graph map. |
| | 3956 | /// \param val The value that have to be found. |
| | 3957 | template <typename GR, typename Map> |
| | 3958 | typename Map::Key |
| | 3959 | mapFind(const GR& gr, const Map& map, const typename Map::Value& val) { |
| | 3960 | typedef typename Map::Key Item; |
| | 3961 | typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
| | 3962 | |
| | 3963 | for (ItemIt it(gr); it != INVALID; ++it) { |
| | 3964 | if (map[it] == val) return it; |
| | 3965 | } |
| | 3966 | return INVALID; |
| | 3967 | } |
| | 3968 | |
| | 3969 | /// \brief Return an item having value for which a certain predicate is |
| | 3970 | /// true in a graph map. |
| | 3971 | /// |
| | 3972 | /// This function returns an item (\c Node, \c Arc or \c Edge) having |
| | 3973 | /// such assigned value for which the specified predicate is true |
| | 3974 | /// in the given graph map. |
| | 3975 | /// If no such item exists, it returns \c INVALID. |
| | 3976 | /// |
| | 3977 | /// \param gr The graph for which the map is defined. |
| | 3978 | /// \param map The graph map. |
| | 3979 | /// \param pred The predicate function object. |
| | 3980 | template <typename GR, typename Map, typename Pred> |
| | 3981 | typename Map::Key |
| | 3982 | mapFindIf(const GR& gr, const Map& map, const Pred& pred) { |
| | 3983 | typedef typename Map::Key Item; |
| | 3984 | typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
| | 3985 | |
| | 3986 | for (ItemIt it(gr); it != INVALID; ++it) { |
| | 3987 | if (pred(map[it])) return it; |
| | 3988 | } |
| | 3989 | return INVALID; |
| | 3990 | } |
| | 3991 | |
| | 3992 | /// \brief Return the number of items having a specified value in a |
| | 3993 | /// graph map. |
| | 3994 | /// |
| | 3995 | /// This function returns the number of items (\c Node, \c Arc or \c Edge) |
| | 3996 | /// having the specified assigned value in the given graph map. |
| | 3997 | /// |
| | 3998 | /// \param gr The graph for which the map is defined. |
| | 3999 | /// \param map The graph map. |
| | 4000 | /// \param val The value that have to be counted. |
| | 4001 | template <typename GR, typename Map> |
| | 4002 | int mapCount(const GR& gr, const Map& map, const typename Map::Value& val) { |
| | 4003 | typedef typename Map::Key Item; |
| | 4004 | typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
| | 4005 | |
| | 4006 | int cnt = 0; |
| | 4007 | for (ItemIt it(gr); it != INVALID; ++it) { |
| | 4008 | if (map[it] == val) ++cnt; |
| | 4009 | } |
| | 4010 | return cnt; |
| | 4011 | } |
| | 4012 | |
| | 4013 | /// \brief Return the number of items having values for which a certain |
| | 4014 | /// predicate is true in a graph map. |
| | 4015 | /// |
| | 4016 | /// This function returns the number of items (\c Node, \c Arc or \c Edge) |
| | 4017 | /// having such assigned values for which the specified predicate is true |
| | 4018 | /// in the given graph map. |
| | 4019 | /// |
| | 4020 | /// \param gr The graph for which the map is defined. |
| | 4021 | /// \param map The graph map. |
| | 4022 | /// \param pred The predicate function object. |
| | 4023 | template <typename GR, typename Map, typename Pred> |
| | 4024 | int mapCountIf(const GR& gr, const Map& map, const Pred& pred) { |
| | 4025 | typedef typename Map::Key Item; |
| | 4026 | typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
| | 4027 | |
| | 4028 | int cnt = 0; |
| | 4029 | for (ItemIt it(gr); it != INVALID; ++it) { |
| | 4030 | if (pred(map[it])) ++cnt; |
| | 4031 | } |
| | 4032 | return cnt; |
| | 4033 | } |
| | 4034 | |
| | 4035 | /// \brief Fill a graph map with a certain value. |
| | 4036 | /// |
| | 4037 | /// This function sets the specified value for all items (\c Node, |
| | 4038 | /// \c Arc or \c Edge) in the given graph map. |
| | 4039 | /// |
| | 4040 | /// \param gr The graph for which the map is defined. |
| | 4041 | /// \param map The graph map. It must conform to the |
| | 4042 | /// \ref concepts::WriteMap "WriteMap" concept. |
| | 4043 | /// \param val The value. |
| | 4044 | template <typename GR, typename Map> |
| | 4045 | void mapFill(const GR& gr, Map& map, const typename Map::Value& val) { |
| | 4046 | typedef typename Map::Key Item; |
| | 4047 | typedef typename ItemSetTraits<GR, Item>::ItemIt ItemIt; |
| | 4048 | |
| | 4049 | for (ItemIt it(gr); it != INVALID; ++it) { |
| | 4050 | map.set(it, val); |
| | 4051 | } |
| | 4052 | } |
| | 4053 | |