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
00027 #ifndef MLN_CORE_CONCEPT_VALUE_SET_HH
00028 # define MLN_CORE_CONCEPT_VALUE_SET_HH
00029
00034 # include <mln/core/concept/value_iterator.hh>
00035
00036
00037 namespace mln
00038 {
00039
00040
00041 template <typename E> struct Value_Set;
00042
00043
00044 template <>
00045 struct Value_Set<void>
00046 {
00047 typedef Object<void> super;
00048 };
00049
00050
00056 template <typename E>
00057 struct Value_Set : public Object<E>
00058 {
00059 typedef Value_Set<void> category;
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074 protected:
00075 Value_Set();
00076 };
00077
00078
00079 template <typename E>
00080 std::ostream& operator<<(std::ostream& ostr, const Value_Set<E>& vs);
00081
00082
00083 # ifndef MLN_INCLUDE_ONLY
00084
00085 template <typename E>
00086 inline
00087 Value_Set<E>::Value_Set()
00088 {
00089 typedef mln_value(E) value;
00090 typedef mln_fwd_viter(E) fwd_viter;
00091 typedef mln_bkd_viter(E) bkd_viter;
00092
00093 bool (E::*m1)(const value&) const = & E::has;
00094 m1 = 0;
00095 value (E::*m2)(unsigned) const = & E::operator[];
00096 m2 = 0;
00097 unsigned (E::*m3)() const = & E::nvalues;
00098 m3 = 0;
00099 }
00100
00101 template <typename E>
00102 inline
00103 std::ostream& operator<<(std::ostream& ostr, const Value_Set<E>& vs_)
00104 {
00105 const E& vs = exact(vs_);
00106 ostr << "{ ";
00107 for (unsigned i = 0; i < vs.nvalues(); ++i)
00108 ostr << vs[i] << ' ';
00109 return ostr << '}';
00110 }
00111
00112 # endif // ! MLN_INCLUDE_ONLY
00113
00114 }
00115
00116
00117 #endif // ! MLN_CORE_CONCEPT_VALUE_SET_HH