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