00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 #ifndef MLN_SET_SYM_DIFF_HH
00027 # define MLN_SET_SYM_DIFF_HH
00028
00032
00033 # include <algorithm>
00034 # include <iterator>
00035
00036 # include <mln/core/site_set/p_set.hh>
00037 # include <mln/convert/from_to.hh>
00038 # include <mln/util/ord.hh>
00039
00040
00041
00042 namespace mln
00043 {
00044
00045 template <typename P> class p_set;
00046
00047
00048 namespace set
00049 {
00050
00055 template <typename Sl, typename Sr>
00056 p_set<mln_site(Sl)>
00057 sym_diff(const Site_Set<Sl>& lhs, const Site_Set<Sr>& rhs);
00058
00059
00060 # ifndef MLN_INCLUDE_ONLY
00061
00062 template <typename Sl, typename Sr>
00063 inline
00064 p_set<mln_site(Sl)>
00065 sym_diff(const Site_Set<Sl>& lhs, const Site_Set<Sr>& rhs)
00066 {
00067 trace::entering("set::sym_diff");
00068
00069 typedef mln_site(Sl) P;
00070 mlc_converts_to(mln_psite(Sr), P)::check();
00071 std::set< P, util::ord<P> > sl, sr, sd;
00072 convert::from_to(lhs, sl);
00073 convert::from_to(rhs, sr);
00074 std::set_symmetric_difference(sl.begin(), sl.end(),
00075 sr.begin(), sr.end(),
00076 std::inserter(sd, sd.begin()),
00077 util::ord<P>());
00078 p_set<P> s;
00079 convert::from_to(sd, s);
00080
00081 trace::exiting("set::sym_diff");
00082 return s;
00083 }
00084
00085 # endif // ! MLN_INCLUDE_ONLY
00086
00087 }
00088
00089 }
00090
00091
00092 #endif // ! MLN_SET_SYM_DIFF_HH